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
Hallo! Du kannst das Signal noch an einen externen INT haengen und so auch sehen, ob gerade das Rechtecksignal anliegt. Alex
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.
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
@ 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
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.
was denn nu: 4hz oder 4mhz? das wird hier so alles durcheinaner verwendet
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
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.
Mit int meinte ich externen int, wie oben vorgeschlagen. Natürlich müßte man das Polling über einen Timer mit interruptsteuerung realisieren. Gruß Matthias
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.