PDA

View Full Version : Time Period of Timer1



arnol34
- 3rd May 2007, 12:45
I am new to the Pic world.

Here is what I am trying to do. I want to program a RTTY Ham transmitter using a FT18F2620 driving an AH 9834 DDS... But one big problem I had not been able to solve. The length of the timer1 interrupt. I need 22 MS . I am using D. Taylor's code to load the offset value into the timer.. The value computes out to 10541 at 1:2 prescaler... which is $292B

bcf T1CON,TMR1ON ; Turn off timer
movlw LOW(Timerset) ; 1 instruction cycle
addwf TMR1L,F ; 1 instruction cycle
movlw HIGH(Timerset) ; 1 instruction cycle
addwfc TMR1H,F ; 1 instruction cycle
bsf T1CON,TMR1ON ; 1 instruction cycle - Turn TIMER1 back on

The timer runs at its own speed. I can't seem to change the duration . The settings are shown below I have re-read the spec sheet a good many times.. I have tried settings from 0 to 65000.... It always interrupts at the same time duration...

Timerset = $292B ' 22 ms with prescale of 1:2 dec 10541
T1CON = 0 ' ZERO OUT THE TIMER REG
T1CON.5 = 0 'Prescale 00 = 1:1, 01 = 1:2
T1CON.4 = 1 ' 10 = 1:4 , 11 == 1:8
T1CON.0 = 0 'timer on = 1 timer off = 0
TMR1H = $29 'Timer1 set to 22ms
TMR1L = $2B 'Timer1 set to 22ms
RCON.7 = 1 'Enable priority levels on interrupts (IPEN)
TMR1IE VAR PIE1.0 'Enabel timer interrupt. (TMR1IE0)
TMR1IF VAR PIR1.0 'interrut flag bit (TMR1IF)
TMR1IE = 1 'enable timer
IPR1.0 = 1 'Timer1 interrupt priority high (TMR1IP)
PIE1.0 = 1 'Timer1 interrupt enable (TMR1IE)

I have a second interrupt handler for the keyboard to load an input buffer. That appears to be working well... I set it at low priority and the timer one to high priority.

I hope someone can tell me where I have gone wrong...I just can't change the time between interrupt. the timer has selected some value, and won't change... HELP!!!

Jack W0KPH

My Thanks to Joe Rocci for the hardward....

skimask
- 3rd May 2007, 15:00
Let's see all the code...
Are you resetting the interrupt flags when you go to process the interrupt itself? They don't reset themselves...

khaynes
- 3rd May 2007, 16:19
Hello,

I think the following code is not doing what you expect.

Timerset = $292B ' 22 ms with prescale of 1:2 dec 10541
The above line looks like it is setting the value of a variable.

movlw LOW(Timerset) ; 1 instruction cycle
This line takes the address of the variable in ram, it does not use its value.

addwf TMR1L,F ; 1 instruction cycle
movlw HIGH(Timerset) ; 1 instruction cycle
addwfc TMR1H,F ; 1 instruction cycle

If you never change the timeout value, you could change to something like
TIMERSET EQU $292B
and the movlw LOW(TIMERSET) will work.

If you want to change the timeout value at runtime
use something like

movfw TimerSet+1 ; Get the low byte of TimerSet variable
addwf TMR1L, F
movfw TimerSet ; Get the high byte of TimerSet variable
addwfc TMR1H, F

Keith

arnol34
- 4th May 2007, 00:31
Keith, you hit the nail on the head , thank you. It works. I had all the rest of the code going except the timer. I got it going using The Timerset as a constant, and that did it. I now have a RTTY Teletype.

I still would like the time to be a variable so I could tune it a bit, but my assembler does not know about movwf. it will assemble movfw, so now to figure that one out....

I have not programmed assembler for many years. I first learned FAP(fortran assembler program) in 1964.. Just beginning to get good at it, and they made me manager of the department... So back to study and thank you so much

Jack W0KPH