Selbstverständlich mußt du in der Überlauf-ISR das Zählregister des Timers wieder mit dem errechneten Startwert laden. Aber das weißt du ja sicher alles. Vielleicht solltest du uns noch dein Testprogramm zeigen.
Selbstverständlich mußt du in der Überlauf-ISR das Zählregister des Timers wieder mit dem errechneten Startwert laden. Aber das weißt du ja sicher alles. Vielleicht solltest du uns noch dein Testprogramm zeigen.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
So hier ein Auschnitt aus meinen Code, ich hab eine LED Matrix:
Ich benutze den 8Bit Timer um die LED Matrix zu multiplexen und den 16Bit Timer um das Bild umzuschalten. Ich denke das wird der wichtige Teil sein. Davor wird nur der ml_write buffer befüllt, so dass alle LEDs brennen und es wird eine Endlosschleife durchlaufen.Code:#if F_CPU == 1000000 # define PRESCALER (1 << CS10) | (1 << CS11) #elif F_CPU == 16000000 # define PRESCALER (1 << CS12) | (1 << CS10) #endif /* ... */ ISR(TIMER0_OVF_vect) { ml_plex(); px_send(); } ISR(TIMER1_OVF_vect) { TCNT1 = 49911; // 65536 - 15625 ml_write [0] = ~(ml_write[0]); ml_write [1] = ~(ml_write[1]); ml_write [2] = ~(ml_write[2]); ml_swap = 1; } void init(void) { TCCR0 |= (1 << CS01); TCCR1B |= PRESCALER; TCNT1 = 49911; // 65536 - 15625 TIMSK |= (1 << TOIE1) | (1 << TOIE0); sei( ); }
Wenn die Rechnung stimmt muss der Fehler ja irgendwo im Programm liegen oder?
EDIT1: Es sind eher gefühlte 2 Sekunden wie 3, aber definitiv länger als 1 Sekunde
Hier noch ein kleines Video vom Testaufbau. Dann könnt ihr euch von der Zeit selbst ein Bild machen.
PS: Sry für die Quali, die Kamera vom Galaxy S schafft wohl die kurze Entfernung nicht.
In deiner Timer 1 ISR lädst du 49911 in das Timer Register. Ich weiß jetzt nicht welchen Controller du hast aber ich meine bei allen AVRs wären die Timerregister nur 8bit breit. D.h. du musst die 49911 in High und Low aufteilen und in das High bzw. Low Register schreiben. Du kannst keine 49911 in ein 8bit Register quetschen.
Ich denke das sollte das Problem lösen.
Das wusste ich nicht. Ok, wie teile ich die Zahl denn Richtig auf? Einfach abschneiden?
Code:49911 ==> 1100 0010 1111 0111 Also ist: High = 1100 0010 => 194 Low = 1111 0111 => 247
Jop genau.
Das mit der 16bit Zahl in einem Timerregister kann schon deswegen nicht funktionieren weil die AVRs alle 8bit Prozessoren sind. Und über einen 8bit Datenbus kannst du keinen 16bit Timerwert schicken
Deswegen musst du die Zahl aufteilen. Und das macht man so wie du gesagt hast.
Und ich glaube du musst das Timer High Register als erstes beschreiben und dann das Low Register.
Ok, vielen Dank euch, jetzt könnte eine Sekunde hinkommen!
PS: Ich würde das Thema jetzt als Gelöst Markieren, kann aber nicht herausfinden wie das geht .. können das nur Admins?
Nein das kannst du auch machen. Musst du mal gucken indem du auf "Bearbeiten" klickst. Kann dir selber nicht genau sagen wie das geht.
Und die 1 Sekunde kannst du am besten mit einer Stoppuhr oder einer Digital Uhr mit Sekundenanzeige nachprüfen![]()
Lesezeichen