Forum: Mikrocontroller und Digitale Elektronik Interrupts auf ATTINY84 vs ATTINY85


von Matthes (Gast)


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.

von Patrick J. (ho-bit-hun-ter)


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

von Matthes (Gast)


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?)

von Peter D. (peda)


Lesenswert?

Matthes schrieb:
> (ggf. gibt es
> vielleicht noch elegantere Varianten dafür?)

Ja, den Taster gegen GND schalten und den internen Pullup aktivieren.

Wenn ein Inputpin floatet, ist es egal, ob Attiny85 oder 84. Er macht 
bei beiden Mist.
Vielleicht hast Du ja auf der 85-Platine durch Flußmittelreste einen 
hochohmigen Pulldown.

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.