Gast
#2654678
hallo.
ich hab ein problem mit dem timer0 interrupt - der reload scheint nicht
richtig zu funktionieren.
folgende voraussetzungen:
externer quarz mit 8MHz, config auf "HSPLL" - die pll ist somit
aktiviert.
die interne frequenz beträgt somit 8MHz.
compiler = microchip mcc18
der timer0 wird folgendermaßen initialisiert:
T0CONbits.T08BIT = 0; // timer is used in 16bit mode
T0CONbits.T0CS = 0; // clock source is internal cpu
frequency
T0CONbits.T0SE = 0; // low to high edge
T0CONbits.PSA = 1; // don't use the prescaler
T0CONbits.T0PS2 = 0; // prescaler value = 2 (not used)
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS0 = 0;
TMR0H = 0xFD; // set the interrupt period
TMR0L = 0xC0;
INTCONbits.TMR0IF = 0; // clear the timer 0 Interrupt
INTCONbits.TMR0IE = 1; // enable timer0 interrupt
T0CONbits.TMR0ON = 1; // enable timer 0
in der ISR wird der timer0 folgendermaßen behandelt:
if( INTCONbits.TMR0IF && INTCONbits.TMR0IE )
{
TMR0H = T0VALUE_H;
TMR0L = T0VALUE_L;
INTCONbits.TMR0IF = 0;
}
d.h. das H byte wird vor dem L byte gesetzt. dann wird das IF flag
zurückgesetzt.
das problem ist jetzt: der timer läuft etwas langsamer als gewollt.
soll = interrupt alle 104us
ist = interrupt alle 134us
bei der simulation in MPLAB ist mir aufgefallen, dass TMR0H nicht
beschrieben wird (überprüft durch nachheriges auslesen von TMR0L und
TMR0H).
danke für eure hilfe!
hannes