Forum: Mikrocontroller und Digitale Elektronik attiny84 - Interrupt


von Matthias S. (jadermatze)


Lesenswert?

Hallo,

habe einen attiny84 über Pin 0 an einem Arduino Uno hängen. Ich möchte 
nun das ein Interrupt ausgelöst wird sobald sich der Pin ändert. Leider 
funktioniert mein sketch nicht :-( hab leider keine Ahnung warum :-P
1
volatile bool Interrupt = false;
2
3
const int Data0Pin = 0;
4
const int LedPin = 5;
5
6
void setup() 
7
{
8
  noInterrupts();  
9
  
10
  pinMode(LedPin, OUTPUT);
11
  pinMode(Data0Pin, INPUT);
12
  attachInterrupt(PCINT0, InterruptVoid, CHANGE);
13
14
  interrupts();
15
}
16
17
18
void loop() 
19
{
20
    if(Interrupt)
21
    {
22
      digitalWrite(LedPin, HIGH);
23
      delay(200);
24
      digitalWrite(LedPin, LOW);    
25
      delay(1000);
26
    }
27
}
28
29
void InterruptVoid()
30
{    
31
  Interrupt = true;   
32
}

Nutze die Arduino IDE 1.8.4

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Dir ist schon klar, dass Beim UNO pin 0 und 1 von der Seriellen 
Schnittstelle belegt sind?

von Matthias S. (jadermatze)


Lesenswert?

Ja ist mir klar :-) das ist der sketch für den attiny84 der hängt über 
Pin 0 an Pin 13 von meinem Uno

von Karl M. (Gast)


Lesenswert?

Hallo,

zur Logik,

einmal wahr - immer - wahr.
1
if (Interrupt) { ... }

von Matthias S. (jadermatze)


Lesenswert?

Hast recht...

ist aber nur ein kleinter test sketch um zu sehen ob der Interrupt 
überhaupt ausgelöst wird. Leider fehlanzeige die LED fängt nicht an zu 
blinken. :(

von Mario M. (thelonging)


Lesenswert?

Es gibt für den ATTiny84 ein alternatives Mapping, da liegt Pin "0" auf 
PB0 und nutzt den PCINT8. Siehe: 
https://github.com/SpenceKonde/ATTinyCore#attiny-244484

von Matthias S. (jadermatze)


Lesenswert?

war leider nicht die Lösung :(

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


Lesenswert?

Hi

Horchst Du am richtigen Pin?
Habe jetzt nicht gesucht, welcher Pin PCINT0 beim ATtiny84 ist und gehe 
davon aus, daß Du das Signal am falschen Pin anlegst.

Oder

Kommt überhaupt ein Signal?

Dann bin ich Gestern auch über die Benennung der Interrupt-Pins 
gestolpert - klar, finde ich jetzt nicht (3 PDFs durchgestöbert, war's 
aber nicht bei).
War, sinngemäß in die Richtung:

attachInterrupt(PinATtiny84INT0, InterruptVoid, CHANGE);
Also die Zahl, Die der Compiler in dem Befehl einsetzt, ist in den 
Tiefen bereits voreingestellt und wohl für jeden als Arduino verbauten 
Chip enthalten - man muß halt 'nur noch' herausfinden, wie diese 
Umbiege-Variable sich nennt.

MfG

von Matthias S. (jadermatze)


Lesenswert?

Danke für die vielen Antworten leider hat nix geholfen :-( hat noch 
jemand eine Idee?

von Einer K. (Gast)


Lesenswert?

Ja!

Datenblatt lesen.
Und Interruptabhandlung selber schreiben.

von Peter D. (peda)


Lesenswert?

Matthias S. schrieb:
> Danke für die vielen Antworten leider hat nix geholfen :-(

Für einen Pin-Change-Interrupt mußt Du den gewünschten Vektor im GIMSK 
und den gewünschten Pin im PCMSK0/1 freigeben.
Das Datenblatt ist eigentlich gut verständlich.
Ob man erst noch den Umweg über die Arduino Pin-Mapping Tabellen geht, 
muß jeder selber entscheiden.

von Einer K. (Gast)


Lesenswert?

Matthias S. schrieb:
> attachInterrupt(PCINT0, InterruptVoid, CHANGE)

attachInterrupt() wird normalerweise für INT0 usw. genutzt.
Nicht für PCINT

Siehe dazu auch:
https://www.arduino.cc/en/Reference/AttachInterrupt
https://playground.arduino.cc/Main/PinChangeInterrupt

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.