PIC18 - Timer1 mit extra Quarz läuft nicht

Gast #2458318
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ß
Gast #2458544
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren