Ich programmiere einen PIC18F67K22 und habe ihn so eingestellt, dass er einen internen 16X4-MHz-RC-Oszillator mit aktivierter PLL verwendet.
TIMER0
ÜberlaufWie kann man also einstellen TIMER0
, dass jede Sekunde ein Interrupt gegeben wird?
Das TIMER0
ist ein 16-Bit-Timer. Um also alle 1 Sekunde zu unterbrechen, müssen Sie Folgendes einstellen:
Prescaler @ 16
TMR0-Vorspannung bei 3036
Die gleichung:
Woher:
Beispielcode:
// Timer0 Registers:16-Bit Mode; Prescaler=1:16; TMRH Preset=$BD;
// TMRL Preset=$DC; Freq=1,00Hz; Period=1,00 s
T0CON.TMR0ON = 1; // Timer0 On/Off Control bit: 1=Enables Timer0 / 0=Stops Timer0
T0CON.T08BIT = 0; // Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
T0CON.T0CS = 0; // TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
T0CON.T0SE = 0; // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
T0CON.PSA = 0; // Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
T0CON.T0PS2 = 0; // bits 2-0 PS2:PS0: Prescaler Select bits
T0CON.T0PS1 = 1;
T0CON.T0PS0 = 1;
TMR0H = $BD; // preset for Timer0 MSB register
TMR0L = $DC; // preset for Timer0 LSB register
T0CON.PSA = 0
anstelle von hatte T0CON.PSA = 1
. Sie haben versucht, Ihre Antwort zu bearbeiten, anstatt einen Kommentar zu posten, um Sie auf das Problem aufmerksam zu machen, was abgelehnt wurde. Ihr Kommentar war der folgende, falls Sie nicht auf den obigen Link zugreifen können:PSA must be zero for the prescaler to be considered. This code functions improperly when this bit is set to 1.
Ignacio Vazquez-Abrams
Shail Korat
Connor Wolf