Ja, aber die Timervorgabe stimmt dann auch nicht mehr.
Wieviel schneller soll der Takt denn sein? Ist es nicht einfacher 20 Takte von der Timervorgabe abzuziehen?
wie das? wenn du angenommen 20 takte bräuchtest, um den irq aufzurufen, dann sind die 20 takte mit einem schnelleren takt viel schneller abgearbeitet, oder?
Ja, aber die Timervorgabe stimmt dann auch nicht mehr.
Wieviel schneller soll der Takt denn sein? Ist es nicht einfacher 20 Takte von der Timervorgabe abzuziehen?
Na das beim ändern der Taktfrequenz die timerwerte geändert werden müssen dürfte ja wohl klar sein, oder?
irgendwo habe ich mal gelesen, wieviel takte Bascom braucht, um einen irq aufzurufen, ich glaube es waren 12 oder so. aber bei 16mhz stelle ich mit vor das das ziemlich lange dauern dürfte bis man die abweichung reel messen kann...
Naja, ich habe aber ja 1 Mhz. Wenn er pro Sekunde 12 Takte abweicht, wären dass in 5min: 300 * 12 = 3600 Takte, naja gut - das sind noch nicht die 2 Sekunden ;-(
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Nimm doch einfach einen anderen Wert für Timervorgabe.
Änder den Wert etwa (+- ein paar hundert um zu sehen was passiert) und wenn du meinst jetzt läuft sie relativ genau, lass die Uhr eine Stunde laufen und überprüfe wie groß die Abweichung dan ist.
Das hab ich schon gemachtNur ich dachte vielleicht gibt es eine elegantere Lösung
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Hallo die elegantere Lösung hat Dir schon der Sprinter genannt :
Gruß SebastianDu betreibst Timer1 besser in einem anderen Modus:
Clear Timer on Compare Match und bedienst nicht den Overflow-Interrupt, sondern den Compare Match Interrupt.
Dadurch übernimmt die Hardware das Neusetzen von Timer 1 und nicht wie in deinem Beispiel die Software.
Du verbrätst ja Zeit, bis du nach dem Interrupt wirklich dein Timer1-Wert neu schreibst.
Ja, hab noch nie von gehört oder so - hätte jemand Beispiel-Code?
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
So würde es in C aussehen, ein paar defines fehlen, die aber selbsterklärend sind. Übersetzen nach BASIC verbleibt als Hausaufgabe
Code:void timer1_init() { #if defined (__AVR_AT90S2313__) // Timer1 ist Zähler TCCR1A = 0; // Timer1 läuft mit voller MCU clock TCCR1B = _BV (CS10) | _BV (CTC1); #elif defined (__AVR_ATmega8__) // Mode #4 für Timer1 (Manual S. 97) // und volle MCU clock TCCR1A = 0; TCCR1B = _BV (WGM12) | _BV (CS10); #else #error Dont know how to setup timer1 #endif // PoutputCompare für gewünschte Timer1 Frequenz OCR1A = (unsigned short) ((unsigned long) F_CPU / INTERRUPTS_PER_SECOND-1); // OutputCompare-Interrupt für Timer 1 TIMSK |= _BV (OCIE1A); } SIGNAL (SIG_OUTPUT_COMPARE1A) { }
Disclaimer: none. Sue me.
Na da hab ich ja was vor mir (hab keine Ahnung von C)Zitat von SprinterSB
Ich glaube aber, ich lasse den Code so, denn ich habe eben ein 7,3728 Quarz eingebaut um den AVR extern zu takten. Jetzt geht die Uhr so genau, dass man auf 5min keine Abweichungen "sehen" kann. Das reicht für meine Zwecke ja aus
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Lesezeichen