Uhrzeit geht nach ...

Gast #94346
Lesenswert?

Tag zusammen,

folgendes Problem:

Ich nehme den Timer 1 mit 16 Bit.
Die Taktfrequenz meines Pic`s ist 4MHz.
Also stehen dem Timer 4MHz / 4 = 1MHz zur verfügung.
Mit Prescaler = 8 dann 125KHz.
Daraus folgt dann eine Periodendauer 1/f = T = 8us.

Wenn ich den Timer dann 62500 incrementieren lasse (also Startwert auf
3035 setze, sollten doch 500ms rauskommen!

Es scheint aber so, als ob er länger braucht! Denn meine Uhr geht nach!
Ca. 1s pro Minuten!

Noch kurz was zu meiner Programmierung:

Wenn der Timer überläuft zähle ich in der Interruptrutine eine globale
Variable hoch. Diese frage ich dann in meinem Main Programm ständig ab.
Wenn die Variable den Wert 2 hat (2 * 500ms = 1s), erhöhe sich die
Sekundenanzeige um 1.

Kann mir bitte einer sagen, wo mein Fehler ist? Ich dreh hier noch
durch!

Danke
Matthias
Gast #94349
Lesenswert?

So wie es aussieht nimmt der Timer meinen Startwert nicht an. Er läuft
immer ganz durch (0-65534). Auch wenn ich als Startwert einen viel
höheren Wert nehme. Sprich, ich kann in 'TMR1L' schreiben was ich
will, er läuft immer ganz durch.

Hier meine Int. Rutine:

int_save_registers
TMR1ON = 0;                 //TMR 1 stopp
TMR1IE = 0;                 //Int aus
TMR1IF = 0;                 //Int Flag löschen
z1++;                       //Glob. Var.1 ++
z2++;                       //Glob. Var.2 ++
TMR1H = 0;
TMR1L = 0xBDB;              //Startwert 3035 dez. für 500ms
TMR1ON = 1;                 //TMR 1 start
TMR1IE = 1;                 //Int an
int_restore_registers

Matthias
Gast #94352
Lesenswert?

Wie Peter schon schrieb, TMR1H und TMR1L sind die beiden 8-Bit Werte des
16 Bit Timers.

Wenn Du die einzeln laden willst, dann geht das so:

TMR1H = 0xB;   // High Teil
TMR1L = 0xDB;  // Low Teil

So sollte es aber auch funktionieren:

TMR1 = 0xBDB;

TMR1 ist dann der 16-Bit Wert. Kann sein, dass Du TMR1 erst per #define
deklarieren musst.

Steffen
Gast #94353
Lesenswert?

Wie Peter schon schrieb, TMR1H und TMR1L sind die beiden 8-Bit Teile des
16 Bit Timers.

Wenn Du die einzeln laden willst, dann geht das so:

TMR1H = 0xB;   // High Teil
TMR1L = 0xDB;  // Low Teil

So sollte es aber auch funktionieren:

TMR1 = 0xBDB;

TMR1 ist dann der 16-Bit Wert. Kann sein, dass Du TMR1 erst per #define
deklarieren musst.

Steffen

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