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
  Ausschaltverzögerung bei einer PV Heizung Hans_Maulwurf 27 710 29.11.2016 23:38
Letzter Beitrag: georg01
Question Webserver, Client, Loop Marc2014 6 363 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Innenwiderstand einer Batterie (Rundzelle 1,5V) Einsteiger94 2 205 24.07.2016 11:42
Letzter Beitrag: SkobyMobil
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 527 23.04.2016 10:26
Letzter Beitrag: rkuehle
  I2C Ansteuerung einer MSM3 (elv mp3 Box) Voreifel 2 310 09.04.2016 17:56
Letzter Beitrag: Voreifel
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 486 01.04.2016 05:49
Letzter Beitrag: MartinK
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 506 29.03.2016 16:45
Letzter Beitrag: MartinK
  Inhalt einer Variable mit per Virtual Wire versenden toto1975 17 1.761 26.03.2016 18:57
Letzter Beitrag: hotsystems
  Constrain-Befehl -wie gehts richtig? Nimes 8 933 14.03.2016 18:00
Letzter Beitrag: DL1AKP
  Funktion in Loop einmalig ausführen Haustechno 4 644 09.03.2016 22:43
Letzter Beitrag: Haustechno

Gehe zu:


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