Forum: Mikrocontroller und Digitale Elektronik Problem: Signal ausgeben währen Zähler weiter läuft


von M. M. (mrmcchicken)


Lesenswert?

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

von Bernie (Gast)


Lesenswert?

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.

von M. M. (mrmcchicken)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Schau Dir mal die Timer an, die können Interrupts erzeugen bzw. sogar 
bestimmte Pins SW-unabhängig setzen.

von amateur (Gast)


Lesenswert?

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.

von Reinhard Kern (Gast)


Lesenswert?

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

von M. M. (mrmcchicken)


Lesenswert?

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

von Bernie (Gast)


Lesenswert?

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!

von Uwe (de0508)


Lesenswert?

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