Hallo alle miteinander. Ich habe ein Problem mit meinem Arduino Code. Undzwar möchte ich, dass ein Zähler jede Minute eine Variable um 1 erhöht. Ist diese größer als 59 wird diese Variable auf 0 gesetzt und bei einer Weiteren wird 1 dazu gerechnet. Also eine Simple Uhr. Jetzt möchte ich aber, dass wenn ein Analoges Signal größer als 300 ist ein Signal ausgeben. Das Signal welches ausgegeben werden soll, soll ein einfaches Rechteck sein. Allerdings soll es 57µs an und 57µs aus sein. Das Passiert jetzt aber nur in Minütlichen Intervallen. Das Skript lautet wie folgt: void loop() { delay(60000); mts = mts + 1; if (mts == 60) { hrs = hrs +1; mts = 0; } tilt_val = analogRead(tilt); if (tilt_val > 300) { output(); } } void output() { delayMicroseconds(57); digitalWrite(sig, 1); delayMicroseconds(57); digitalWrite(sig, 0); delayMicroseconds(57); } Wie kann ich erreichen, dass das 57µs Signal ausgegeben wird währen der Normale Zähler (Uhr) Weiter läuft? Ich hoffe mir kann jemand helfen :) MfG
Wahrscheinlich ist das mit INTERRUPTs zu lösen. Allein schon der "delay(60000);" - Befehl ist das schlechteste, was man tun kann, wenn der µC noch mehr zu tun hat. Dafür gibt es Timer und Overflow- oder Match-Interrupts. Wie soll ein Rechteck 57 µs lang an und aus sein, wenn es nur zu bestimmten Ereignissen ausgegeben wird? Was macht das Signal denn in der restlichen Zeit? Weder AN, noch AUS sein? - Zombie-Existenzen gibts nur in der Sage, bei µCs nicht.
Als das Signal wird Minütlich einmal ausgegeben. Also einmal 57us an und dann ist es wider aus. So wie der Code jetzt ist. MfG
Schau Dir mal die Timer an, die können Interrupts erzeugen bzw. sogar bestimmte Pins SW-unabhängig setzen.
Furchtbarer Code. Wozu die unnötigen "delayMicroseconds(57);", hast Du Angst, dass Dein Nachbar zwischenzeitlich was ausgibt? Wenn Du in deiner Hauptschleife nur einmal pro 60000 was-auch-immer die Funktion: analogRead aufrufst, so kann der zugehörige Vergleich auch nur einmal in dieser Zeit stattfinden. Es liegt in der "Natur" einer Verzögerung mittels delay(). Willst Du dieses Verhalten ändern, so musst Du im Hintergrund einen Timer laufen lassen, dessen Status Du regelmäßig abfragst. Übrigens deine Schleife läuft unsymmetrisch. Ein normaler Durchlauf benötigt 60000 was-auch-immer. Ist der abgefragte Wert größer als 300, so benötigt ein Durchlauf 60000 + (3?)*57 µs. Die Zeit, die die einzelnen Befehle benötigen mal außen vor gelassen.
konrad M. schrieb: > Wie kann ich erreichen, dass das 57µs Signal ausgegeben wird währen der > Normale Zähler (Uhr) Weiter läuft? Der einfache Teil: die Uhr wird in einem Time-Interrupt ausgeführt. Wenn jede Sekunde ein IRQ ausgelöst wird, dann wird eben in der Interrupt-Routine der Sekundenzähler um 1 erhöht, bei 60 auf 0 gesetzt und der Minutenzähler um 1 erhöht, also wie bisher auch, bloss im Hintergrund. Wahrscheinlich kannst du keinen IRQ jede Sekunde erzeugen, weil der Timer nicht genug Stellen hat, dann mach eben einen Timer mit 10ms und zähle einen Vorteiler damit auf 100 hoch, das Prinzip bleibt dasselbe. Schwieriger wird es, Impulse mit genau 57 µs zu erzeugen, weil eine Delayloop vom IRQ unterbrochen werden kann und dann die Zeit nicht stimmt, aber da ist eh noch nicht klar wann und was, fang erst mal mit der Uhr an. Gruss Reinhard
Erstmal danke euch allen. Heute kann ich mich damit leider nichtmehr beschäftigen. Morgen setze ich mich nochmal dran. Meint ihr mit den Timer die Timer library? MfG
Ich kenn mich mit Arduino nicht aus, aber ein wenig koogeln bringt das hier: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/ ist auf Englisch, scheint aber hilfreich zu sein!
Hallo, nein das wurde nicht angedacht. Lade das Datenblatt deinen µC und lese die Abschnitte zu Timer. Dann kannst Du die verwenden.
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.