Uhrzeit geht nach ...

Gast #94346
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
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
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.