Array in ISR von UART

OP #1202969
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
Angehängte Dateien:
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.
1
  if (RCIF==1)
2
  {
3
    USB_zeichen=RCREG;      // in RCREG stehen die Empfangenen Daten
4
    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
5
  
6
  
7
    USB_speichern(USB_zeichen);
8

9
neu:
10
  
11
  }

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

11
    else  
12
      USB_speichern(USB_zeichen);
13
  }
Persönliche Seite
Es geht anscheinend um diesen Codeabschnitt:
1
interrupt ISR(void)
2
{
3
  int_save_registers //Daten des Programms in einen Speicher Retten
4

5
  if (RCIF==1)
6
  {
7
    USB_zeichen=RCREG; // in RCREG stehen die Empfangenen Daten
8
    if (USB_zeichen==0x2A)
9
    {
10
      LCD_BEFEHL(LCD_CLR);
11
      LCD_BEFEHL(LCD_ON_C);
12
      i=0;
13
      goto neu;
14
    }  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht
15
    USB_speichern(USB_zeichen);
16

17
neu:
18
  }
19

20
  int_restore_registers   //Daten wieder aus dem Speicher holen
21
}

Gemäß Kommentar in 
http://www.isk.kth.se/~mamoon/Mamoon%20work/INT16CXX.H würde ich das 
umschreiben zu:
1
interrupt ISR(void)
2
{
3
  int_save_registers //Daten des Programms in einen Speicher Retten
4
  char sv_FSR = FSR; // save FSR if required
5

6
  if (RCIF==1)
7
  {
8
    USB_zeichen=RCREG; // in RCREG stehen die Empfangenen Daten
9
    if (USB_zeichen==0x2A)
10
    {
11
      LCD_BEFEHL(LCD_CLR);
12
      LCD_BEFEHL(LCD_ON_C);
13
      i=0;
14
      goto neu;
15
    }  // Wenn * (0x2A) gesendet wird, wird das Display gelöscht
16
    USB_speichern(USB_zeichen);
17

18
neu:
19
  }
20

21
  FSR = sv_FSR;       // restore FSR if saved
22
  int_restore_registers   //Daten wieder aus dem Speicher holen
23
}
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
1
   interrupt serverX( void)
2
   {
3
       /* W and STATUS are saved by the next macro. PCLATH is also
4
          saved if necessary. The code produced is CPU-dependent. */
5

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

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

10
       // handle the interrupt (insert application code here)
11

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

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.