mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frankl (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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

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


Peter

Autor: Matthias (Gast)
Datum:

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

Nochmals vielen Dank!

Matthias

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.