Rechteckspannung messen

Gast #97683
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
Oder wenn das ganze Harwaremäßig erfolgen soll:
Ein Hochpass, dann eine Diode: Liegt eine Spannung dauerhaft an:
Wechselspannung, ist es 0, dann Signal überprüfen ob es 0 oder 1 ist.
Gast
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
@ 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
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
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
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.
Gast
Mit int meinte ich externen int, wie oben vorgeschlagen. Natürlich müßte
man das Polling über einen Timer mit interruptsteuerung realisieren.

Gruß Matthias

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.