Forum: Mikrocontroller und Digitale Elektronik Probleme mit externem interrupt


von Interrupter (Gast)


Lesenswert?

Hallo,
ich würde gerne den externen Interrupt benutzen, um den Conrtoler wieder 
aus dem Sleep mode zu holen.
Das war zumindest der Plan...

Es scheitert aber leider schon daran, dass der Interrupt nicht ausgelöst 
wird.... ich habe das ganze jetzt soweit reduziert, dass nur der 
Interrupt ausgelöst werden soll und dadurch PORTB auf 0 setzt.
Dadurch sollten dann die LEDS am STK500 angehen.

PORT D ist an die Taster angeschlossen und PORT B an die LEDS.
Als Controler wird ein ATMEGA32 verwendet.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main() {
5
6
MCUCR |= (1<<ISC00); // Any logical change on INT0 generates an interrupt request
7
GICR |= (1<<INT0); // enables INT0
8
sei(); // enables interrupts
9
10
  while(1){
11
12
  }
13
  
14
  return 0;
15
}
16
17
ISR(INT0_vect)
18
{
19
        DDRB = 0xFF;
20
  PORTB = 0x00; // turn on leds
21
}

Kann mir jemand weiter helfen? Ich komme leider nicht darauf, warum der 
Interrupt nicht ausgelöst wird.

Danke schonmal für die Antworten!

Schöne Grüße

von Carsten R. (kaffeetante)


Lesenswert?

Ich weiß nicht ob ich den richtigen Schaltplan habe.
Ich habe das STK500 nicht.
Aber bist Du dir sicher daß PortB auf 00 gesetzt werden soll und nicht 
auf FF um die LED einzuschalten?

Ich hab einen Schaltplan gefunden bei dem, wenn ich es auf die schnelle 
richtig sehe, die Kontakte von J800 mit J705 verbunden werden müssen und 
dann wären 8 LED am Port.

Um nicht in solche Fallen zu laufen würde ich mit 00001111 oder 01010101 
initialisieren und den Port in der ISR bei jedem Tastendruck 
invertieren. Erstens muß man sich dann keine Gedanken darum machen wie 
herum die LED angeschlossen sind. Zweitens sieht man dann ob der 
Mikrocontroller es überhaupt durch die Initialisierung schafft, bzw. ob 
die Brücken gesetzt sind.

von Peter D. (peda)


Lesenswert?

Table 14. Active Clock Domains and Wake Up Sources in the Different 
Sleep Modes

Fußnote 3 lesen.

von Carsten R. (kaffeetante)


Lesenswert?

Aus dem Handbuch des ATMega16 (baugleich zum ATMega32 bis auf 
Speichergröße.) Hatte das Handbch gerade da, das des 32er hätte ich noch 
suchen müssen ;-)

Zitat:

When the external interrupt is enabled and is configured as level 
triggered (only INT0/INT1), the interrupt will trigger as long as the 
pins held low. Note that recognition of falling or rising edge 
interrupts on INT0 and INT1 requires the presence of an I/O clock, 
described in “Clock Systems and their Distribution” on page 22.

Daher:

Stelle mal von PIN-Change-Interrupt, der Interrupt wird durch die Flanke 
eines Pegelwechsels ausgelöst, auf Level-Interrupt um. Da wird dann der 
Interrpt durch einen Low-Pegel ausgelöst. Int2 unterstützt diesen Modus 
nicht, aber Int0 und Int1.

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.