PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F876 USART spinnt



celcouser
21.12.2004, 02:17
Hallo zusammen,
Ich habe ein Problem mit der USART des PIC16F876.
Habe die USART als serielles Interface initialisiert, mit 9600 baud,8 bit Daten, kein Schnickschnack. Nun frage ich im Hauptprogramm ständig das Interrupt-Flag RCIF ab. (kein Interrupt auf diesem Flag zugelassen).
sobald das Flag gesetzt ist wird in eine Routine verzweigt, die das RCREG ausliest. Die Experten unter Euch wissen, daß das RCREG ein FIFO mit 2 Ebenen ist. Jetzt kommt das Problem: wenn ich das Auslesen des RCREG nach der Abfrage des RCIF zeitlich später mache, also dazwischen noch etwas Code steht, dann enthält das RCREG nicht mehr das Zeichen, welches das RCIF gesetzt hat, sondern das nächste oder sogar übernächste empfangene Zeichen.
Was soll das?

Natürlich fällt der Fehler nur auf, wenn man die serielle Schnittstelle des PIC mit vorgefertigten Strings "beschießt". Einzelne Zeichen oder festgehaltenen Tasten beim Sende-PC werden tadellos verarbeitet, dazu ist der Bursche zu schnell und das FIFO des RCREG wird nicht genutzt.

Kann mir da jemand helfen?
Auf der µChip-Seite ist natürlich nichts zu finden...

Vielen Dank im Voraus

Dirk

BlackBox
21.12.2004, 08:20
Obwohl meine Kristallkugel gerade zur Reperatur ist würde ich mal sagen es dauert ganz einfach zu lange, bis das Flag abgefragt wird und der Puffer läuft über. Prüfen kannst Du das mit dem Bit OERR.

PicNick
21.12.2004, 08:41
Hi, ich meine, du hast die richtige diagnose selbst gestellt. Wenn du zu lange rumwurstelst, haste was versäumt.
@Blackbox: lass die Kugel beim Service, bis wir sie mal wirklich brauchen.
mfg robert

21.12.2004, 13:01
Vielen Dank für diese Anregungen, natürlich habe ich im Programm dafür gesorgt, daß das RCREG nicht überlaufen kann, sondern vorher geleert wird.
In der vergangenen Nacht habe ich den Fehler entdeckt, die Ursache ist die an die Schaltung angeschlossenen ICD2.
Sobald der Controller an einem Breakpoint hält oder einen Einzelschritt im Debug-Modus ausführen soll werden alle Register des Controllers auf dem Bildschirm upgedatet. dabei wird anscheinened auch des RCREG abgefragt um den Inhalt an den PC zu versenden. In diesem Fall wird aber eine Ebene des RCREG geleert. bei der folgenden regulären Abfrage durch das Programm wird daher ein falsches Zeichen ausgegeben.
So gut die ICD auch ist, so tückisch kann sie auch sein.
lasse ich das Programm stur durchlaufen, dann funktioniert es einwandfrei.

Vielen Dank an alle ,

Dirk

BlackBox
21.12.2004, 13:47
@PicNick

Damit wären wir wieder bei der Kristallkugel. Etwas mehr Informationen hätten die Lösung vielleicht schon eher gebracht.

@Dirk

Deine Vermutung ist richtig. Die Daten werden beim Betrieb mit dem ICD2 durch ein kleines Programm im PIC an den Rechner gesendet. Da passiert unter Umständen genau das. In den Optionen zum ICD müssten sich aber die zu übertragenden Register einstellen lassen.

PicNick
21.12.2004, 19:45
@Blackbox: Du hast recht, ich schweige still.
Schau, daß die Kugel schnell fertig wird. ](*,)