I want to use the timer1 of the PIC18f4431 to increment every instruction cycle. I wrote a function to do this and simulated using pic18 simulator IDE but I am not seeing the TMRL register increment. Please take a look at my code and correct me.
Code:
void timer1_init(){
T1CON.RD16 = 0; // enable register read/write of TIMER1 in two 8-bit operations
T1CON.T1RUN = 0; // system clock is derived from another source
T1CON.T1CKPS1 = 0; // ##increments with 1:1 prescale value
T1CON.T1CKPS0 = 0; // ##
T1CON.T1OSCEN = 0; // TIMER1 oscillator is shut-off
T1CON.TMR1CS = 0; // enable TIMER1
T1CON.TMR1ON = 1; // TIMER1 uses internal clock (FOSC/4)
TMR1L = 0; // clear TIMER1 lower register
}
I'm no programmer and I'm sorry this doesn't solve your problem, but I'm curious as to whether those two comments are the right way round? Intuitively, TMR1CS is the Clock-Select bit.
Hi everyone thankyou for all your replies. I tried the code in proteus and it works fine. The problem was not with the code but was in the PIC18 simulator IDE.
@Ian, this is written in mikroc pro for pic.
@alec_t, yes the two comments have to be swaped
I have another problem though and that is the register read/write of TImer1 in one 16-bit operation.
At the moment I have set T1CON.RD16 = 1; and reading the timer1 value as
The problem with the 8 bit reads it that if timer1 rolls over after the first instruction then your 16 bit value will be out by 256 counts. With RD16=1, the way you are doing it is correct.
Note, you don't need 3 variables, you can simply do,