PIC: Wie man Timer0 so einstellt, dass er alle 1 Sekunde einen Interrupt gibt?

Ich programmiere einen PIC18F67K22 und habe ihn so eingestellt, dass er einen internen 16X4-MHz-RC-Oszillator mit aktivierter PLL verwendet.

  • High-Level-Interrupt bei TIMER0Überlauf
  • Ich verwende den MCC18-Compiler.

Wie kann man also einstellen TIMER0, dass jede Sekunde ein Interrupt gegeben wird?

Geben Sie ihm eine Periode, die etwas größer als 1 s ist, und verwenden Sie dann CTC, um ihn auf 1 s abzustimmen.
Ich verstehe nicht, was Sie sagen. Können Sie das bitte kurz erklären?
Verstehen Sie überhaupt, wie die Timer-Module funktionieren?

Antworten (1)

Das TIMER0ist ein 16-Bit-Timer. Um also alle 1 Sekunde zu unterbrechen, müssen Sie Folgendes einstellen:

  • Prescaler @ 16

  • TMR0-Vorspannung bei 3036

Die gleichung:

T = ( 4 F Ö s c ) P r e s c ( R e s Ö l u t ich Ö n P r e l Ö a d )

Woher:

  • T = Periode = 1s
  • Fosc = Oszillatorfrequenz = 4 MHz
  • Presc = Prescaler = 16
  • Auflösung = 2 16 = 65535
  • Vorladung = 3036

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
Ich wollte Sie nur wissen lassen, dass ein anonymer Benutzer einen Kommentar bezüglich der Einstellung T0CON.PSA = 0anstelle 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.