www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array in ISR von UART


Autor: Hendrik Ebert (htrik)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich verwende einen PIC16F876 um per UART Daten zu empfangen und die dann 
über ein LCD auszugeben. Jetzt taucht da dauernt der Fehler:

FSR not saved/restored during interrupt 'ISR'

auf.

Ich weiß nur nicht was ich falsch gemacht haben könnte.
Wenn ich das ganze ohne Array in das LCD schreibe funktioniert das. Will 
ich das Array zu Hilfe nehmen klappts wiederum nicht.
Vielleicht wird jemand von euch schlau draus.
Wär echt nett wenn mir jemand helfen könnte.

Achso der Quelltext und die Fehler .occ sind im angefügten .zip!


Gruß
Htrik

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,
gibts hier keinen, der mir bei meinem Problem helfen  kann?
Gruß
Htrik

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  (Please read 'int16cxx.h')

Hast du schon mal in diese Datei reingeschaut, ob da irgendein Hinweis 
enthalten ist?

Autor: Hendrik Ebert (htrik)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja hab die mir schon durchgelesen. Bin bezüglich meines Problems nur 
nicht schlauer geworden.
Vielleicht versteh ichs auch nicht. Wenn jemand mal in die Datei 
reinschauen mag, ich hab se angehängt.

Gruß
Htrik

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat zwar jetzt nichts mit deinem Problem an sich zu tun. Aber den goto 
solltest du da rauswerfen. goto ist etwas was man in C nur ganz selten 
benutzt (zb um gemeinsame Fehlerbehandlungen zu machen). In deinem Fall 
gibt es keinen Grund dafür.
  if (RCIF==1)
  {
    USB_zeichen=RCREG;      // in RCREG stehen die Empfangenen Daten
    if (USB_zeichen==0x2A){LCD_BEFEHL(LCD_CLR);LCD_BEFEHL(LCD_ON_C);i=0;goto neu;}  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht
  
  
    USB_speichern(USB_zeichen);

neu:
  
  }

ist vollkommen äquivalent zu
  if (RCIF==1)
  {
    USB_zeichen=RCREG;      // in RCREG stehen die Empfangenen Daten
    if (USB_zeichen==0x2A)
    {
      LCD_BEFEHL(LCD_CLR);
      LCD_BEFEHL(LCD_ON_C);
      i=0;
    }  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht

    else  
      USB_speichern(USB_zeichen);
  }

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht anscheinend um diesen Codeabschnitt:

interrupt ISR(void)
{
  int_save_registers //Daten des Programms in einen Speicher Retten

  if (RCIF==1)
  {
    USB_zeichen=RCREG; // in RCREG stehen die Empfangenen Daten
    if (USB_zeichen==0x2A)
    {
      LCD_BEFEHL(LCD_CLR);
      LCD_BEFEHL(LCD_ON_C);
      i=0;
      goto neu;
    }  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht
    USB_speichern(USB_zeichen);

neu:
  }

  int_restore_registers   //Daten wieder aus dem Speicher holen
}


Gemäß Kommentar in 
http://www.isk.kth.se/~mamoon/Mamoon%20work/INT16CXX.H würde ich das 
umschreiben zu:

interrupt ISR(void)
{
  int_save_registers //Daten des Programms in einen Speicher Retten
  char sv_FSR = FSR; // save FSR if required

  if (RCIF==1)
  {
    USB_zeichen=RCREG; // in RCREG stehen die Empfangenen Daten
    if (USB_zeichen==0x2A)
    {
      LCD_BEFEHL(LCD_CLR);
      LCD_BEFEHL(LCD_ON_C);
      i=0;
      goto neu;
    }  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht
    USB_speichern(USB_zeichen);

neu:
  }

  FSR = sv_FSR;       // restore FSR if saved
  int_restore_registers   //Daten wieder aus dem Speicher holen
}


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hendrik Ebert wrote:
> Ja hab die mir schon durchgelesen. Bin bezüglich meines Problems nur
> nicht schlauer geworden.

Ach?

Wenn ich das Header File 5 Sekunden überfliege, dann seh ich einen 
offensichtlich als Beispiel gedachten Abschnitt
   interrupt serverX( void)
   {
       /* W and STATUS are saved by the next macro. PCLATH is also
          saved if necessary. The code produced is CPU-dependent. */

       int_save_registers    // W, STATUS (and PCLATH if required)

       //char sv_FSR = FSR;  // save FSR if required

       // handle the interrupt (insert application code here)

       //FSR = sv_FSR;       // restore FSR if saved

       int_restore_registers // W, STATUS (and PCLATH if required)


und deine Fehlermeldung spricht über ein nicht gesichertes FSR Register. 
Da frag ich mich doch glatt, was wohl

       //char sv_FSR = FSR;  // save FSR if required

bedeuten könnte und was mir der Autor dieser H-Datei damit wohl sagen 
will?

Edit: Und die letzte Frage beantwortet sich dann auch gleich von selber, 
denn der Autor hat gleich nach dem Beispielcode einen wunderschönen 
Absatz geschrieben, indem er noch mal ausführt, dass der Compiler das 
FSR Register zwar nicht automatisch sichert, allerdings prüft ob es 
notwendig wäre und man dann in so einem Fall das Sichern mit der Hand 
machen müsste.

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha,
hab ich nicht gesehen. Sry. Danke aber für die antworten!

Gruß
Htrik

Autor: Hendrik Ebert (htrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habs gleich verändert. Funktioniert jetzt auch!
Danke nochmal!

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.