Go Down

Topic: Übergabe Interrupt -> Loop (Read 653 times) previous topic - next topic

mwyraz

Hi,

ich hab mal mein Thermometer-Decoder-Projekt wieder ausgegraben um es fertig zu stellen. Ich habe den 433MHz auf Interrupt umgestellt:

  pinMode(2, INPUT);
  attachInterrupt(0,onPinStateChange,FALLING);

Damit kann ich außerhalb des loop() auf die Signalflanken des Receivers reagieren und mitzählen. Am Ende habe ich eine Temperatur und einen Sensor-Channel. Diese möchte ich via UDP Broadcast weitergeben. Nun habe ich gelesen, dass man innerhalb eines Interrupt-Handlers keine allzu großen Dinge anstellen soll.
Wie kann ich also die Werte, die ich im Interrupt-Handler ermittelt habe, sinnvoll an den loop() übergeben? Gibt's da ein fertiges Konzept?

Vielen Dank,
Michael.

hk007

Guck mal hier,

http://arduino.cc/forum/index.php/topic,129414.0.html
hatten wir erst heute.
Hat michael_x recht gut erklärt.
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

mwyraz

Vielen Dank, damit komme ich weiter.

In meinem Fall würde ich die zu übergebenden Daten in ein Struct packen und ein Flag setzen, dass Daten da sind. Im loop kann ich dann, wenn Daten da sind, die Interrupts ausschalten und die Daten "in Ruhe" lesen.

Inzwischen habe ich meine UDP-Broadcasts eingebaut, die scheinen recht zuverlässig auch vom Interrupt-Code aus gesendet werden zu können. Nun empfange ich auf jedem PC im Netz die aktuellen Temperaturwerte ;-)

mwyraz

Klappt super. Der Aufruf von interrupts() hinterher war noch wichtig ;-)
Da ich ein Struct verarbeite, suche ich noch eine Möglichkeit, eine Kopie des Structs zu erzeugen bzw. das alte Struct aufzuheben und der Variable ein neues zuzuweisen. Dann kann ich direkt nach dem Kopieren die Interrupts wieder aktivieren.

Udo Klein

Code: [Select]

typedef struct { .... } bla_t;

volatile bla_t changed_by_isr;

void loop() {
   cli();
    const bla_t never_changed_by_isr = changed_by_isr;    
   sei();
.....
}
Check out my experiments http://blog.blinkenlight.net

Go Up