Forum: Mikrocontroller und Digitale Elektronik Attiny13 pin change interrupts


von David P. (devryd)


Lesenswert?

Hallo zusammen,
ich versuche gerade einen attiny13 mit pinchange interrupts zu 
betreiben, allerdings wird kein interrupt ausgelöst (oder vlt auch nur 
nicht abgefangen)
Das hier ist mein Code
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
#include <avr/sleep.h>
5
  
6
  volatile uint8_t auf;
7
  volatile uint8_t zu;
8
  ISR(PCINT){
9
    if(PINB & 0b00000001)
10
      auf=1;
11
    if(PINB & 0b00000010)
12
      zu=1;
13
  }
14
15
void open(){
16
  PORTB &= ~(0b00000100);
17
  _delay_ms(500);
18
  PORTB |= 0b00000100;
19
  _delay_ms(50);  
20
}
21
22
void close(){
23
  PORTB &= ~(0b00001000);
24
  _delay_ms(500);
25
  PORTB |= 0b00001000;
26
  _delay_ms(50);
27
  
28
}
29
30
31
32
int main(void)
33
{
34
    DDRB |= 0b00001100;     //set pins 2 and 3 as output
35
  PORTB |= 0b00001100;     //set pins 2 and 3 high
36
  PCMSK = 0x03;       //enable pcint0 and 1  
37
  GIMSK |= PCIE;
38
  sei();           //enable interrupts
39
    while (1) 
40
    {
41
    if(auf){
42
      open();
43
      auf=0;
44
    }
45
    if(zu){
46
      close();
47
      zu=0;
48
    }
49
    //set_sleep_mode(SLEEP_MODE_PWR_DOWN);
50
    //sleep_mode();
51
    }
52
}

Hat jemand ne idee, woran es liegen kann?

von Stefan F. (Gast)


Lesenswert?

Du hast den falschen Interrupt Vektor verwendet. Bekommst du da keine 
Compiler-Warnung? Benutze mal den gcc Parameter -Wall!

Und dann schau dort nach, wie die Vektoren wirklich heissen: 
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Du hast den falschen Interrupt Vektor verwendet.

Das ist nicht ganz korrekt. Er hat vielmehr keinen verwendet.

von David P. (devryd)


Lesenswert?

Ist die Zeile so korrekt?
1
ISR(PCINT0_vect){

Falls ja, muss noch was anderes falsch sein, denn es geht immer noch 
nicht.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der Vektor ist jetzt richtig.

David P. schrieb:
> GIMSK |= PCIE;

Das klappt so nicht. Wie immer muss es
1
GIMSK |= (1 << PCIE);
heissen.

: Bearbeitet durch User
von David P. (devryd)


Lesenswert?

Ah ja, danke.
Jetzt gehts.

von c-hater (Gast)


Lesenswert?

David P. schrieb:

> Ah ja, danke.
> Jetzt gehts.

Immer wieder faszinierend: kaum macht man's richtig, schon 
funktioniert's. ;o)

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.