Atmega resettet nach externem Interrupt

Gast #3223288
Lesenswert?

Hi,
ich sitze gerade vor meinem avr (atmega644) und schaffe es nicht über 
einen externen Interrupt (PCINT) eine LED anzustellen. Anstelle dessen 
resettet das Teil einfach...
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define LED1 PA0
5
#define LED2 PA1
6
#define LED_DDR DDRA
7
#define LED_PORT PORTA
8

9

10
int main (void)
11
{
12
  
13
  // LED SETUP
14
  // LED1 soll angeschaltet werden
15
  LED_DDR |= (1 << LED1);   // LED 1 als output
16
  LED_PORT &= ~(1 << LED1); // LED OFF
17
  
18
        // LED2 ist immer an
19
  LED_DDR |= (1 << LED2);
20
  LED_PORT |= (1 << LED2);  //LED ON   
21
  
22
  
23
  DDRA &= ~(1 << PA2);    // Set input
24
  PORTA |= (1 << PA2);  // Pullup resistor
25

26
  // Pin Change Interrupt 2
27
  PCICR |= (1 << PCIE0);  
28
  PCMSK0 |= (1 << PCINT2);
29

30
  sei();
31

32
  while (1)
33
  {
34
  }
35

36
}
37

38

39

40
ISR (PCINT2_vect)
41
{
42
   LED_PORT |= (1 << LED1 );  
43
}

Wo ich nun nicht 100% ig sicher bin:
Ich habe nun einen Taster zwischen GND und PA2 gelegt.
Eigentlich müssten ja nun auch noch +5V an PA2 -- da der nun aber jetzt 
schon die ganze Zeit resettet, habe ich Angst, dass da nun irgendwie ein 
Kurzschluss oder so ist und ich den avr kille...

Beste Grüße,
Lars
Gast #3223306
Lesenswert?

Lars schrieb:
> Ist es nicht so, dass ich einen Interrupt durch PA2 ausgelöst haben
> möchte und somit auch PCINT2_vect nutze?

Die PCINTs meist eines ganzen Ports geht immer auf einen einzelnen 
PC-Interruptvektor, hier auf 0. Da der aber nicht im Code drin ist, geht 
er auf bad interrupt und dann zum Reset.
Gast #3223309
Lesenswert?

Achso! Dann habe ich das falsch verstanden.

Mit meinem Anschluss der Buttons liege ich richtig?

+5V an PA2 und
den Button zwischen PA2 und GND.

Widerstand benötige ich ja nicht, wegen des PullUps.

Haut das hin?
Gast #3223318
Lesenswert?

Lars schrieb:
> Widerstand benötige ich ja nicht, wegen des PullUps.
>
> Haut das hin?

Es könnte jedoch sein, dass das Setzen des internen Pullups bereits das 
PCINT0-Interruptflag setzt, somit würde sofort nach sei() der Interrupt 
ausgelöst. Also ggf. das Flag vor sei() löschen.
Gast #3223331
Lesenswert?

Hi

>Es könnte jedoch sein, dass das Setzen des internen Pullups bereits das
>PCINT0-Interruptflag setzt, somit würde sofort nach sei() der Interrupt
>ausgelöst. Also ggf. das Flag vor sei() löschen.

Der PC-Interrupt wird erst nach der Konfiguration des PINs aktiviert. 
Warum sollte da etwas auslösen?

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren