Forum: Mikrocontroller und Digitale Elektronik PIC 18F Interruptproblem


von bastler (Gast)


Lesenswert?

Hallo,

ich benutze einen PIC 18F von micochip, den ich benutzt um digitale 
Signale zu erfassen und über RS232 an den PC sendet.
Wenn viele messwerte übertragen werden, dann tritt hin und wieder der 
fehler auf das kein Interrupt mehr ausgelöst wird, obwohl Daten auf der 
seriellen schnittstelle vorhanden sind.

Erst wenn der PIC aus und wieder ein gechaltet wird funktioniert der 
Interrupt wieder.

Hat jemand eine Idee woran das liegen kann?

Danke

von tt4u (Gast)


Lesenswert?

In der ISR vergessen, das IE-Flag zu setzen und wieder zu löschen?

von bastler (Gast)


Lesenswert?

wo muss ich es setzen?
löschen tu ich es jetzt wenn der Interrupt ausgelöst wird, aber nun tut 
die übertragung immer nur noch ganz kurz und dann geht nichts mehr.

von GUSSY (Gast)


Lesenswert?

Poste uns doch mal Deine ISR.

von bastler (Gast)


Lesenswert?

Das steht in der ISR:

  if(PIR1bits.RC1IF)
  {
    Abbruch = 0x01;
    PIR1bits.RC1IF = 0x00;
    PIE1bits.RC1IE = 0x00;
    PIE3bits.RC2IE = 0x00;
    Receive1_isr();
    PIR1bits.RC1IF = 0x01;
    PIE1bits.RC1IE = 0x01;
    PIE3bits.RC2IE = 0x01;
    Abbruch = 0x01;
    Schnittstelle = 0x01;
  }

Muss dazu sagen das es momentan funktioniert, ich weis nur nicht wie 
lang

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

bastler schrieb:
> Das steht in der ISR:
>
>   if(PIR1bits.RC1IF)
>   {
>     Abbruch = 0x01;
>     PIR1bits.RC1IF = 0x00;
>     PIE1bits.RC1IE = 0x00;
>     PIE3bits.RC2IE = 0x00;
>     Receive1_isr();
>     PIR1bits.RC1IF = 0x01;
>     PIE1bits.RC1IE = 0x01;
>     PIE3bits.RC2IE = 0x01;
>     Abbruch = 0x01;
>     Schnittstelle = 0x01;
>   }
>
> Muss dazu sagen das es momentan funktioniert, ich weis nur nicht wie
> lang

In einer IRQ Routine andere Funktionen aufrufen sollte man nach 
Möglichkeit vermeiden.

Gibt es einen Grund warum zuerst das RC1IF löschst, und dann wieder 
setzt? Ziemlich Unsinnig...

Grüße,

Chris

von bastler (Gast)


Lesenswert?

die Funktion liest nur die zeichnen ein.

Nein des hat keinen grund, werds auch wieder raus machen, aber das RC1IE 
muss drinnen bleiben oder?

von Rodjer (Gast)


Lesenswert?

Das Empfangen IRQ-Flag wird beim Lesen des Empfangsregisters gelöscht.
Des Weiteren solltest Du die Error-Flags der Empfangsschieberegisters 
behandeln.
Es ist nicht notwendig, zum Lesen des Registers den Interrupt zu 
deaktivieren.

von bastler (Gast)


Lesenswert?

und wie behandel ich die Errorflags?

von Pfennig (Gast)


Lesenswert?

Hallo

für den Fall das du bei deiner Behandlung feststellen willst, ob dein 
Registerbuffer deiner Schnittstelle überläuft, kannst du das 
dazugehörige Errorflag abfragen, wenn dieses Flag durch den Controller 
gesetzt wird, kannst du es detektieren, vieleicht mit einer 
if-Bedingungsfrage, in Anschluss, bei vorhanden sein eines solchen 
Errors kannst du die Betroffene Schnittstelle einmal deinitialisieren 
und wieder initialisierenn,

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.