INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Stop Befehl während einer Void - Loop
15.01.2014, 14:52
Beitrag #9
RE: Stop Befehl während einer Void - Loop
(15.01.2014 11:41)Stefan schrieb:  so langsam biegen sich mir die Fußnägel hoch, die Nackenhaare stehen bereits. Big Grin Interuptstsuerung für diesen Zweck! Er sollte für unerwarteten, azyklischen, also selten auftretenden Ereignissen reserviert bleiben und nicht für solche Standardfunktionen verschwendet werden.

Normalerweise macht man so etwas, indem man ein kleines Grundprogramm schreibt, das die Funktion einmal abbildet und zur Laufzeit dann die Daten entsprechend einsetzt. Also: Zuerst Gedanken über die informelle Abbildung der gewünschten Funktionen machen, zuordnen und dann physikalisch ausgeben.


Sagen wir mal so: ein InteRRupt ist für die Geschichte etwas oversized, das gabe ich zu. Allerdings hat der Threadersteller nicht dazu gesagt, dass es sich um eine Übungsaufgabe für Azubis handelt (hab noch mit ihm per PN kommuniziert).

"Eine LED Reihe (9 grüne pin 1-10) und und eine Rote led ( pin 0) sollen auf Knopfdruck ( Button Pin 12) starten durchzublinken mit einer Verzögerung von 1000 ms. Die Rote LED bleibt dauerhaft an bei dem Sequenzdurchlauf und sich danach abschalten. Man soll die sequenz mitten im Durchlauf durch drücken des Buttons unterbrechen können."

Wenn ich die Aufgabe wörtlich nehme und die Sequenz "Echtzeit" unterbrechen will, geht es nur mit dem Interrupt... Und weil es nur eine Übungsaufgabe ist, wird ja auch nichts verschwendet. Gut, durch die Vorgabe von Pin 12 ist der Interrupt wieder ausgeschlossen Tongue

Aber grundsätzlich finde ich, dass da nichts gegen spricht (abgesehen davon, dass er ja schon für sein delay() ca. 50x nen Interrupt verwendet hat) Wink

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2014, 16:32
Beitrag #10
RE: Stop Befehl während einer Void - Loop
einverstanden, demo. Aber gerade, wenn es um Ausbildungszwecke geht, dann kann es nicht schaden, wenn sich die Newbies gewisse Sachen erst gar nicht angewöhnen. Den Interruptus schreibe ich auch wieder mit rr. Normalerweise fehlt bei mir das , weil die Tste klemmt.Big Grin

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 15:10
Beitrag #11
RE: Stop Befehl während einer Void - Loop
(15.01.2014 11:41)Stefan schrieb:  so langsam biegen sich mir die Fußnägel hoch, die Nackenhaare stehen bereits. Big Grin Interuptstsuerung für diesen Zweck! Er sollte für unerwarteten, azyklischen, also selten auftretenden Ereignissen reserviert bleiben und nicht für solche Standardfunktionen verschwendet werden.

Normalerweise macht man so etwas, indem man ein kleines Grundprogramm schreibt, das die Funktion einmal abbildet und zur Laufzeit dann die Daten entsprechend einsetzt. Also: Zuerst Gedanken über die informelle Abbildung der gewünschten Funktionen machen, zuordnen und dann physikalisch ausgeben.

Wenn ich an Pin 2 einen Schalter klatsche und durch HIGH sage, dass der Schalter geschlossen werden soll, damit der Arduino erwacht durfte es doch gehen oder?
attachInterrupt(0, pin2_isr, HIGH);
/* 0, 1, or many lines of code here */
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
cli();
sleep_enable();
sleep_bod_disable();
sei();
sleep_cpu();
/* wake up here */
sleep_disable();
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 21:52
Beitrag #12
RE: Stop Befehl während einer Void - Loop
Guten Abend allerseits,

bin noch ziemlich neu in der Arduino Gemeinde, jedoch glaube ich hier was (vielleicht Sinnvolles) beitragen zu können:

Du könntest diese Sequenz (Grün 1....9) mit IF schleifen und einer Hilfsvariable "Status" und einer hilfsvariable curr_millis realisieren. Dabei blockiert kein delay das Wiederholen der Void Loop und der Taster würde zeitnah abgefragt werden.

Also Grün1 ein Status=1, grün2 ein Status=2 usw.

z.b
in setup deklarierst Du z.b. byte status = 1
in void loop

if (status ==1){
if (millis() > curr_Millis + interval_blink) {
digitalWrite(green_1, HIGH); //green1 on
status= 2;
curr_Millis = millis();
}
}
if (status ==2){
if (millis() > curr_Millis + interval_blink) {
digitalWrite(green_2, HIGH); //green1 on
status= 3;
curr_Millis = millis();
}
}

//hier kommt deine Tasterabfrage rein


Ist zwar etwas umständlich, funkt aber.

Hoffe ich konnte das halbwegs anschaulich erklären...

lg, Wolfgang
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2014, 09:49
Beitrag #13
RE: Stop Befehl während einer Void - Loop
damit habe ich auch noch keine praktische Erfahrung, weiß aber, dass dies nicht so ohne ist, denn wenn die Erweckungsbedingungen nicht stimmen......

