Probleme mit externem interrupt

Gast #3312867
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
#3312931
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.
#3314560
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.