Problem mit Interrupt in Processing-Programm

Gast #3432172
Lesenswert?
• ▲
▼
Liebes Forum,

Ich möchte ein kleines Programm auf einem qC (ATmega168 auf 
ArduinoBoard) zum laufen bringen, welches folgendes ausführen wird:

Der Controller steuert 2 LEDs an. Mit einem Taster wählt man zwischen 
den beiden. Die LED ist zuerst dunkel, wird langsam immer heller(PWM), 
und erlischt schlussendlich und das ganze beginnt von vorne.
Bei der Betätigung des Tasters wechselt man zur anderen LED, welche dann 
genau das gleiche tut. (Es ist also immer nur eine LED in Betrieb)

Eigentlich ganz simpel, das passende Programm habe ich in Processing 
geschrieben und funktioniert soweit auch.

Jedoch ist es ganz wichtig, dass das Wechseln der LED nach der 
Betätigung des Tasters SOFORT passiert. Das ist im Moment nicht der 
Fall, das Wechseln erfolgt erst nachdem die LED wieder erlischt ist.

Was muss ich ändern? (Siehe Programm unten)

Ich erwähne hier noch, dass ich ein ziemlicher Anfänger auf diesem 
Gebiet bin und nun erstmals einen Schritt in die Welt der 
Mikrocontroller gewagt habe.

(Deshalb auch die für mich noch etwas einfach verständlichere Sprache 
Processing)

Danke im Voraus
Gruss



1
/* Die Schaltung besteht aus 2 LEDs. Jeweils eine LED leuchtet immer wieder auf.
2
Mit dem Taster wechselt man zwischen den beiden LEDs.
3
*/
4

5

6

7
byte ledPin[2] = { 10, 11}; // LED an Pin 10,11
8
int swtch = 2;              // Taster an Pin 2
9
int BluePin = 10;
10
int GreenPin = 11;
11

12
int del = 10;    
13
int blue, green ;
14
volatile int mode = 0;
15

16
void switch_update()
17
{  mode++; if (mode > 1) mode=0;
18
}
19

20
void setup()
21
{ for (int n=0; n<5;n++)
22
{ pinMode(ledPin[n], OUTPUT);
23
}
24
  pinMode(swtch, INPUT);
25
{ digitalWrite(swtch, HIGH);
26
  attachInterrupt(0, switch_update, RISING);
27
}
28
}
29
void loop()
30
{ switch(mode)
31
 
32
{ case 0:                              
33
{ for(green=0; green < 255; green++)
34
{ analogWrite(GreenPin, green);
35
  delay(del);
36
}
37
}
38
{ analogWrite(GreenPin, 0);
39
} break;
40

41

42
  case 1:                               
43
{ for(blue = 0; blue < 255; blue++)
44
{ analogWrite(BluePin, blue);
45
  delay(del);
46
}
47
{ analogWrite(BluePin, 0);
48
 
49

50
}break;
51
}  
52
}
53
}
#3432241
Lesenswert?
• ▲
▼
@ Isopropanol (Gast)

>Was muss ich ändern? (Siehe Programm unten)

Deine Herangehensweise. Du brauchst einen Timer, der in sinnvollen 
Zeitabständen, sagen wir 100ms tickert. Damit wird eine minimale 
statemachine durchlaufen, hier ein einfacher Zähler. Dabei kann man 
auch bei jedem Durchlauf die Taste prüfen und reagieren.

Siehe auch Multitasking.

Ich hab keine Ahnung von der processing Sache, aber in etwa so sollte es 
gehen.
1
void loop()
2
{ for(led_val=0; led_val < 255; led_val++)
3
  { if (mode==0) {analogWrite(GreenPin, led_val);}
4
     else analogWrite(BluePin, blue);
5
     delay(del);
6
     if (mode != mode_old) break;
7
  }
8
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.