Forum: Mikrocontroller und Digitale Elektronik Attiny2313 Taktsignal überwachen


von Holger Huppertz (Gast)


Lesenswert?

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

von Sebastian Eckert (Gast)


Lesenswert?

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.

von Holger Huppertz (Gast)


Lesenswert?

die frequenz liegt bei 500Hz.
wie muss ich das denn schalten?
holger

von Sebastian Eckert (Gast)


Lesenswert?

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

von Holger Huppertz (Gast)


Lesenswert?

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

von Winfried (Gast)


Lesenswert?

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?

von Holger Huppertz (Gast)


Lesenswert?

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.

von Sebastian Eckert (Gast)


Lesenswert?

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.

von Sebastian Eckert (Gast)


Lesenswert?

Ach ja... Eigentlich wäre das eine Aufgabe für einen Watchdog-Baustein.

von Holger Huppertz (Gast)


Lesenswert?

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?

von Sebastian Eckert (Gast)


Lesenswert?

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

von Holger Huppertz (Gast)


Lesenswert?

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

von Sebastian Eckert (Gast)


Lesenswert?

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?

von THM (Gast)


Lesenswert?

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.

von THM (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.