Liebe Forumsteilnehmer. Ich hoffe jemand hat eine Idee woran mein
Problem liegen könnte.
Der folgende Code funktioniert (mit kleinen Modifikationen auf einem
ATTINY85 ohne Probleme und auf einem ATTINY84 nicht wirklich.
(Es geht darum per Interrupt eine Flag zu setzen, worauf hin die
Blink-Geschwindigkeit einer LED geändert wird)
Auf dem ATTINY84 scheint es als ob der Interrupt willkürlich getriggert
wird und nur ab und zu aktiv ist. Man kann dann zwar die Geschwindikeit
ändern, aber nach einer kurzen Zeit springt er wieder auf die alte
Geschwindkeit zurück.
Ungewöhnlich ist ggf. dass ich versuche den Interrupt durch das Anlegen
einer positiven Spannung auf dem Pin möglich zu machen.
Wenn es auf dem 85er nicht funktionieren würde, würde ich auch nicht
fragen, aber ich stehe gerade etwas auf dem Schlauch.
1 | #include <avr/interrupt.h>
|
2 | #define LED_PIN 2
|
3 | #define BUTTON_PIN 6
|
4 | //#define BUTTON_PIN 0 //ATTINY 85
|
5 | #define BUTTON_DEBOUNCE_TIME 500
|
6 |
|
7 | //global Variables
|
8 | volatile boolean buttonPressed = false;
|
9 | boolean ledStatus = false;
|
10 | int intervallTime=1000;
|
11 | long lastWakeUpTime = 0;
|
12 | long lastLEDChangeTime = 0;
|
13 | long currentTime;
|
14 |
|
15 | void setup()
|
16 | {
|
17 | noInterrupts (); //also cli();
|
18 | pinMode (LED_PIN, OUTPUT);
|
19 | pinMode (BUTTON_PIN, INPUT);
|
20 | //GIMSK = 0b00100000; //ATTINY85 -
|
21 | GIMSK = 0b00010000; // turns on pin change interrupts (PCIE0) 6 - ATTINY84
|
22 | //PCMSK = 0b00000001; // ATTINY 85 - Pin 0
|
23 | PCMSK0 = 0b01000000; // turn on interrupts on pin 6 (phyiscal Pin 7) ATTINY84
|
24 | interrupts(); // enables interrupts
|
25 | digitalWrite (BUTTON_PIN, LOW); // changes if + voltage is supplied by buttion
|
26 | }
|
27 |
|
28 | void loop()
|
29 | {
|
30 | currentTime = millis();
|
31 | if((currentTime - lastWakeUpTime) > BUTTON_DEBOUNCE_TIME){
|
32 | if(buttonPressed){
|
33 | lastWakeUpTime = currentTime;
|
34 | if(intervallTime==1000){ intervallTime = 200; // Increment volatile variable
|
35 | }else{ intervallTime = 1000; }
|
36 | }
|
37 | }
|
38 | buttonPressed = false;
|
39 | doBlink();
|
40 | }
|
41 |
|
42 | void doBlink(){
|
43 | long currentTime = millis();
|
44 | if((currentTime - lastLEDChangeTime)>intervallTime){
|
45 | if(ledStatus){
|
46 | digitalWrite (LED_PIN, LOW);
|
47 | ledStatus = false;
|
48 | }else{
|
49 | digitalWrite (LED_PIN, HIGH);
|
50 | ledStatus = true;
|
51 | }
|
52 | lastLEDChangeTime = currentTime;
|
53 | }
|
54 | }
|
55 |
|
56 |
|
57 | //BUTTON_PIN Wake UP interrupt
|
58 | ISR(PCINT0_vect){ buttonPressed = true; }
|
Vielen Dank schon einmal.