Forum: Mikrocontroller und Digitale Elektronik Interrupts am ATmega256RFR2


von Scorpion008 (Gast)


Lesenswert?

Hallo!

Ich habe am Pin PB1 des ATmega256RFR2 einen Taster (mit PullDown) 
angeschlossen, der den externen Interrupt INT1 auslösen soll.

Zum testen habe ich dafür folgenden Code geschrieben, der beim Auslösen 
des Interrupts die LED des Xplained Pro ATmega256RFR2 Boards (an PB4, 
leuchtet bei Low-Pegel) einschalten soll. Leider geschieht dies aber 
nicht.

Gibt es vielleicht irgendetwas was ich dabei noch übersehen habe? Ich 
habe jetzt schon mehrmals den Teil des Datenblattes durchgelesen und 
sollte eigentlich alle notwendigen Bits gesetzt haben. Ich stehe auf dem 
Schlauch.

Gruß
Scorpion
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
ISR(INT1_vect)
5
{
6
  PORTB &= ~(1 << PB4);
7
}
8
9
int main (void)
10
{
11
  //LED INIT
12
  DDRB |= (1<<PB4);
13
  PORTB |= (1 << PB4);
14
15
  //UART INIT
16
  //SREG  |= (1 << 7);                       //Global Interrupt enable
17
  EIMSK |= (1<<INT1);                       //Interrupt mask
18
  EICRA |= ((1 << ISC11) | (1 << ISC10));   //External Interrupt Control Register A, INT0 at rising edge
19
20
  sei();
21
22
  while (1)
23
  {
24
  }
25
}

von Christian H. (scorpion008)


Lesenswert?

1
//UART INIT
 ist natürlich Bullshit, soll INTERRUPT INIT heissen :/

Per Polling (Abfrage in der while-Schleife) hat das ganze schon 
geklappt, weswegen ich einen Hardwarefehler ausschließen würde.

von S. Landolt (Gast)


Lesenswert?

> am Pin PB1 ... externen Interrupt INT1
INT1 liegt jedoch auf PD1.

von Dietrich L. (dietrichl)


Lesenswert?

Dumme Frage: ist der richtige µC-Typ angegeben? Bei einem anderen liegen 
die Bits u.U. woanders.
1
  EIMSK |= (1<<INT1);                       //Interrupt mask
2
  EICRA |= ((1 << ISC11) | (1 << ISC10));   //External Interrupt Control Register A, INT0 at rising edge

Nur zum Test: dreh mal die Reihenfolge um.
Das ist zwar unwahrscheinlich, aber bei einem Timer hatte ich mal so ein 
Problem (glaube ich...).

Gruß Dietrich

von Dietrich L. (dietrichl)


Lesenswert?

S. Landolt schrieb:
>> am Pin PB1 ... externen Interrupt INT1
> INT1 liegt jedoch auf PD1.

Bei "meinem" Datenblatt
http://www.atmel.com/images/atmel-8393-mcu_wireless-atmega256rfr2-atmega128rfr2-atmega64rfr2_datasheet.pdf
auf Seite 2 und Seite 226 steht aber PB1.

Gruß Dietrich

von holger (Gast)


Lesenswert?

PCINT1 ist nicht INT1

von Christian H. (scorpion008)


Lesenswert?

Oh man, das war tatsächlich mein Fehler. Ich bin bis jetzt aus irgend 
einem Grund immer davon ausgegangen, dass der Interrupt INT1 am 
Anschluss PCINT1 liegt.

An PD1 klappt das ganze jetzt.

Vielen Dank!

von S. Landolt (Gast)


Lesenswert?

Typische Verwechslung.

von Christian H. (scorpion008)


Lesenswert?

Jo, das schlimme daran ist aber das ich da gestern und heute bestimmt 
schon 10 mal drübergekuckt habe um den Fehler zu finden. Die senkrechte 
Schrift hilft dabei auch nicht unbedingt.

Wenigstens gibt mir Dietrich aber das Gefühl, nicht der einzige zu sein, 
der sowas überliest :D. Bin natürlich trotzdem dankbar für den Tipp

von Dietrich L. (dietrichl)


Lesenswert?

Christian H. schrieb:
> Wenigstens gibt mir Dietrich aber das Gefühl, nicht der einzige zu sein,
> der sowas überliest :D.

Gern geschehen ;-))

von S. Landolt (Gast)


Lesenswert?

> gibt mir Dietrich aber das Gefühl, nicht der einzige zu sein
Wir sind mindestens zu dritt.

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.