PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeit zwischen 2 INT0-Impulsen messen (Denkfehler?...)



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

m@rkus33
12.04.2007, 11:20
hatte kürzlich das gleiche Problem:

Zeit zwischen zwei INT und gleichzeitiges Zählen der INT mit Timer1

Ich habe es so gelöst:

Mit Messung =1 vor der Loop- Schleife beim allerersten INT den Timer auf 0 setzen. Messung wird auf 0 gesetzt. kommt der nächste INT wird der Timer ausgelesen, Wert gesichert und wieder auf 0 gesetzt usw.


Der timer1 rennt und in der Irq von INT0 passiert das:



Messung = 1

Do

*** tu irgend was ***

Loop
'-------- IrQ ----------------

Irq0:

Portc.1 = 0

Incr Impulse
If Messung = 0 Then
Impcount = Timer1
Timer1 = 0
Messung = 1

Else
Timer1 = 0
Messung = 0
End If


Portc.1 = 1

Return


'-------------- Timer IRQ -------------

Timerirq:

Impcount = 0
Return



Evtl. hilft es Dir.

Jaecko
13.04.2007, 08:05
Also 1:1 hab ichs nun nicht übernommen; aber es hat mir zumindest ne Idee gegeben; Machs einfach so, dass bei jedem INT0 in einer Variable die aktuellen Sekunden der Uhrzeit gespeichert werden. In jedem Timer-Überlauf wird die Differenz überprüft. Liegt dort die Differenz zwischen 2 Impulsen bei mehr als 1 Sekunde, wird ausgelöst. Reicht für meinen Fall vollkommen aus. Die Berechnungen konnt ich nicht mehr in den INT0 mitnehmen, da die Impulse etwas zu schnell kommen und das Programm sonst nicht mehr fertig wird mit rechnen.

m@rkus33
13.04.2007, 08:55
na freut mich das es dir weitergeholfen hat.... :)