Forum: Mikrocontroller und Digitale Elektronik Problem mit Interrupt in Processing-Programm


von Isopropanol (Gast)


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
}

: Bearbeitet durch User
von Falk B. (falk)


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
}

: Bearbeitet durch User
von Isopropanol (Gast)


Lesenswert?

Hallo Falk,

Danke für den Hinweis, unter Anwendung eines Zählers hat es nun 
funktionert.

Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.