PIC-Timer

... komplette Frage anzeigen

1 Antwort

Hallo.

Da ich normalerweise nicht mit PIC- sonder mit anderen Controllern arbeite, könnte meine Antwort auch nicht richtig sein, aber ich habe mir gerade das Datenblatt des PIC angeschaut:

32,768kHz Uhrenquarz

Dazu muss man das "CONFIG1-Register" ändern, welches mit dem Programmiergerät geändert wird: Die unteren 3 Bits müssen in den "LP"-Modus (Wert 000) gesetzt werden.

Wie man das CONFIG1-Register ändert, kann ich dir leider nicht sagen. Wenn man dabei aber einen Fehler macht, kann man den Chip eventuell nicht mehr programmieren, da sich auch die Kontrollbits fürs Programmieren in diesem Register befinden.

Sofern ich das Datenblatt richtig verstehe, läuft der Controller dann mit 32,768kHz.

OSC1 und OSC2

Sofern ich das Datenblatt richtig verstehe, hätte man den Uhrenquarz auch an Pins T1OSO und T1OSI anschließen können. Dann hätte man den Microcontroller mit 8 MHz betreiben können und den Timer mit 32,768kHz.

So, wie du es jetzt gemacht hast, läuft der Microcontroller nur mit 32,768kHz und der Timer sogar nur mit 8,192kHz, da dieser - wenn ich es richtig verstehe - nur 1/4 der Frequenz des Microcontrollers verwendet.

mit welchen man über einen Timer eine Sekunde bekommen sollte

Ich selbst würde Timer 1 nehmen. Im Gegensatz zu TImer 0 ist dies ein 16-Bit-Timer, der also weiter als nur bis 256 zählen kann.

Um den Timer zu aktivieren, würde ich den Wert 0x35 (also hexadezimal 35) in das T1CON-Register schreiben. Der Timer sollte in dieser Einstellung mit 1024Hz nach oben zählen (möglicherweise auch mit 256, 512, 2048 oder 4096 Hz - da müsste ich das Datenblatt genauer lesen). Das bedeutet, dass das TMR1H-Register mit 4Hz (bzw. 1, 2, 8 oder 16 Hz) nach oben zählt.

Ich würde folgenden Code in meine "main"-Endlosschleife einbauen, wobei ich leider nicht weiß, welche Programmiersprache du benutzt bzw. wie die genaue Syntax bei PIC-Controllern ist, so dass du den Code noch anpassen müsstest:

thistime = TMR1H;
if((nexttime-thistime)&0x80)
{
    // Dieser Code wird alle 5 Sek. aufgerufen
    ...
    nexttime+= 5*4; // bzw. 5, 5*2, 5*8 oder 5*16
}

"nexttime" ist dabei eine globale Variable, "thistime" kann eine lokale Variable sein. Bei der Initialisierung (also vor der Endlosschleife) würde man die Variable "nexttime" auf den denn aktuellen Wert von TMR1H setzen.

Die Bedingung "(nexttime-thistime)&0x80" in der if-Verzweigung ist übrigens (fast) gleichbedeutend mit "(nexttime-thistime)<0", also "nexttime<thistime". Allerdings wird bei dieser Schreibweise der Überlauf bei einem 8-Bit-Wert berücksichtigt.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?