Hey Leute eine kurze Frage, da wir hier GAR NICHMTEHR weiterkommen! Was machen wir mit dem interrupt falsch? #include <avr/interrupt.h> #include <avr/io.h> ISR(INT0_vect) { PORTD = 0x80; } int main() { DDRD = 0xFB; MCUCR = 0x0F; sei(); PORTD = 0x40; } (Falls ihr des hinkriegt schicken wir euch noch unseren richtigen Code ;) ) Versuchen gerade was mit RFID´s hängen aber mit den Interrupts sowas von, sodass wir gerade verzweifeln. AVR Studio 4, Atmega8 Mikrocontroller. Danke schonnmal für eure Hilfe MfG Interruptor
Ja das return fehlt^^. Die Funktion ist ein Test und soll so einfach wie möglich gestrickt sein. D.h. sie hat keien sinnvolle Aufgabe. Sie soll uns nur Zeigen, ob unser Interrupt funktioniert
Interruptor schrieb: > D.h. sie hat keien sinnvolle Aufgabe. Sie soll > uns nur Zeigen, ob unser Interrupt funktioniert Eben. Aber da die Welt mit dem Ende von main() offiziell aufhört, wieso sollte dann der Interrupt noch funktionieren?
Sry da war wohl ein Witzbold schnell mal am PC-.- Ja mit ner while schleife will das ganze ding auch nich tun. wir sind total verzweifelt. Könnte einer vllt mal einen total einfachen code für ein interrupt posten?
Interruptor schrieb: > Ja das Interrupt soll ja noch in der main aufgerunfen werden Ohne die Schleife ist main() evtl. schon durch bevor er aktiv wird. Ausserdem müsste der externe Interrupt erst einmal eingeschaltet werden, nicht nur konfiguriert (GICR).
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts ist sicher nicht falsch.
Rene H. schrieb: > Irgendwo sollte da noch ein while(1) stehen ;-) macht es doch, hinter der main baut dir die libc soetwas immer ein. Damit spart man sich sogar code.
Peter II schrieb: > macht es doch, hinter der main baut dir die libc soetwas immer ein. > Damit spart man sich sogar code. Yep, aber gerüchteweise steht ein CLI vor dieser Schleife. ;-)
> #include <avr/interrupt.h> > #include <avr/io.h> Logisch falsche Reihenfolge - hier spezielles Include vor dem allgemeinen Include. > MCUCR = 0x0F; Was soll diese Zeile laut Datenblatt bewirken? > PORTD = 0x80; > DDRD = 0xFB; // PORTD Pin2 Eingang, alle anderen Ausgang > PORTD = 0x40; Was erwartet ihr in eurer Schaltung von PORTD Pin7 und Pin3? Was in eurer Schaltung soll INT0 an PRTD Pin2 auslösen? Was hält den Ruhepegel (= Nicht-IRQ) auf HIGH? > while(1)... Diese Arbeitsschleife fehlt. Grob gesagt: main() sollte in einem µC Programm regulär nicht verlassen werden. Die "Falle" hier: Die avr-libc fügt ein while(1); im Exitcode ein. Aber das ist nur ein Däumchendrehen. Ich denke, dass ihr eine ständige Reaktion auf Pin2 und Wechsel an den Pins 7 und 3 vermisst. Das wäre mit obigem Code erklärlich.
GICR ist gesetzt, allemöglichen Hilfen und Datenblätter und Codes schon durchgelesen aber wir kommen einfach nicht weiter. Könnte es an einer Compiler-Version liegen? Der Code an sich müsste ja stimmen....oda?!
Interruptor schrieb: > Der Code an sich müsste ja stimmen....oda?! Welcher? Der einzig gezeigte Code stimmt nicht.
Der µC macht hinter main weiter ! Da sollten zwar nur nops stehen bis er am ende vom flash ankommt. Dann läuft der PC über und sollte wieder bei 0 beginnen. Da sollte der Reset Vector stehen und ihn erneut in die main schicken. Der Interupt müßte funktionieren. Ist aber trotzdem falsch programmiert. Probiert doch mal den INT0 anzuschalten im GICR Bit 6.
Uwe schrieb: > Der µC macht hinter main weiter ! Irgendwie schon ... > Da sollten zwar nur nops stehen bis er am ende vom flash ankommt. ... aber nicht so. Main wird vom Startup-Code der Lib aufgerufen und hinter diesem Aufruf geht es weiter. Mit einem CLI und einer Totschleife. Mit Interrupts wird das dann also nix mehr.
Erstmal danke. Wir haben "einen" Fehler gefunden und jetz funktionierts ;) (Aber nicht in dem kleinen Programm hier sondern in unserem Hauptprogramm). Trotzdem danke an alle
Wenn ihr schon keine Hexadezimalen Zahlen gut lesen und schreiben könnt, DANN macht sowas doch nicht ! Dann benutzt wenigstens 0b00000100 ! Besser noch PORTD |= (1<<PD2); oder GICR |= (1 << INT0) | (1 << INT1);
Krapao schrieb: > Die "Falle" hier: Die avr-libc fügt ein while(1); im Exitcode ein. Und ein CLI:
1 | 00003c84 <_exit>: |
2 | 3c84: f8 94 cli |
3 | |
4 | 00003c86 <__stop_program>: |
5 | 3c86: ff cf rjmp .-2 ; 0x3c86 <__stop_program> |
Peter
> Ja das Interrupt soll ja noch in der main aufgerunfen werden aber nicht mit PORTD = 0x40; sondern mit PORTD = 0x04; > Erstmal danke. Wir haben "einen" Fehler gefunden > (Aber nicht in dem kleinen Programm hier sondern in unserem > Hauptprogramm) jaja
Uwe schrieb: > jaja Lass mal. Das eigentliche Programm ist offenbar so geheim, dass man einen völlig anderen Code mit völlig anderen Fehlern postet, um das völlig andere Problem im eigentlichen Programm zu lösen. Und was soll man sagen - dieser Ansatz hat sogar funktioniert!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.