Forum: Mikrocontroller und Digitale Elektronik P18F1320 USART


von Christian S. (wolpi)


Lesenswert?

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


von Franko P. (sgssn)


Lesenswert?

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

von Dieter Werner (Gast)


Lesenswert?

>   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.

von Bernhard (Gast)


Lesenswert?

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

von Christian S. (wolpi)


Lesenswert?

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
Noch kein Account? Hier anmelden.