Jaecko
12.04.2007, 08:11
Moin.
Mal wieder ein Problem, deren Lösung an einem Denkfehler scheitert.
Bei nem ATMega2560 läuft Timer1 zur Aufbereitung der Uhrzeit
(Config Timer1 = Timer , Prescale = 1024:Timer1 = 49910).
Nun soll (ohne einen weiteren Timer zu verwenden) die Zeit zwischen
Impulsen gemessen werden, die an INT0 ankommen. Es geht nicht darum,
dass die Zeit auf ms/µs exakt bekannt ist, sondern es muss lediglich eine Entscheidung getroffen werden, ob der Impuls länger als ca. 1 sec ausbleibt.
Da bis jetzt schon einige Programmversuche eher für die Tonne waren, wollte ich jetzt mal die Denkweise hier prüfen lassen, ob ich überhaupt richtig vorgehe:
Timer Läuft, zählt hoch, springt bei Überlauf (1-sec-Takt) zur ISRTimer1.
INT0 reagiert auf Pegelwechsel und springt dabei zu ISRINT0.
Bei jedem ISRTIMER1 wird u.a. ÜBERLAUF um 1 erhöht.
Erfolgt INT0, wird folgendes gemacht:
T1 = Timer1 (aktuellen zählstand zuweisen)
T2 = T1 (Alten Zählerstand sichern)
ÜBERLAUF = 0 (Anzahl Überläufe seit letztem INT0 löschen).
Die Berechnung der Dauer müsste dann so erfolgen:
x = ABS(T1-T2) + ÜBERLAUF * (65535-49910),
also Differenz der beiden Timer + Überlauf-Blöcke.
Die Zeit ist dann die Anzahl der Takte, also Zeit = x * 0,064 ms
Stimmt die Annahme soweit?
MfG
S.C
Mal wieder ein Problem, deren Lösung an einem Denkfehler scheitert.
Bei nem ATMega2560 läuft Timer1 zur Aufbereitung der Uhrzeit
(Config Timer1 = Timer , Prescale = 1024:Timer1 = 49910).
Nun soll (ohne einen weiteren Timer zu verwenden) die Zeit zwischen
Impulsen gemessen werden, die an INT0 ankommen. Es geht nicht darum,
dass die Zeit auf ms/µs exakt bekannt ist, sondern es muss lediglich eine Entscheidung getroffen werden, ob der Impuls länger als ca. 1 sec ausbleibt.
Da bis jetzt schon einige Programmversuche eher für die Tonne waren, wollte ich jetzt mal die Denkweise hier prüfen lassen, ob ich überhaupt richtig vorgehe:
Timer Läuft, zählt hoch, springt bei Überlauf (1-sec-Takt) zur ISRTimer1.
INT0 reagiert auf Pegelwechsel und springt dabei zu ISRINT0.
Bei jedem ISRTIMER1 wird u.a. ÜBERLAUF um 1 erhöht.
Erfolgt INT0, wird folgendes gemacht:
T1 = Timer1 (aktuellen zählstand zuweisen)
T2 = T1 (Alten Zählerstand sichern)
ÜBERLAUF = 0 (Anzahl Überläufe seit letztem INT0 löschen).
Die Berechnung der Dauer müsste dann so erfolgen:
x = ABS(T1-T2) + ÜBERLAUF * (65535-49910),
also Differenz der beiden Timer + Überlauf-Blöcke.
Die Zeit ist dann die Anzahl der Takte, also Zeit = x * 0,064 ms
Stimmt die Annahme soweit?
MfG
S.C