PIC12F675 Timer1 Pause


Closed Thread
Results 1 to 3 of 3

Hybrid View

  1. #1
    Join Date
    Apr 2008
    Posts
    5

    Default PIC12F675 Timer1 Pause

    Hello

    I want to measure a voltage from a sensor 0.5V to 4.5V
    and convert it to a specific pulse..

    12uS 12uS 12uS

    zero = 0.5V = ||____________________||_____________________||
    180uS 180uS


    12uS 12uS 12uS
    fullScale = 4.5V= ||_______________________________||_______________ _________________||
    342uS 342uS

    I want to use a pic12f675 at 20MHZ use the adc to read the voltage , and output repeatteadly a 12uS pulse to GPIO.2

    Time between pulses is is 180uS for zero (adc read 0.5V) and 342uS fulscale (adc read 4.5V)

    I have done it with the following code using a small delay routine in assembler.
    Code:
    ------------------------------------------------------------------------------------------------------
    @ DEVICE PIC12F675, HS_OSC, MCLR_OFF, PROTECT_ON, WDT_OFF,BOD_OFF
    DEFINE OSC 20           'cristal 20 Mhz 2x 22pf
    ADCON0 = 131 '000011 Set AN0 ON pino GPIO.0
    ANSEL = 101000 'set Fosc/64 'Cristal 20Mhz OBRIGA
    CMCON = 7 ' Comparators OFF
    TRISIO = �0001 ' GPIO.0 = Input outros output
    Define ADC_BITS 10 ' Set number of bits in result
    Define ADC_SAMPLEUS 30 ' Set sampling time in uS
    
    '*** Definir Pinos e Variaveis
    PULSO var GPIO.2
    GPIO = 0
    
    adval Var Word ' adval to store analog reading 0 to 1023 (102 to 920)
    Sensor var word ' adval minus offset (0 to 818)
    n var word
    Tempo var word
    Zero var word   'store (180us delay) minus instruccion time of adc lines
    
    pulso = 1
    Pause 100 ' da tempo para tudo acordar
    
    Zero = 16 ' 16uS added to the lines below equal 180us
    
    Ciclo:
    Pulso =0 'Inicio impulso negativo 12 uS
    pauseus 16
    PULSO = 1  'Fim impulso negativo 12 uS
        
        ADCIN 0, adval ' Read channel AN0 to adval
          If adval > 102 then
          Sensor =adval -102   'ofset 1024/10 = 102,4 +/- 0,5V sensor zero
         
         else
            sensor =1     ' overflow dá valores perto de 65000
         endif    
         ' Adval voltage 0,5 V 180 uS + Widht Sensor Zero
         ' Adval Voltage 4,5 V 340 uS + Widht Sensor Full scale
    
    pauseus zero ' 180 uS including above instruction time
    
    sensor = (sensor /4) +1 ' the assembler delay overflows if sensor = 0
    
    'sensor = 84  ' for testing
    
    '-------------
    Delay:    ' Adds the sensor reading to fixed 180uS delay
    
    @ nop
    @ decfsz _Sensor,F
    @ goto _Delay
    
    Goto Ciclo ' Do it forever
    
        
    End
    --------------------------------------------------------------------------------------------------------
    Problem is that i have small resolution
    the assembler delay is only 8bits (256 steps

    adval variable ranges 102 to 920
    sensor variable ranges 0 to 818
    sensor /4 ranges 0 to 204

    actualy only 204 steps
    My assembler knowledge is very limited. actualy i learned a little bit only for this project.
    I searched the web tried to have a 16bit delay routine in assembler but could not do it.


    I would like to rewrite everything to read analog pin then use timer1 and interrupt
    i never used interrupts i searched the web and the forum for examples and tried some code
    without sucess.

    As a newbie this what i think i have to do

    Cristal 20Mhz / 4 = 5Mhz clock = 0.2uS step. As sensor ranges from 0 to 818 . 818 * 0.2uS = 163.6 uS
    very close to 162 uS variation i want

    After reading the datasheet these are the registers i think i must tweak.

    set bits 6 and 7 of INTCON register
    clear PIR1 bit 0 = TMR1IF

    Set T1CON = �000001 ' to turn on timer1

    i think timer 1 counts up and i want to delay 1 to 818 clock cicles

    so i must preset timer1 to 65535 - sensor or (0 to 818)

    so sensor = 65535 - sensor
    TMR1H = Sensor.Highbyte
    TMR1L = Sensor.Lowbyte

    i realy do not understand how interrupts acts here

    i think i must

    read the adc in a loop

    load TMRH1 and TMR1L with the 64717 to 65535 value

    turn on timer1 ' T1CON = �000001

    then on IsR stop timer1,pause 180uS , output the 12uS pulse on gpio.2, clear interrupt flag

    I think somthing like this

    ------------------------------------------------------------------------------------------------
    Code:
    Sensor = 0
    INTCON = 0
    PIR1 = 0
    PIE1 = �000001
    
    
    ON INTERRUPT GOTO Isr
    
    
    
    Ciclo:
        ADCIN 0, adval
          If adval > 102 then
            Sensor = adval -102
          Else 
                Sensor =1
              Endif
             Sensor = 65535 - Sensor
             TMR1H = Sensor.HighByte
         TMR1L = Sensor.LowByte
         T1CON = �000001                     
    
        Goto Ciclo
    
    
    Isr:
    T1CON = 0
    
    pauseus 180
    GPIO.2 = 1
    pauseus 12
    GPIO.2 = 0
    PIR1 = 0
    RESUME
    
    ENABLE
    
    END
    ---------------------------------------------------------------------------------------------

    Can anyone point me the right direction ?

    Thanks

    Fernando Carvalho
    Last edited by Archangel; - 25th November 2011 at 03:15. Reason: code tags

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default Re: PIC12F675 Timer1 Pause

    Code:
    define adc_bits 10
    ansel = 000001
    adcon0.7 = 1
    For some reason the text is being made lower case when the code was typed in upper case??
    Last edited by mackrackit; - 23rd November 2011 at 20:32. Reason: Editor problems

  3. #3
    Join Date
    Apr 2008
    Posts
    5


    Did you find this post helpful? Yes | No

    Default Re: PIC12F675 Timer1 Pause

    Hello Macrackit

    I do not understand how your anwser is related to my doubts.

    Please clarify

    Thanks

    Fernando Carvalho

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts