PDA

View Full Version : PIC12F675 Timer1 Pause



Fernando
- 23rd November 2011, 19:34
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.


------------------------------------------------------------------------------------------------------
@ 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

------------------------------------------------------------------------------------------------


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

mackrackit
- 23rd November 2011, 20:27
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??

Fernando
- 25th November 2011, 17:12
Hello Macrackit

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

Please clarify

Thanks

Fernando Carvalho