Forum: Mikrocontroller und Digitale Elektronik interrupt avr


von ich (Gast)


Angehängte Dateien:

Lesenswert?

#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

von Roland P. (pram)


Lesenswert?

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

von honkmichi (Gast)


Lesenswert?

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

von honkmichi (Gast)


Lesenswert?

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?

von ich (Gast)


Lesenswert?

könnte sein aber es kann doch nicht sein das sich wegen einem array
überlauf der proz "erhängt"

von ich (Gast)


Lesenswert?

dass das array überläuft ist nicht der grund

von ich (Gast)


Lesenswert?

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?*/
}

von Peter D. (peda)


Lesenswert?

@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

von Lutz Müller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.