mehr zum Thema gibt es hier: Arduino als Murmeltier

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2014, 19:40 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2014 19:42 von demokrit.)
Beitrag #14
RE: Stop Befehl während einer Void - Loop
Hier mal eine Lösung "auf die Schnelle"...

Ohne Interrupt, demnach kein Abbruch, wenn die Wartezeit läuft...


Code:
#define u8 char

// festlegen der Pins
#define LEDPIN0  0      // rote LED
#define LEDPIN1  1      // restliche grüne LEDs...
#define LEDPIN2  2
#define LEDPIN3  3
#define LEDPIN4  4
#define LEDPIN5  5
#define LEDPIN6  6
#define LEDPIN7  7
#define LEDPIN8  8
#define LEDPIN9  9
#define BUTTON  12      // Button

void setup() {
  // Pinmodi festlegen
  pinMode(LEDPIN0, OUTPUT);
  pinMode(LEDPIN1, OUTPUT);
  pinMode(LEDPIN2, OUTPUT);
  pinMode(LEDPIN3, OUTPUT);
  pinMode(LEDPIN4, OUTPUT);
  pinMode(LEDPIN5, OUTPUT);
  pinMode(LEDPIN6, OUTPUT);
  pinMode(LEDPIN7, OUTPUT);
  pinMode(LEDPIN8, OUTPUT);
  pinMode(LEDPIN9, OUTPUT);
  pinMode(BUTTON,  INPUT);
}

void loop () {
  if(digitalRead(BUTTON) == HIGH)
  {
    digitalWrite(LEDPIN0, HIGH);       // rote LED einschalten
    delay(500);                        // Verzögerung, damit der Button nicht direkt als gedrückt erkannt wir
    for(u8 u8i = 1; u8i <= 9; u8i++)  
    {
      delay(500);
      blink_on(u8i);                   // LED einschalten    
      if(digitalRead(BUTTON) == HIGH)  // wenn Button gedrückt wird...
      {
        digitalWrite(LEDPIN0, LOW);    // ...rote LED ausschalten...
        blink_off(u8i);                // ...aktuelle grüne LED ausschalten...    
        u8i = 10;                      // ...Abbruchbedingung setzen  
      }
      delay(500);
      
      blink_off(u8i);                  // LED ausschalten
    }
    digitalWrite(LEDPIN0, LOW);      
  }
}

// param:     u8Led          Pin, welcher angesteuert werden soll
void blink_on(u8 u8Led) {
switch(u8Led)
{                
   case 1: digitalWrite(LEDPIN1, HIGH);
           break;
   case 2: digitalWrite(LEDPIN2, HIGH);
           break;
   case 3: digitalWrite(LEDPIN3, HIGH);
           break;
   case 4: digitalWrite(LEDPIN4, HIGH);
           break;
   case 5: digitalWrite(LEDPIN5, HIGH);
           break;
   case 6: digitalWrite(LEDPIN6, HIGH);
           break;
   case 7: digitalWrite(LEDPIN7, HIGH);
           break;
   case 8: digitalWrite(LEDPIN8, HIGH);
           break;
   case 9: digitalWrite(LEDPIN9, HIGH);
           break;
  }
}

// param:     u8Led          Pin, welcher angesteuert werden soll
void blink_off(u8 u8Led) {
switch(u8Led)
{                
   case 1: digitalWrite(LEDPIN1, LOW);
           break;
   case 2: digitalWrite(LEDPIN2, LOW);
           break;
   case 3: digitalWrite(LEDPIN3, LOW);
           break;
   case 4: digitalWrite(LEDPIN4, LOW);
           break;
   case 5: digitalWrite(LEDPIN5, LOW);
           break;
   case 6: digitalWrite(LEDPIN6, LOW);
           break;
   case 7: digitalWrite(LEDPIN7, LOW);
           break;
   case 8: digitalWrite(LEDPIN8, LOW);
           break;
   case 9: digitalWrite(LEDPIN9, LOW);
           break;
  }
}

MfG demo

EDIT: Falls erwünscht, kann ich das ganze auch noch mal mit Interrupt programmieren...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  2 Befehle gleichzeitig, Millis()-Befehl rakadami 24 1.721 13.05.2017 20:47
Letzter Beitrag: MicroBahner
  switch case funktion ausser halb loop ??? huber5093 13 1.559 12.04.2017 15:26
Letzter Beitrag: Tommy56
  Verständnisfrage: Instanz innerhalb einer Klasse tuxedo0801 6 317 28.03.2017 19:40
Letzter Beitrag: georg01
  Befehl braucht viel Zeit GuaAck 5 408 14.03.2017 19:40
Letzter Beitrag: GuaAck
  Loop Schleife abbrechen mittlig1977 1 695 06.01.2017 22:18
Letzter Beitrag: Tommy56
Question Webserver, Client, Loop Marc2014 6 880 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Innenwiderstand einer Batterie (Rundzelle 1,5V) Einsteiger94 2 552 24.07.2016 11:42
Letzter Beitrag: SkobyMobil
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 880 23.04.2016 10:26
Letzter Beitrag: rkuehle
  I2C Ansteuerung einer MSM3 (elv mp3 Box) Voreifel 2 655 09.04.2016 17:56
Letzter Beitrag: Voreifel
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 867 01.04.2016 05:49
Letzter Beitrag: MartinK

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 3 Gast/Gäste