Hi,
ich bin neu mit Pic's eingestiegen.
Habe das PICDEM 4 Demo Board mit einem P18F1320 Microkontroller.
Über den RS232 Port des Demoboards würde ich gerne eine Verbindung zu
einem PC herstellen.
Hier mein Code um USART zu initialisieren
TRISB = 0x00;
PORTB = 0x1A; //setting RB1(TX), RB4(RX), RB3 activating RS232
TXSTA = 0x26;
ADCON1 = 0x60;
RCSTA = 0x90;
SPBRG = 26 ; // baud rate 9600
PIE1 = 0x10;
TXSTA = 0x7C;
INTCON = 0x00;
TXREG = 0x55;
Aber ich bekomme immer die Fehlermeldung:
****Error COM1:[Framing,Break]****00
Also auf dem PC, der die Daten empfangen sollte.
Soweit ich weiß, heißt ein Framingfehler, das irgendwas mit der Baudrate
nicht in Ordnung ist. Aber ich habe sämtliche Baudraten durchprobiert
und es hat nichts geholfen. Außerdem heißt es im Datenblatt, das man das
Register OSCTUNE inkrementieren soll. Habe ich auch ohne Erfolg gemacht.
Wenn ich einen Wert ins Register TXREG schreibe, dann sollte dieser ja
automatisch ins Register TSR geschrieben werden um dann über die RS232
Schnittstelle verschickt zu werden. Ob in TSR was drin steht wird durch
das Bit TRMT gekennzeichnet. Wenn TSR leer, dann ist TRMT 1 ansonsten 0.
Wenn ich in TXREG einen Wert reinschreibe, dann wird TRMT 0. Aber in
TXREG steht der Wert immer noch drin. Dieser sollte aber laut Datenblatt
automatisch gelöscht werden, wenn die Daten von TXREG ins TSR
geschrieben wurden. Was ja von der Hardware automatisch gemacht wird.
Wenn mir jemand weiterhelfen könnte, wäre ich sehr dankbar.
Viele Grüsse
Christian
Hallo Christian warum kommt in deiner Initialisierung TXSTA 2* vor ? In einem meiner Projekte, bei dem der PIC18F1220 mit 4,9152 MHz läuft, hab ich UART-Setup: TXSTA = 0x24; BAUDCTL = 0x02; SPBRG = 31; //für 9600 Baud RCSTA = 0x90; Gerhard
> TRISB = 0x00; > PORTB = 0x1A; Wozu soll es gut sein den RX Pin als Ausgang zu schalten? Bei den mir bekannten PIC muss man für den RX Pin den Port auf Eingang schalten, ist das hier anders ? Die Fehlermeldung Break sagt aus, dass die Schnittstelle nicht den Ruhezustand (ca. -6 bis -10V) hat. Das sieht im Programm aber richtig aus.
Hallo,
TRISB = 0x00;
Unnötig, der USART setzt die Pins selbständig als Ausgang
PORTB = 0x1A; //setting RB1(TX), RB4(RX), RB3 activating RS232
Dito.
TXSTA = 0x26;
ADCON1 = 0x60;
Was hat denn der AD-Wandler damit zu tun?
RCSTA = 0x90;
SPBRG = 26 ; // baud rate 9600
Kommt auf die Taktfrequenz an
PIE1 = 0x10;
TXSTA = 0x7C;
INTCON = 0x00;
Alle Interrupts aus? Willst du pollen?
TXREG = 0x55;
>> Soweit ich weiß, heißt ein Framingfehler, das irgendwas mit der Baudrate nicht
in Ordnung ist. Aber ich habe sämtliche Baudraten durchprobiert und es hat nichts
geholfen. Außerdem heißt es im Datenblatt, das man das Register OSCTUNE
inkrementieren soll. Habe ich auch ohne Erfolg gemacht.
Entweder deine Baudrate stimmt nicht, oder die Zahl der Stop-Bits. Mit
dem OSCTUNE-Register kannst du bei stark vom Nennwert abweichender
Taktfrequenz (z.b. RC-Osz.) etwas nachkalibrieren, bei einem Quarz ist
das nicht nötig.
>> Aber in TXREG steht der Wert immer noch drin.
TXREG ist write-only!
Überprüfe (z.B. mit einem Timer->Pin->Oszi) und poste doch mal deine
Taktfrequenz. Außerdem solltest du mal sagen, welchen Mode du eignetlich
möchtest; nachladen bei Interrupt... Ich will dich nicht angreifen, aber
ich denke du solltest die Initialisierung einer App-Note entnehmen.
Viele Grüße,
Bernhard
Hallo, erstmal möchte ich allen danken, die geantwortet haben. Die Übertragung funktioniert seit gestern. Die Taktfrequenz war falsch bzw. nicht eingestellt. Hier habe ich mal alle Einstellungen aufgelistet, die unbedingt erforderlich sind, damit die Übertragung vom PIC zum PC funktioniert. OSCCON = 0x60; // interne Frequenz auf 4 Mhz einstellen TXSTA = 0x24; // TXEN = Transmitter aktivieren, BRGH = high speed RCSTA = 0x90; // SPEN = seriellen Port aktivieren, SPBRG = 26; // baud rate 9600 PIE1 = 0x10; // EUSART transmitt interrupt INTCON = 0xC0; // enable globally interrupts Diese Einstellung haben natürlich keinen Anspruch auf allgemeine Gültigkeit. Ich benutze ein PICDEM 4 Demoboard mit einem P18F1320. Zu euren Antworten: @Gerhard: BRGH muß ich auf 1 setzen. Das hat ja was mit der Berechnung der Baudrate zu tun und dem Wert, den ich dann SPBRG zuweisen muß. Was allerdings jetzt der genaue unterschied ist zwischen BRGH auf 0 oder 1....das ist mir immer noch schleierhaft. @Dieter und Bernhard: Ihr habt mich gefragt, warum ich die PIN's so schalte, wie ich sie geschaltet habe. Dazu ein kleiner Auszug aus dem Datenblatt: The RB1/AN5/TX/CK/INT1 and RB4/AN6/RX/DT/KBI0 pins must be configured as follows for use with the Universal Synchronous Asynchronous Receiver Transmitter: • SPEN (RCSTA<7>) bit must be set ( = 1), • PCFG6:PCFG5 (ADCON1<5:6>) must be set ( = 1), • TRISB<4> bit must be set ( = 1) and • TRISB<1> bit must be set ( = 1). Note: The EUSART control will automatically reconfigure the pin from input to output as needed. Deswegen habe ich ADCON1 = 0x60 gemacht. Du hast natürlich recht, das der AD-Wandler da eigentlich nichts zu suchen hat. Aber als Neuling habe ich mich einfach mal auf das Datenblatt verlassen. TRISB<4> ist der RX-Eingang. Und den soll man mit 1 belegen. Da dabei steht, das EUSART die PIN's dann automatisch konfiguriert, dachte ich die Einstellungen gehören einfach zur Initialisierung dazu. Aber wie man oben sieht, geht das ganz automatisch. Die drei Zeilen unter SPEN waren für mich eigentlich sinnlos. Es geht mit den Einstellungen von ADCON1 und TRISB, aber auch ohne. Wie gesagt, das trifft hier für meinen Fall zu. Aber alle eure Antworten haben mich auf jeden Fall weitergebracht und mich an den richtigen Stellen suchen lassen. Danke nochmal. Viele Grüsse Christian
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.