mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik interrupt avr


Autor: ich (Gast)
Datum:
Angehängte Dateien:
  • preview image for oz.JPG
    oz.JPG
    57,5 KB, 91 Downloads

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: honkmichi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: honkmichi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ich (Gast)
Datum:

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dass das array überläuft ist nicht der grund

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?*/
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.