Pages: [1]   Go Down
Author Topic: Übergabe Interrupt -> Loop  (Read 591 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 406
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guck mal hier,

http://arduino.cc/forum/index.php/topic,129414.0.html
hatten wir erst heute.
Hat michael_x recht gut erklärt.
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ;-)
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Online Online
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
typedef struct { .... } bla_t;

volatile bla_t changed_by_isr;

void loop() {
    cli();
    const bla_t never_changed_by_isr = changed_by_isr;    
    sei();
.....
}
Logged

Check out my experiments http://blog.blinkenlight.net

Pages: [1]   Go Up
Jump to: