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 }
Gast
#1432182
SPBRG=520; // Baudrate = 19200 kommt mir komisch vor. Ich dachte, das wäre nur 8 Bit groß.
Gast
#1432184
noch was: der Interrupt wird ausgeführt. dies kann ich überprüfen wenn ich im Interrupt eine Zahl anstelle von RCREG rausschreibe..
Gast
#1432189
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..
Gast
#1432190
Das ist ja schon mal ne heiße Spur. Jetzt könntest du untersuchen, welches Flag gesetzt ist, und ggf. warum.
Gast
#1432194
Das RCIF Flag muss ja gesetzt sein damit der Interrupt ausgeführt wird. Welche anderen Flags können dann RCREG noch beeinflussen?
Gast
#1432386
mit der baudrate ist auch alles in Ordnung. noch weitere Ideen?!
Gast
#1432415
Wenn Du an einem Port den Zustand der Pins ändern möchtest, solltes Du grundsätzlich das LATx-Register beschreiben.
Gast
#1432417
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.
Gast
#1432431
du meinst das RCREG ins TXREG schreiben oder wie?
Gast
#1432432
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..
Gast
#1432445
> 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 | |
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 | |
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
dreh doch mal PORTE=RCREG um und mach mal RCREG=LATE draus?
