Hallo Leute.
Hab mit ATMEGA Interrupts noch wenig Erfahrung. Hab mich gerade an
meinem ersten interrupt versucht.
Kann mir bitte jemand sagen wieso der nicht funktioniert?
Mfg Martin
#include<avr/io.h>
#include<avr/interrupt.h>
#include <avr/signal.h>
ISP(INT0_vect)
{
PORTA = 0xFF;
}
int main()
{
DDRA = 0xFF; //Port A auf Ausgang
DDRC = 0xFF; //Port C auf Ausgang
MCUCR = (1<<ISC01); //The falling edge of INT1 generates an
interrupt request.
GICR = (1<<INT0); //ExtInterrupt 0 Aktivieren
while(1);
return(0);
}
Gast
#527712
Global Int. freigeben vergessen. SETI();
schalt ich mit SETI alle interrupts frei? oder nur die für die externen Interrupts
Gast
#527715
So natürlich! sei(); cli();
Alle
also "sei" für alle interrupts freischalten und cli() für was?
Martin Worzfeld wrote: > schalt ich mit SETI alle interrupts frei? > oder nur die für die externen Interrupts globale Interruptfreigabe == alle Interrupts. Und das Zeugs heist sei() und nicht SETI int main() { ..... sei(); ..... } "Set Enable Interrupt" - - -
#include<avr/io.h>
#include<avr/interrupt.h>
#include <avr/signal.h>
ISR(INT0_vect)
{
PORTA = 0xFF;
}
int main()
{
DDRA = 0xFF; //Port A auf Ausgang
DDRC = 0xFF; //Port C auf Ausgang
MCUCR = (1<<ISC01); //The falling edge of INT1 generates an
interrupt request.
GICR = (1<<INT0); //ExtInterrupt 0 Aktivieren
sei();
while(1);
return(0);
}
würde also mein Source so stimmen oder?
Martin Worzfeld wrote: > also "sei" für alle interrupts freischalten > und cli() für was? Rate mal.
Gast
#527724
Alle Ints. sei(); ist die Globale interruptfreigabe. Muß in Main stehen gleich nach der Initialisierung von was auch immer.
Martin Worzfeld wrote:
> würde also mein Source so stimmen oder?
Wir würden dir den Spass des ausprobierens nehmen :-)
Gast
#527731
BTW: "SETI" ist ein US-Programm für die Suche nach außerirdischem (intelligentem) Leben (Search for ExtraTerrestrial Intelligence). Damit wirst Du keine Interrupts freigegeben bekommen...;-)
Gast
#527733
Wer sagt das Außerirdische nichts mit Interrupts zu tun haben????
Im Simulator geht das nur, wenn du im Single Step Betrieb durch das Programm gehst (F10). Du drückst also immer wieder F10 bis der Simulator in der while Schleife angelangt ist. Danach toggelst du den richtigen Pin am D-Port und beim nächsten F10 sollte die ISR angesprungen werden.
Gast
#527735
@Karl heinz Buchegger >Und das Zeugs heist sei() und nicht SETI >"Set Enable Interrupt" <Krümelkacke> sei() ist vom ASM Befehl sei abgeleitet. Und der heisst ausgeschrieben SEt I flag Dementsprechend heisst ja auch cli() CLear I flag </Krümelkacke> ;-) Falk
Hab jetzt mal versucht einen Interrupt mit dem INTF0 Flag zu simulieren. Bin mir nicht sicher ob das stimmt. Jedenfalls springt mein Programm dann nicht in die ISR sondern an den BEginn meiner MAIN - Schleife. Kann mir dass jemand erklären? Danke für Antworten. mfg Martin
Martin Worzfeld wrote: > Hab jetzt mal versucht einen Interrupt mit dem INTF0 Flag zu simulieren. > Bin mir nicht sicher ob das stimmt. Jedenfalls springt mein Programm > dann nicht in die ISR sondern an den BEginn meiner MAIN - Schleife. > Kann mir dass jemand erklären? Das ist ein Zeichen dafür, dass mit der ISR Definition was nicht stimmt. Schmeiss als erstes mal den #include "signal.h" raus. Dann als nächstes Überprüfen, ob der in ISR( xxx ) angegebene Name xxx korrekt und richtig ist. Danach überprüfen, ob auch wirklich der richtige Interrupt freigegeben wurde. Ein Sprung an den Beginn von main() ist immer ein Zeichen dafür, dass ein Interrupt erkannt wurde und auch ausgelöst hat, dass aber die 'Verbindung zur ISR' fehlerhaft ist.
Gast
#527758
Hast Du den richtigen Controller im Makefile oder AVRStudio angegeben?
Ich teste derzeit nur softwaremäßig. I verwend einen ATMEGA 16. und der is auch eingestellt
Gast
#527762
@Martin Worzfeld >IN meinem Fall möchte ich den Externen Interrupt 0 ansprchen. >Hab im AVR tutorial für xxx INT0_vect gelesen. Das müsste doch für den >extint 0 stimmen oder nicht. Sollte passen. Hast du auch nicht wieder ISP statt ISR geschrieben? Stell mal deinen Code KOMPLETT als Anhang hier rein. Nix kopieren. MfG Falk
Die restlichen header braucht ihr ned. Haben aber nix mit interrupts oder sonstigem zum tun. danke für eure hilfe
Martin Worzfeld wrote: > Ich teste derzeit nur softwaremäßig. I verwend einen ATMEGA 16. und der > is auch eingestellt Der Vollständigkeit halber: Auch im Simulator richtig eingestellt? Im Simulator gibt es eine extra Einstellung für den Prozessortyp. Wenn man ein neues Projekt erzeugt, stellt AVR Studio beide Einstellungen richtig ein, aber nachschauen kostet nichts.
Gast
#527772
@Martin Worzfeld
>mal die main
Das reicht nicht ganz. Und für deine Test würde ich erstmal die ganzen
überflüssigen includes auskommentieren.
Step by Step.
Was macht Initialize_Interrupts();?
Das mit den Schleifen
for(j= 0; j<= 2000; j++){} //Wait bevor Initialisierung begonnen
wird
ist ne schlechte Idee, die fliegen spätestends bei der Optimierungsstufe
-0s raus. Für sowasnimmt man die _delay_ms() oder _delay_us(), siehe
Doku der libc.
MFG
Falk
> void ISP(INT0_vect)
Da steht immer noch ISP.
Das Teil heist ISR und hat keinen Returntyp
ISR( INT0_vect )
{
// Code
}
Gast
#527779
@Karl heinz Buchegger
>Da steht immer noch ISP.
Hehe, wusste ichs doch ;-)
MfG
Falk
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.