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
Hast Du das Programm schon mal im AVR Studio laufen lassen ?. Da findet man Zeitfehler recht schnell.
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
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
Ich nehme mal an, das sind 8Bit Register, also mußt Du schreiben: TMR1H = 0xBDB >> 8; TMR1L = 0xBDB & 0xFF; Peter
Boa, ich weiß zwar nicht worin hier der Sinn liegt, aber es funktioniert!!! Nochmals vielen Dank! Matthias
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.