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?
Druckbare Version
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
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 gemacht ;) Nur ich dachte vielleicht gibt es eine elegantere Lösung :)
Gruß, Björn
Hallo die elegantere Lösung hat Dir schon der Sprinter genannt :
Gruß SebastianZitat:
Du 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
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)
{
}
Na da hab ich ja was vor mir (hab keine Ahnung von C) :DZitat:
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