Atmega resettet nach externem Interrupt

Gast #3223288
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 #3223302
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
Gast #3223306
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.