Hallo, ich möchte mit einem Attiny2313 ein Rechtecksignal überwachen. Liegt das Signal an > LED aus Liegt kein Signal an > LED an Ist das möglich und wenn ja wie kann ich das realisieren? mfg Holger
Das hängt von der Frequenz ab. Bis zu einer gewissen Frequenz ja. In vielen Fällen kann man allerdings mit einer einfachen RC-Filterschaltung (Hochpaß) und einem nachgeschalteten Transistor dasselbe erreichen.
die frequenz liegt bei 500Hz. wie muss ich das denn schalten? holger
500 Hz geht natürlich auch locker mit dem Micro. Um eine Schaltung aufzuzeichnen, müßte ich natürlich zunächst wissen, ob das Taktsignal belastbar ist und welchen Pegel es hat. Ich habe aber noch eine andere Lösung im Netz gefunden, beim Thema Lüfter-Überwachung: http://www.forumdeluxx.de/gallery/data/500/3937FAN2.jpg Stammt aus diesem Forum: http://www.forumdeluxx.de/forum/archive/index.php/t-20484.html
Das Rechtecksignal wird von einem NE555 ausgegeben. Der Pegel ändert sich je nach Einstellung, teilweise werden auch nur kurze Spannungsspitzen ausgegeben. Geht es nicht das der Micro einfach nur erkennt das etwas anliegt und dadurch einen Port-Pin low schaltet. Danke schonmal. holger
Da musst du schon genauer definieren, was das bedeutet, dass da irgendwas anliegt. Ich mein, es liegt ja immer irgendwas an. Und was meinst du mit Spannungsspitzen? Ist es ein digitales Signal oder ein analoges? Wenn analog, welche Signalform und welche Pegel sind zu erwarten?
Es liegen je nach Einstellung in meiner Schaltung am Ausgang des NE555 verschiedene Rechtecksignale an. Die Frequenz bleibt immer bei ca. 500Hz, lediglich der Tastgrad ändert sich. Es ist ein analoges Signal. In einigen Fällen hällt der High-Pegel nur für µs, also kurze Spannungsspitzen. Der High-Pegel liegt bei 12V, low bei 0V. Ich frage mich nun, ob ich das gerade geschaltete Signal, egal welches, an einen Pin des µC anschließen kann und im Programm bestimmen kann, das wenn am Pin nichts mehr anliegt, bsp. NE555 defekt, also kein Signal mehr anliegt, der µC aus dem Hauptprogramm raus geht und in ein Unterprogramm geht was sagt das meinedwegen eine LED leuchtet.
Erste Vartiante: Der Mikro muß den Port in regelmäßigen Abständen abfragen. Das Abfrageintervall muß so gewählt sein, daß auch der kürzeste mögliche Impuls nicht verschluckt wird. Zweite Variante: Der Impuls wird an einen interruptfähigen Port geführt. Das Programm muß bei jedem Impuls per Interruptroutine einen Zähler zurücksetzen, der kontiunierlich hochgezählt wird (Timer/Counter Einheit hat ja auch der Tiny, oder?). Bei richtig gewähltem Vorteiler tritt ein Zählerüberlauf nur im Fehlerfall auf. Diesen kann man dann über einen weiteren Interrupt behandeln, oder einfach nur im Hauptprogramm kontinuierlich das Überlauf-Flag prüfen und danach die LED schalten.
Ach ja... Eigentlich wäre das eine Aufgabe für einen Watchdog-Baustein.
das hilft mir auf jedenfall schon weiter, danke. der tiny hat ein timer/counter einheit. hast du vllt ein kleines programmierbeispiel? ich müsste dann das signal an den interrupt eingang geben und bei jedem high-pegel den tiny zählen lassen, das verstehe ich, aber wie soll das mit dem überlauf funktionieren. die erste Variante habe ich mir auch schon überlegt, aber bei 2ms pro periode und davon 3µs impuls dauer müsste ich ca. 650 mal abfragen, denke das ist zuviel oder?
Bei 3 Mikrosekunden Impulsdauer könnte man, um sicher zu gehen, alle 2 Mikrosekunden den Port-Status abfragen. Ein Tiny2313 verkraftet normalerweise 20 MHz. Die Abfrageschleife könnte also (im Idealfall) knapp 40 Befehle lang sein, wenn der Tiny wirklich nichts anderes zu tun hat. Das wäre dann Lösung 1, als Pseudocode (keine wirkliche Programmiersprache, nur zur Illustration) etwa folgendermaßen: Beginn Programm Variable Impuls_status, Zähler = 0 LED aus Beginn Schleife Erhöhe Zähler Wenn Impulseingang ungleich Impuls_status dann Zähler = 0 Impuls_status = Impulseingang Wenn Zählerüberlauf dann LED an sonst LED aus Ende Schleife Ende Programm Lösung 2 ist natürlich eleganter (schon allein, weil der Tiny langsamer laufen kann und weniger beschäftigt ist), ungefähr so: Funktion externer_Interrupt Hardware_Zähler = 0 LED aus Interrupt_Flag = 0 Ende Funktion Funktion Counter-Overflow-Interrupt LED an Interrupt_Flag = 0 Ende Funktion Beginn Hauptprogramm Initialisiere Vorteiler Initialisiere Hardware_Zähler Interrupts extern (flankengetriggert) und Timer/Counter konfigurieren Interrupts freigeben LED aus Endlosschleife Ende Program
Der Tiny steuert schon das umschalten zwischen den Messbereichen eines Kondensatormessgeräts. Ich verstehe ehrlich gesagt nur die 1. Variante. Ich lasse den Tiny alle 2µs den Port-Pin abfragen ob ein High-Pegel anliegt. bei 2ms Periodendauer müsste der Pin allerding 1000mal abgefragt werden. Da ich noch in den Anfängen bin verstünde ich eine Abfrage nur so: Abfrage 1: If PIND.1 = 1 then goto LED aus else goto Abfrage 2 endif Abfrage 2: waitus 2 if pind.1 = 1 then goto LED aus else goto Abfrage 3 endif Abfrage 3: waitus 2 usw... Gibt es da nich eine einfachere und Kürzere möglichkeit abzufragen? könnte es mir auch so vorstellen: Abfrage: waitus 2 if pind.1 = 1 then goto LED aus else goto Zähler endif Zähler: Abfrage = Abfrage+1 If Abfrage = 1000 then goto LED an else goto Abfrage endif
Ich glaube, ich habe zur Zeit eine Denkblockade, was den Zusammenhang zwischen 2 Mikrosekunden und 1000 Mal angeht. Aber davon mal abgesehen: Wenn der Tiny bereits mit irgendetwas anderem beschäftigt ist, darf man keine Zeit mit Warten verschwenden, so daß die Verwendung von "waitus" schon mal ausscheidet - oder läuft da ein Multitasking-Kernel? Meiner Meinung nach muß diese Abfrage in einem Timer-Interrupt (oder periodischem Interrupt, falls das vertrauter klingt) ausgeführt werden, sobald der Mikro mit etwas anderem beschäftigt ist als mit dieser Aufgabe. Es wird sich schlecht vermeiden lassen, die neue Routine in das bestehende Programm zur Bereichsumschaltung einzuarbeiten, ohne daß dieses dazu aufgehalten wird - oder, falls die Bereichsumschaltung weniger zeitkritisch ist - diese um die Impulsüberwachung herumzustricken. Übrigens: Wenn in der Kürze die Würze liegt, kann man vielleicht ein Schnipselchen Assembler in das Basic-Programm einfügen, oder mag der Compiler das nicht?
Wie oben schon geschrieben: das ist 'ne prädestinierte Aufgabe für ext. Interrupt-Pin und Timer-overflow. Beim eintreten des ext. INT (Impulse bis runter zu 3 Taktzyklen des Tiny werden erkannt) den Timer rücksetzen. Der Timer muss natürlich per Vorteiler so eingestellt werden dass er >2ms (500Hz) überläuft. Der Overflow-Interrupt führt die Aktion für 'fehlendes Signal' aus. Man nennt das auch eine Watchdog-Funktion. Ebenfalls oben schon beschrieben.
Ach ja: Interrupts sind meist zu bevorzugen, besonders wenn noch andere Funktionen auf dem µC laufen.
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.