Forum: Mikrocontroller und Digitale Elektronik Uhrzeit geht nach ...


von Matthias (Gast)


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

von Frankl (Gast)


Lesenswert?

Hast Du das Programm schon mal im AVR Studio laufen lassen ?. Da findet
man Zeitfehler recht schnell.

von Peter D. (peda)


Lesenswert?

Ich tippe auf einen Softwarefehler.
Aber ohne Programm kann man nichts weiter dazu sagen.

Lade es doch mal in den Simulator und lasse Dir die Zyklenzahl
ausgeben, bis der Sekundenzähler eins weiter ist. Sind das wirklich
immer 1000.000 Zyklen ?


Peter

von Matthias (Gast)


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

von Peter D. (peda)


Lesenswert?

Ich nehme mal an, das sind 8Bit Register, also mußt Du schreiben:

TMR1H = 0xBDB >> 8;
TMR1L = 0xBDB & 0xFF;


Peter

von Matthias (Gast)


Lesenswert?

Boa, ich weiß zwar nicht worin hier der Sinn liegt, aber es
funktioniert!!!

Nochmals vielen Dank!

Matthias

von Steffen (Gast)


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

von Steffen (Gast)


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

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.