Forum: Mikrocontroller und Digitale Elektronik Atmega resettet nach externem Interrupt


von Lars (Gast)


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

von Spess53 (Gast)


Lesenswert?

Hi

>ISR (PCINT2_vect)

Du brauchst aber PCINT0_vect.

MfG Spess

von Mike (Gast)


Lesenswert?

Lars schrieb:
> Eigentlich müssten ja nun auch noch +5V an PA2

Hast du doch

> PORTA |= (1 << PA2);  // Pullup resistor

von Lars (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

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

Nein. Die Eingänge PCINT0...PCINT7 lösen den Interrupt PCINT0 aus.

MfG Spess

von MWS (Gast)


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.

von Lars (Gast)


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?

von Hubert G. (hubertg)


Lesenswert?

Lars schrieb:
> +5V an PA2 und

Das solltest du auf jeden Fall nicht machen.

von MWS (Gast)


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.

von Spess53 (Gast)


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

von MWS (Gast)


Lesenswert?

Spess53 schrieb:
> Warum sollte da etwas auslösen?

Richtig.

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.