Hallo Ich möchte Zeichen vom PC auf den PIC übertragen und da an LED's ausgeben. Leider ist das RCREG Register immer leer. Weiss jemand weiter? Freundliche Grüsse und Danke #include <pic18.h> void init (void) { /* PortE (X4) */ TRISE=0x00; // PORTE = Output (Data Direction Register) LATE=0x00; // Data Outpt Register PORTE=0x00; // Clear PORTE /* PortC (X7) */ TRISC=0xFF; // PORTC = Input /* PortF (X2) */ TRISF=0xFF; // PORTF = Input /* Init USART */ SYNC=0; // asynchronous mode SPEN=1; // set serial port enable bit BRGH=1; // BRG16=1; // enable BRGH SPBRG=520; // Baudrate = 19200 /* USART reception */ RCIE=1; // enables the USART receive Interrupt RX9=0; // 8bit CREN=1; // continuos receive enable bit /* USART transmission */ TXIE=1; // enables the USART transmit Interrupt TXEN=1; // continuos receive enable bit /* Interrupts */ PEIE=1; // enable Peripheral Interrupt GIE=1; // enable all Interrupts } void main (void) { init(); while(1); } void interrupt isr (void) { GIE=0; // disable all Interrtupts if (RCIF) { PORTE=RCREG; // USART value to output } GIE=1; // enable all Interrupts }
SPBRG=520; // Baudrate = 19200 kommt mir komisch vor. Ich dachte, das wäre nur 8 Bit groß.
noch was: der Interrupt wird ausgeführt. dies kann ich überprüfen wenn ich im Interrupt eine Zahl anstelle von RCREG rausschreibe..
ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237. und das signal habe ich auch mit dem K.O. gemessen.. bei einer Baudrate von 19200 ergibt sich eine zeit von 52us. Der Fehler muss irgendwo im RCREG liegen..
Das ist ja schon mal ne heiße Spur. Jetzt könntest du untersuchen, welches Flag gesetzt ist, und ggf. warum.
Das RCIF Flag muss ja gesetzt sein damit der Interrupt ausgeführt wird. Welche anderen Flags können dann RCREG noch beeinflussen?
Wenn Du an einem Port den Zustand der Pins ändern möchtest, solltes Du grundsätzlich das LATx-Register beschreiben.
Ach nochwas: warum sendest Du im Interrupt das empfangene Zeichen nicht einfach zurück an den PC? Dann siehst Du doch sofort, wo es hakt.
habs zurück an den PC gesendet und erhalte immer EXAKT das, was ich sende. der fehler muss beim RCREG liegen, kann ihn mir aber nicht erklären..
> du meinst das RCREG ins TXREG schreiben oder wie? Super Idee, oder nich? Aber: > mit der baudrate ist auch alles in Ordnung. > ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237. Das sehe ich anders. Du hast einen 8-Bit-PIC, Du kannst also keinen 16-Bit-Register mit einem Schwung beschreiben (es sei denn, Dein Compiler, den wir nicht kennen, bietet hier ein Macro). Das Baudratenregister ist aber ein 16-Bit-Register (bestehend aus SPBRG und SPBRGH), also solltest Du die 520 auch entsprechend gerecht auf beide Register aufteilen. Solltest Du den C18 verwenden, so ist SPBRG definitiv als 8-Bit-Register definiert und von den 520 werden nur die ersten 8 Bit in SPBRG übernommen. Auszug aus p18f6680.h:
1 | extern volatile near unsigned char SPBRG; |
Zwirbeljupp schrieb: >> du meinst das RCREG ins TXREG schreiben oder wie? > Super Idee, oder nich? > > Aber: >> mit der baudrate ist auch alles in Ordnung. >> ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237. > Das sehe ich anders. > Du hast einen 8-Bit-PIC, Du kannst also keinen 16-Bit-Register mit einem > Schwung beschreiben (es sei denn, Dein Compiler, den wir nicht kennen, > bietet hier ein Macro). Das Baudratenregister ist aber ein > 16-Bit-Register (bestehend aus SPBRG und SPBRGH), also solltest Du die > 520 auch entsprechend gerecht auf beide Register aufteilen. > > Solltest Du den C18 verwenden, so ist SPBRG definitiv als 8-Bit-Register > definiert und von den 520 werden nur die ersten 8 Bit in SPBRG > übernommen. > Auszug aus p18f6680.h: >
1 | > extern volatile near unsigned char SPBRG; |
2 | >
|
danke für deine antwort da hast du recht. ja ich verwende den C18.habs jetzt aufgeteilt, aber es hat auch vorher funktioniert, habs ja mit dem KO gemessen. bei einer Baudrate von 19200--> t=1/baudrate=52us auf dem bild sieht man schön wie die Daten übertragen werden. und auch das rücksenden funktionert(auch mit dem KO gemessen) nur das ausgeben der Daten an dem Port funktioniert nicht.
es funktioniert! habe das RCREG ausgelesen und direkt zurückgesendet, somit war dann nichts mehr im RCREG als ich es ein zweites mal auslesen wollte um am Port auszugeben =) vielen dank an alle Gruss und einen schönen Abend
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.