Forum: Mikrocontroller und Digitale Elektronik Pin Change Interrupt verursacht, dass der Atmega sich resetet


von Grevak D. (xorda)


Lesenswert?

Hallo,

ich habe eine Schaltung mit einer 7-Segment-Anzeige und 2 Taster. 
Verwendeter µC Atmega328P-PU

Ich wollte, dass wenn man den rechten Taster drückt, dass der 
Dezimalpunkt bei jedem Schritt des Lauflichts blinkt. Das geht schonmal

Der linke Taster soll den Zustand des Dezimalpunktes wechseln bei jedem 
kompletten Umlauf des Lauflichts, aber so dass der Dezimalpunkt sofort 
leuchtet beim Drücken und bei genau dieser Stelle immer wieder wechselt

Dazu wollte ich Pin Change Interrupts verwenden. Allerdings klappt das 
nicht, da der Atmega sich resetet, wenn der Interrupt auftritt.

Was kann ich tun? Hier ist der Testcode für den PCINT
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <avr/interrupt.h>
6
7
ISR(PCINT1_vect) {
8
  PORTB = 0b00000100;
9
}
10
11
int main() {
12
  DDRD = 0b00111111;
13
  DDRB = 0b00000100;
14
15
  PCMSK0 = (1 << PCINT1);
16
  PCICR = (1 << PCIE0);
17
  sei();
18
19
  uint8_t input;
20
  while(1) {
21
    for(int i = 0; i < 6; ++i) {
22
      _delay_ms(200);
23
      
24
      PORTD = 0b00100000 >> i;
25
      
26
      input = PINB;
27
      input &= 0b00000001;  
28
      if(input != 0) {
29
        PORTB ^= 0b00000100;
30
      }
31
    }
32
  }
33
}

Das ist erst noch Test, deshalb wird in der ISR nur ein Pin gesetzt

Danke für jede Hilfe

von Thomas E. (thomase)


Lesenswert?

Grevak D. schrieb:
> ISR(PCINT1_vect) {
>   PORTB = 0b00000100;
> }

Der Vektor für PCINT0..PCINT7 heißt PCINT0_vect.

von Grevak D. (xorda)


Lesenswert?

Achso danke. Es klappt :D

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.