-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Arduino Interrupt

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.02.2009
    Ort
    Aachen
    Beiträge
    1.055

    Arduino Interrupt

    Anzeige

    Hallo zusammen,

    ich spiele grade mit nem Arduino und Interrupten rum, allerdings will das vorne und hinten nicht, wie ich mir das vorstelle.

    Code:
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    
    int irPin = 1;        // interrupt 1 => digital pin 3
    
    void setup()
    {                
        lcd.init();
        lcd.setCursor(0,0);
        lcd.print("blablabla");
        lcd.backlight();
    
        attachInterrupt(irPin, myFunction, FALLING);
    }
    
    
    void loop()                     
    {
        delay(5000);
        lcd.backlight();
    }
    
    
    void myFunction()
    {
      lcd.noBacklight();
    }

    Ich hätte gerne eine Delay-Funktion, die solange ausgeführt wird, bis ich Pin 3 (=Interrupt 1) per Taster auf Gnd lege.

    Der Beispielcode von http://www.dave-auld.net/?option=com...ics&Itemid=107 unter "Making Use of Interrupts" führt bei mir dazu, dass der geschaltete Pin unendlich oft schaltet, bis ich den Interrput-Pin auf Masse lege, statt dass der Pin ruht, bis ich den Taster drücke.

    Hat jemand vielleicht ein einfaches, funktionierendes Beispiel für einen Interrupt?


    Ich würde gerne meinen Arduino eine Weile ruhen lassen, nach dieser Zeit soll einen Abfrage gestartet werden.
    Wird vorher der Taster an Pin 3 gedrückt, soll mittels Interrupt das Ruhen unterbrochen werden und das Hintergrundlicht vom Display eingeschaltet werden (bzw. hier im Beispiel ausgeschaltet).

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Hallo Cysign,

    wenn ich das richtig sehen dann fehlt in deinem Setup der pinMode für den Button. Und die Zeile " int irPin = 1; " ist möglicherweise überflüssig.
    Wichtig ist auch wie der Button tatsächlich auf dem Board verschaltet ist - also als PullUp oder PullDown.


    Viele Grüße
    Jörg
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.02.2009
    Ort
    Aachen
    Beiträge
    1.055
    Hallo Jörg, du hast vollkommen Recht mit deiner Aussage. Ich hab da gestern einfach so lange dran gesessen, dass ich irgendwann nur noch durch war

    Der Code hier funktioniert:
    Code:
    int ledPin = A5;
    volatile int state = HIGH;
    #include "sdelay.h"
    
    void setup()
    {
      pinMode(ledPin, OUTPUT);
      digitalWrite(3, HIGH);
      attachInterrupt(1, blink, FALLING);
    }
    
    void loop()
    {
    for (int i=0; i<100; i++)
        {
            sdelay(1000);
        }
    
    }
    
    void blink()
    {
      state = !state;
      digitalWrite(ledPin, state);
    }

    Wohingegen es nicht funktioniert, aus der ISR heraus ein über I2C angeschlossenes Display über die LiquidCrystal_I2C.h zu steuern:
    Code:
    #include "sdelay.h"
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    
    
    volatile int state = HIGH;
    
    
    void setup()
    {
      digitalWrite(3, HIGH);
      attachInterrupt(1, blink, FALLING);
      
      lcd.init();
      lcd.setCursor(0,0);
      lcd.print("blablabla");
      lcd.backlight();
    }
    
    void loop()
    {
    lcd.backlight();
    sdelay(100);
    }
    
    void blink()
    {
      lcd.clear();
      lcd.print("*");
    }

    Scheinbar kann ich aus der ISR heraus nicht auf externe Funktionen zugreifen.
    Ich hab das Problem jetzt testweise folgendermaßen umschifft:

    Code:
    #include "sdelay.h"
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    
    int activated = 0;
    volatile int state = HIGH;
    
    
    void setup()
    {
      digitalWrite(3, HIGH);
      attachInterrupt(1, blink, FALLING);
      
      lcd.init();
      lcd.setCursor(0,0);
      lcd.print("blablabla");
      lcd.noBacklight();
    }
    
    void loop()
    {
        if (activated == 0)
        {
            sdelay(2000);
        }
        else
        {
            lcd.backlight();
            sdelay(4000);
            lcd.noBacklight();
            activated = 0;
        }
    
    }
    
    void blink()
    {
      activated = 1;
    }
    Geändert von Cysign (09.06.2015 um 02:22 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Hallo, das würde ich nicht umschiffen nennen - sondern jetzt richtige Benutzung des Interrupt. Der pin Mode fehtl übrigens jetzt schon wieder. Vielleciht macht es langsamm Sinn zu schreiben was Du überhaupt machen möchtest damit. Grundsätzlich macht es keinen Sinn eine ISR als Dauerschleife betreiben zu wollen. Viele Grüße Jörg
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.02.2009
    Ort
    Aachen
    Beiträge
    1.055
    Ich möchte einen Arduino per Akku betreiben. Hierzu versetze ich ihn per https://github.com/cano64/ArduinoSleep sdelay() in den Stromsparmodus.
    Alle paar Minuten soll er aufwachen und prüfen, ob etwas zu tun ist.

    Allerdings soll er auch per Interrupt geweckt werden können, damit man über Knöpfe am Display Einstellungen vornehmen kann.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2009
    Beiträge
    12
    Hallo zusammen.
    Ich versuche geraden die interrupt Funktion kennen zu lernen.
    Ich würde gern bei einem LOW einen Text ausgeben.
    Das Problem dabei, immer wenn der Arduino das LOW erhält stürzt er ab.
    Ich gehe davon aus, dass meine "Schaltung" auf dem Steckbrett falsch ist.

    D3 mit einem Kabel auf 5V (HIGH) und einen Widerstand 1K-Ohm auf GND (LOW)

    Wenn der Pin die 5V erhält, läuft das Ganze, sobald ich das 5V Kabel entferne stürzt der Arduino ab.

    Code:
    void setup(){
      Serial.begin(9600);
      attachInterrupt(1, interrupt, LOW);
    }
     
    void loop()
    {
      for (int i = 0; i < 1000; i++)
      {
        Serial.println(i);
        delay(100);
      }
    }
     
    void interrupt()
    {
     
      Serial.println("Hallo");
    }
    Dank für die Hilfe

    ---------------------------------------------------------------------------------------------------------------

    Nachtrag:
    Habe soeben bemerkt, dass das Serial.println das Problem war....

    So funktioniert es

    Code:
    int hallo = 0;
    
    void setup()
    {
      Serial.begin(9600);
      attachInterrupt(1, interrupt, LOW);
    }
     
    void loop()
    {
      for (int i = 0; i < 1000; i++)
      {
        if (hallo == 1)
        {
          Serial.println("Hallo");
          hallo = 0;
          delay (100);
        }
        else
        {
          Serial.println(i);
          delay(100);
        }
      }
    }
     
    void interrupt()
    {
     hallo = 1;
     delay(100);
    }
    Geändert von Bongo_1st (23.10.2015 um 22:47 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.02.2009
    Ort
    Aachen
    Beiträge
    1.055
    Ich bin irgendwann dazu übergegangen, auf Interrupts zu verzichten, da ich auch öfters das Problem hatte, einen freeze/unvorhersehbares Verhalten zu bekommen.
    Aber evtl. befasse ich mich bald nochmal damit. An sich ist es ja ein schönes Feature.
    Danke, dass du deine Problemlösung mit uns teilst

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Nö, das Problem liegt wo anders.
    Delay() funktioniert beim Arduino _nicht_ innerhalb eines Interrupt-Handlers.
    https://www.arduino.cc/en/Reference/AttachInterrupt
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von Cysign Beitrag anzeigen
    Ich möchte einen Arduino per Akku betreiben. Hierzu versetze ich ihn per https://github.com/cano64/ArduinoSleep sdelay() in den Stromsparmodus.
    Alle paar Minuten soll er aufwachen und prüfen, ob etwas zu tun ist.

    Allerdings soll er auch per Interrupt geweckt werden können, damit man über Knöpfe am Display Einstellungen vornehmen kann.
    Das ist eigentlich kein Problem.
    Eine CPU im Tiefschlaf, kann nur durch einen Interrupt wieder aufgeweckt werden (oder einen Reset, wobei Reset ein eigentlich spezieller Interrupt ist).
    Wichtig ist nur, dass vor dem schlafen Gehen das für den Interrupt zuständige Modul aktiviert bleibt. Alle anderen können, um maximal Strom zu sparen, abgeschaltet werden.

    sdelay(); wird einen Timer-Interrupt verwenden welcher die CPU periodisch aufweckt. Bei jedem Interrupt wird einfach der Delay-Wert runtergezählt und wenn dieser noch nicht abgelaufen ist, geht die CPU wieder pennen...

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.02.2009
    Ort
    Aachen
    Beiträge
    1.055
    Genau so siehts aus. Mit sdelay bin ich auf ca. 2,5mA bei einem blanken AtMega328 runtergekommen. Dazu habe ich einen Linearregler, der weitere 2mA verbrät, um den µC zu versorgen.

    Was man bei sdelay(); allerdings beachten sollte: Der Timer, der den Interrupt ausführt, ist wirklich ziemlich ungenau. Da können 3 Schlafsekunden auch mal 5-6 Sekunden sein!

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Arduino vs. Arduino: Kampf um die Arduino IDE
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 04.04.2015, 18:21
  2. Rosenkrieg: Arduino zahlt Arduino keine Lizenzgebühren
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 20.03.2015, 09:00
  3. Arduino: laufendes Programm auf Arduino Uno beenden?
    Von Ford Prefect im Forum Arduino -Plattform
    Antworten: 2
    Letzter Beitrag: 15.06.2014, 09:25
  4. Arduino + WLAN = Arduino Yún
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 04.06.2013, 14:50
  5. [ERLEDIGT] [ARDUINO] 2 Motoren + Servo mit dem Arduino Uno steuern
    Von Torrentula im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.08.2011, 17:31

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •