Interrupts auf ATTINY84 vs ATTINY85

Gast #5125537
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
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
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?)
#5125692
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.