#include <inttypes.h> #include <avr/io.h> #include <avr/signal.h> #define ADRESS 0x1100 unsigned char speicher=0; unsigned char save[20]; unsigned char i=0; SIGNAL(SIG_INTERRUPT0){ unsigned char *USBPoint= (unsigned char*)(ADRESS); save[i]=*USBPoint; i++; } void sysinit(void){ DDRG=0x00; PORTG=0x07; SFIOR=SFIOR|0x04; SREG=SREG|0x80; EIMSK=0x03; EICRA=0x00; MCUCR=MCUCR|0x80; XMCRB=0x80; XMCRA=0x1C; DDRD=0XFC; DDRA=0x00; } int main (void){ sysinit(); while(1==1){ PORTD=0xFF; } return (0); } mein problem wenn ich in das while(1==1)befehle schreibe führt der controller(atm128) keine Befehle mehr aus. wenn in while nichts steht wird der interrupt einwandfrei ausgelösst und die befehle in der routine werden ausgeführt. der interrupt wird 4 mal bei low ausgelöst. die grüne linie ist der read pin des atm128. kann mir jemand sagen weshalb ich in while keinen code schreiben kann? suche bereits den ganzen Nachmittag und könnte jetz ein wenig unterstützung gebrauchen! mfg rüdiger
also auf den ersten Blick ist mir das auch rätselhaft. Ich mach meine Mainloops zwar immer mit for(;;) { ... } Trotzdem sollt das keinen Unterschied machen, Schau dir evtl mal den ASM Code in der .S Datei an den der GCC erzeugt vielleicht machst nur einen ganz dummen Fehler und siehst den Wald vor lauter Bäumen nicht. Du kannst das Ganze vllt auch mal im AVRstudio simulieren. Gruß Roland
Was soll dein Programm eigentlich machen? So wie ich das sehe, schreibt er nur FF auf den PortD. Und der Interrupt wird aufgerufen, er bewirkt aber nichts. Kann sein das der Compiler dein Programm optimiert. Und dann bleibt da wohl nichts über von der Routine :-D mfg
Oh, "Und der Interrupt wird aufgerufen, er bewirkt aber nichts." Stimmt ja gar nicht, er schreibt den Speicher voll mittels save. Kann es sein das dein arry überläuft?
könnte sein aber es kann doch nicht sein das sich wegen einem array überlauf der proz "erhängt"
gibt es in c einen Befehl um wieder aus der interruptrutine zu springen? mfg ich SIGNAL(SIG_INTERRUPT0){ unsigned char *USBPoint= (unsigned char*)(ADRESS); save[i]=*USBPoint; i++; /*jump out befehl?*/ }
@ich "dass das array überläuft ist nicht der grund" Ich denke mal, ich programmiere nicht gerade schlecht. Trotzdem würde ich nie behaupten, daß ein Fehler keine Auswirkungen hatte, solange ich ihn nicht auch beseitigt habe. "gibt es in c einen Befehl um wieder aus der interruptrutine zu springen?" Oh Gott !!! Glücklicher Weise nicht. Profis könnten das zwar, würden es aber nie machen, da sie wollen, daß ihre Programme auch funktionieren. Peter
Ich glaube, ich verstehe Deine Frage nicht: ---------------- gibt es in c einen Befehl um wieder aus der interruptrutine zu springen? mfg ich SIGNAL(SIG_INTERRUPT0){ unsigned char *USBPoint= (unsigned char*)(ADRESS); save[i]=*USBPoint; i++; /*jump out befehl?*/ } ------------------ Bei /*jump... ist die ISR in diesem Falle sowieso zu Ende. Und generell kann man mit dem Schlüsselwort "break" auch eine Funktion beenden ... Gruß Lutz
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.