Forum: Mikrocontroller und Digitale Elektronik PIC18 - Timer1 mit extra Quarz läuft nicht


von Marco (Gast)


Lesenswert?

Hallo,

ich versuche gerade den Timer1 in einem PIC18F2685 so zum laufen zu 
bekommen, dass er mir im Sekundenintervall einen Interrupt generiert. 
Also extern einen 3276,8 kHz dran gehängt (ja, DEN Wert, nicht den 
üblichen 32,768kHz da ich davon gerade keinen da habe).
Als normaler "System"quarz dient ein 10MHz mit PLL aktiviert.

Ich habe dann folgenden Code genommen:
1
//Interrupt + Einstellung Timer1 zuständig für die Uhr
2
PIE1bits.TMR1IE = 1;  //Timer1-Interrupt erlauben
3
PIR1bits.TMR1IF = 0;
4
T1CONbits.T1CKPS1 = 1;   // bits 5-4  Prescaler Rate Select bits
5
T1CONbits.T1CKPS0 = 1;   // bit 4
6
T1CONbits.T1SYNC = 1;    // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
7
T1CONbits.TMR1CS = 0;    // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
8
T1CONbits.TMR1ON = 1;    // bit 0 enables timer
Damit bekomme ich einen Interrupt alle 52,425ms, eine Änderung der Werte 
in den Registern TMR1L/TMR1H bewirkt garnichts und wenn ich auf den 
extra Quarz wechseln will indem ich
1
T1CONbits.TMR1CS = 0;
auf 1 setze, dann gibts es keinen Interrupt mehr.

Daher nun meine Frage: Was mache ich da falsch bzw. wie muss es sein, 
damit es geht?

Gruß

von ...-. (Gast)


Lesenswert?

der Oszillator des Timer1 ist auf minimalen Stromverbrauch optimiert und 
läuft deswegen nur mit 32768 kHz

von Chris (Gast)


Lesenswert?

T1OSCEN scheinst du vergessen zu haben, dazu muss aber TMR1CS = 1 sein.
Kann funktionieren, garantiert wird es nur bis 200Khz.

Ansonsten zählst du die Überläufe, mit einem Präscaler auf 1:1 unt 
internem
Takt zählst du bei jedem Überlauf einen uint32_t um 28147497.5 hoch.
Dann hast du einen 1Sek Interrupt bei Carry nach der Addition mit einem
maximalen Fehler von 6.5535ms jedoch keinen kummulativen Fehler.
0.5 zählst du so hoch, daß du ein Flag (1bit) verwendest was du jedesmal 
invertierst. Wenn das Flag gesetzt ist, zählst du 28147498 dazu und 
löscht
das Flag, ansonsten zählst du 28147497 hoch und setzt das Flag.

Bei einem 8bit Timer kann man den worst case Fehler noch weiter 
reduzieren.
Deshalb verwendet man für solche Sachen gerne den Timer0.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.