Interrupts auf ATTINY84 vs ATTINY85

Gast #5125537
Lesenswert?

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.
#5125551
Lesenswert?

Hi

Ist der 'Button_Pin 6' beim 84 auch durch den PC_INT0 abgedeckt?
Wenn nicht und der dem PC_INT0 zugehörige Pin 'in der Luft hängt' - 
empfängst Du Radio und Die schalten nach Herzenslust um - nicht Du.

Beim 85 sollte '0' dem Pin PB0 entsprechen, Welcher durch den PC_INT0 
erfasst wird - was auch dafür spricht, daß Es wohl funktioniert :)

MfG
Gast #5125638
Lesenswert?

Hallo Patrik,

vielen Dank für den Input. Das mit der Radio-Interferenz hat sich 
bewahrheitet. Hab dank dem Hinweis mir die Sache noch einmal genauer 
angeschaut.

Habe den Interrupt Pin jetzt über einen 300k-Ohm Wiederstand geerdet und 
damit funktionieren die Interrupts jetzt präzise. (ggf. gibt es 
vielleicht noch elegantere Varianten dafür?)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren