ATmega8 INT0 mit AVR Studio Simulation

Gast #454764
Lesenswert?
• ▲
▼
Hallo!

Hab gerade angefangen den INT0 des ATMega8 auszuprobieren.
Dazu verwende ich folgenden Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4
 
5
ISR(_VECTOR(1)) { // INT0
6
cli(); // Interrupts abschalten
7
PORTB |= (1<<PB1); // PB.1 setzen
8

9
}
10

11
int main(void)
12
{
13

14
DDRB = 0b00000011; // 0-1: Ausgang
15
DDRD = 0x00; // Eingänge
16
GIMSK |= (1<<INT0); // INT0 aktivieren
17
MCUCR |= ((1<<ISC01) | (1<<ISC00)); // bei steigender Flanke
18

19
sei(); // Interrupts aktivieren
20
 
21
while (1) {
22
PORTB ^= (1<<PB0); // PB.0 toggeln
23
}
24

25
}
Den PB.0 toggle ich, um zu sehen dass das Programm rennt. Wenn ich dann 
denn Pin D.2 auf high setze, wird auch die richtige Funktion aufgerufen 
aber es passiert dort nichts. Den PB1 kann ich nicht auf high setzen und 
eigentlich sollten ja die Interrups dann golbal deaktiviert sein, oder?
Wenn ich dann aber den INT0 Pin wieder auf 0 und dann auf 1 setze, wird 
der Interrupt erneut aufgerufen und es passiert nichts.

Was mache ich falsch?

Danke schonmal,
wulf
Gast #454780
Lesenswert?
• ▲
▼
Versuch' mal die ISR so aufzurufen:

SIGNAL (SIG_INTERRUPT0)
{

}

Das CLI kannst du dir sparen, da das beim Aufruf der ISR sowieso 
passiert. Der globale INT wird beim Verlassen der ISR 'SIGNAL' wieder 
gesetzt, wenn du 'INTERRUPT' statt dessen verwendest musst du das 
Globale 'I'-Flag von Hand wieder setzen. Siehe AVR-LibC.
Gast #454782
Lesenswert?
• ▲
▼
Danke für die Antwort!
Hab nun SIG_INTERRUPT0 probiert und es geht wieder nicht, wie ich will.

Das Programm soll keine besondere Funktion haben, nur Versuche.
Ich hätte gerne, dass der INT0 ein einziges mal aufgerufen wird; dort 
ALLE Interrupts deaktiviert werden und somit von selbst nie wieder 
auftreten.
Gast #454785
Lesenswert?
• ▲
▼
Mittlerweile wieder selbst ein bisschen experimentiert:
wenn ich einfach den INT0 Interrupt abdrehe (in der INT0-Routine), dann 
wird beim nächsten Ansteigen des Signals nur das entsprechende Flag 
gesetzt, aber die Routine wird nicht mehr aufgerufen.

Aber wieso kann ich mit cli() nicht einfach alles abdrehen?
Gast #454787
Lesenswert?
• ▲
▼
Du brauchst nur den INT0 deaktivieren, das Register heißt übrigens GICR, 
nicht GIMSK. Ist vermutlich auch der Fehler.

SIGNAL (SIG_INTERRUPT0)
{
    GICR &= ~(1<<INT0);
    PORTB |= (1<<PB1);    // PB.1 setzen
}
Gast #454789
Lesenswert?
• ▲
▼
Upps.. Zeitüberschneidung.
Wenn die ISR wieder verlassen wird wird der Globale INT ('I'-Flag) 
wieder gesetzt, hab' ich oben schon geschrieben. Mit INTERRUPT statt 
SIGNAL als ISR kannst du auch das 'I'-Flag löschen.
Gast #454795
Lesenswert?
• ▲
▼
> Mit INTERRUPT statt SIGNAL als ISR kannst du auch das 'I'-Flag löschen.
Also INTERRUPT(SIG_INTERRUPT0) {} ?
Da tut sich bei mir nichts.
ISR(SIG...) schaltet nichts aus und SIGNAL(SIG...) auch nicht.

Aber es geht eh mit GICR &= ~(1<<INT0);
Den PB.1 konnte ich nicht setzen, da ich ja in der main() als 
Endlosscheife mit diesem Port arbeite; jetzt wird in der main() die ISR 
aufgerufen und beim Rückkehren schreibt es halt den 
zwischengespeicherten Registerwert auf den Port, so dass meine 
Änderungen in der ISR verloren gehen. Das hab ich aber mittlerweile eh 
schon gelöst

Danke nochmal!

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.