In this example, I've set TMR1 to 10Hz, Timer2 to 100Hz and Timer0 to 1000Hz.
Simulation on Proteus gives correct frequencies for Timer1&2 but always give something like 7.220 Hz for Timer0, regardless of what I put in the prescaler
What can be wrong in this code ? PortD pins are connected to a kind of frequency-meter.
Code: Select all
program Interrupt_Test;
var
Cnt1, Cnt2 : Integer;
procedure interrupt;
begin
If (INTCON.TMR0IF) then // Interrupt from Timer0
Begin
INTCON.TMR0IF := 0;
INTCON.TMR0IE := 1;
TMR0 := 6;
SetBit(PortD,3);
End;
If (PIR1.TMR1IF) then // Interrupt from Timer1
Begin
Inc(cnt1);
PIR1.TMR1IF := 0;
TMR1H := $3C;
TMR1L := $B0;
SetBit(PortD,1);
End;
If (PIR1.TMR2IF) then // Interrupt from Timer2
Begin
Inc(cnt2);
PR2 := 250;
PIR1.TMR2IF := 0;
SetBit(PortD,2);
End;
ClearBit(PortD,2);
ClearBit(PortD,3);
ClearBit(PortD,1);
end;
begin
// Timer0 Registers: Prescaler=1:8; TMR0 Preset=6; Freq=1 000,00Hz; Period=1 000,00 µs
OPTION_REG.T0CS := 0; // bit 5 TMR0 Clock Source Select bit:0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
OPTION_REG.T0SE := 0; // bit 4 TMR0 Source Edge Select bit: 0=low/high / 1=high/low
OPTION_REG.PSA := 1; // bit 3 Prescaler Assignment bit: 0=Prescaler is assigned to the WDT
OPTION_REG.PS2 := 0; // bits 2-0 PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 := 1;
OPTION_REG.PS0 := 0;
TMR0 := 6; // preset for timer register
// Timer1 Registers: Prescaler=1:8; TMR1 Preset=3036; Freq=10,00Hz; Period=100,00 ms
T1CON.T1CKPS1 := 1; // bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS0 := 0; // bit 4
T1CON.T1OSCEN := 1; // bit 3 Timer1 Oscillator Enable Control: bit 1=on
T1CON.T1SYNC := 1; // bit 2 Timer1 External Clock Input Synchronization Control bit:1=Do not synchronize external clock input
T1CON.TMR1CS := 0; // bit 1 Timer1 Clock Source Select bit:0=Internal clock (FOSC/4) / 1 = External clock from pin T1CKI (on the rising edge)
T1CON.TMR1ON := 1; // bit 0 enables timer
TMR1H := $3C; // preset for timer1 MSB register
TMR1L := $B0; // preset for timer1 LSB register
// Timer2 Registers: Prescaler=1:16; TMR2 PostScaler=1:5; PR2=250 - Freq = 100,00Hz - Period = 10,00 ms
T2CON := %00100110;
PR2 := 250; // PR2 (Timer2 Match value)
PIE1.TMR1IE := 1; // enable Timer1 interrupt
PIE1.TMR2IE := 1; // enable Timer2 interrupt
INTCON.TMR0IE := 1; // enable TMRO interrupt
ADCON0 := %00000011;
TrisA := %00000001;
TrisB := %00000001;
PortB := 0;
TRISD := 0;
PORTD := %00000000;
Cnt1 := 0;
Cnt2 := 0;
INTCON.GIE := 1;
INTCON.PEIE := 1;
SetBit(PortD,7);
while TRUE do
begin
end;
End.
Schematic :
Thanks in advance for any help.