#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.
