Gast
#4466021
Hallo,
folgender Sachverhalt:
Ich nutze den Timer1 des Atmega128 als Counter (Counter1). Dieser zählt
externe Impulse (ca. 1-2Khz). Wenn ein gewisser Schwellwert erreicht ist
(z.b. 20), so wird der TIMER1_COMPA_vect Interrupt ausgelöst, der
wiederum eine Variable X hochzählt (bzw. runterzählt).
Dann nutze ich die Int2 und Int3 Eingänge als externe Interrupts. Diese
dienen dazu, die Zählrichtung zu ändern. Sprich: Int2 sorgt dafür, dass
die Variable X hochgezählt wird, Int3 sorgt dafür, dass die Variable X
runtergezählt wird.
Das alles funktioniert auch problemlos.
Jedoch ergibt sich beim Zählrichtungswechsel eine Verfälschung der
Ergebnisse. Folgende Ausgangssituation: Die Variable X wird hochgezählt,
der Counter1 Zählerstand ist z.b. gerade bei 18. Der Interrupt soll bei
20 auslösen und damit die Variable X incrementieren. Nun kommt Int3, so
dass die Variable X von nun an runter gezählt werden soll. Da der
Counter1 seine Zählrichtung nicht ändern kann, zählt er also beim
nächsten einkommenden Impuls auf 19, dann 20 und löst den interrupt aus,
der die Variable X um 1 dekrementiert. Jedoch soll die Variable X erst
nach 18 Impulsen decrementiert werden, da die 18 Impulse ja zuvor
hochgezählt wurden.
Meine Lösung wäre folgende: Bei Int3 weise ich dem Vergleichsregister
OCR1A den wert von TCNT1 zu und setze TCNT1 anschließend zurück auf 0.
Dann zählt der Zähler bis 18 und dekrementiert dann Variable X:
tmp_sreg = SREG;
cli();
if (TCNT1 >=0){
temp_counter=TCNT1;
TCNT1=0;
OCR1A=temp_counter;
}
SREG = tmp_sreg;
Funktioniert aber nicht. Kann ich das so nicht machen?