Rechteckspannung messen

Gast #97683
Lesenswert?

Hi Leuts,
ich stehe hier vor folgendem Problem: Ich muß mit einem ATmega16 ein
Einganssignal testen, welches drei Zustände annehemen kann:
0, 1, Rechtecksignal (4Hz).
Wie kann ich testen ob das Rechtecksignal anliegt ? Normalerweise würde
ich sagen, aufgrund der taktfrequenz von 4 MHz die Programmlaufzeit
ermitteln und dann immer in Signalmitte auf 0 und 1 testen, also ob das
Signal schön regelmäßig wechselt...
Aber vielleicht gibts da ja noch irgendwie einen trick um das zu
vereinfachen ?

Greetings
Karlheinz
Gast #97686
Lesenswert?

Hallo

Ich würde auch die Variante mit dem Interrupt bevorzugen. Du könntest
einfach einen Timer laufen lassen und immer beim Interrupt auslesen,
mit dem vorherigen Ergebnis vergleichen und den Timer zurücksetzen.

Andy
Gast #97687
Lesenswert?

@ Andy
dann müstest du im interrupt nach high oder low abfragen und dann den
interrupt level umdrehen. wenn die schaltungsperipherie das zuläßt,
würde ich zwei ext. ints nehmen, einen auf high-trigger einstellen und
einen auf low. aber, bei einer frequenz von max. 4 hz kann das auch die
software.
Michael
Gast #97688
Lesenswert?

oder mit dem Timer1, Signal an ICP, OCRx auf einen Wert oberhalb der
Periodendauer. Ein ICP-Int setzt den Timer zurück, Zustand des Signals:
4Hz liegen an. In der OCR-Routine wird ebenfalls der Timer zurückgesetzt
und PIND.6 abgefragt. Kommt der OCR-Int, heisst das, die 4Hz liegen
nicht an, PIND.6 gibt AUfschluss über den Zustand.
Gast #97690
Lesenswert?

4Hz hat das Signal, 4MHz der AVR. Was vertstehst du daran nicht?

Bei so langsamen Signalen würde ich keinen Int benutzen. Was ist, wenn
eine Störung über die Leitung kommt? Dann funzts mit Int nicht! Besser
ist hier Polling. Man zählt die abgetasteten Werte, und innerhalb eines
Bereichs kann man dann Aussagen über den Zustand des Signals machen. Das
filtert Störungen sehr zuverlässig aus!

So long,
Matthias
Gast #97691
Lesenswert?

Sicher hast Du irgendeinen Timerinterrupt sowieso am laufen, oder?
Sagen wir Du hast einen mit 100 Hz, dann würde ich einen Zähler bis auf
Null runterzählen lassen, der bei einer Signalflanke auf einen Startwert
von >=13 gesetzt wird. Liegt ein Rechteck an, wird der Zähler nie Null.

Umgekehrter Schluss: ist der Zähler nicht Null haben wir Rechteck, ist
er Null haben wir den Pegel, der am Pin anliegt.
Ob man die Flankenerkennung im Interrupt macht oder durch Polling,
hängt davon ab, ob das Programm in seiner Hauptschleife oft genug an
der Portabfrage vorbeikommt. Sonst könnte der Zähler einfach deshalb
Null werden, weil das Programm eine Flanke verschlafen hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren