Uart Transmission klappt nicht

Gast #5422989
Lesenswert?
• ▲
▼
Hallo an alle,

Ich habe ein Problem mit der Uart Übertragung:
1
UxTXREG='a';
2
while(UxSTAbits.TRMT==0)
3
; // warten bis Transmit Shift register und Transmit buffer register leer ist.

Leider wird das TRMT bit NIE gesetzt.

Was funktioniert:
1
UxTXREG='a';
2
__delay_ms(4);
Das ist aber nicht schön. Auf jeden Fall funktioniert die Übertragung, 
nur nicht korrekt.

Woran liegt es, dass das TRMT nicht gesetzt wird? Handelt sich um ein 
PIC24.
Es wird nur übertragen, es kommt nichts zurück.

http://ww1.microchip.com/downloads/en/DeviceDoc/70582C.pdf

Seite 6 ist TRMT beschrieben.

Danke

lG
Gast #5423093
Lesenswert?
• ▲
▼
Sam schrieb:
> Was funktioniert:UxTXREG='a';
> __delay_ms(4);
> Das ist aber nicht schön. Auf jeden Fall funktioniert die Übertragung,
> nur nicht korrekt.

1. Was heißt "nur nicht korrekt"?

2. Im deinem realen Code steht auch U1STAbits.TRMT statt UxSTAbits.TRMT?


Tastendrücker
Gast #5423141
Lesenswert?
• ▲
▼
Hab mich eben falsch ausgedrückt. Wie gesagt, die Übertragung 
funktioniert so ohne Probleme:
1
U1TXREG='a';
2
__delay_ms(4);
3

4
U1TXREG='b';
5
__delay_ms(4);


So funktioniert es NICHT:
1
U1TXREG='a';
2

3
while(U1STAbits.TRMT==0)
4
; // warte bis vorherige Übertragung fertig ist.
5
U1TXREG='b';

Da wird das zweite Zeichen falsch ausgegeben.

Funktioniert auch nicht:
1
U1TXREG='a';
2

3
while(U1STAbits.UTXBF==1)
4
;//warte solange Transmit Buffer noch voll ist.
Da wird das zweite Zeichen falsch ausgegeben.

Wo liegt mein Denkfehler ?
Gast #5423165
Lesenswert?
• ▲
▼
Nope..funktioniert auch nicht.
Habs so gemacht wie du es gesagt hast:
1
while(U1STAbits.UTXBF==1)
2
    ;
3
U1TXREG='a';
4
    
5
while(U1STAbits.UTXBF==1)
6
    ;
7
U1TXREG='b';

Zweites Zeichen wird FALSCH ausgegeben.
Gast #5423199
Lesenswert?
• ▲
▼
Sam schrieb:
> Da die Daten mit dem delay() richtig angezeigt werden nehme ich an dass
> alles richtig eingestellt ist.

Nicht unbedingt. Wenn die Baudrate nicht korrekt ist, könnte das erste 
Zeichen korrekt empfangen warden, beim zweiten aber das Timing schon 
auseinandergelaufen sein.

Mit einem Delay hast du quasi nur "erste" Zeichen.

Wie ist der PIC den getaktet? Intern/extern? Baudrate?
Gast #5423224
Lesenswert?
• ▲
▼
Habe das Programm hier
1
while(U1STAbits.UTXBF==1)
2
    ;
3
U1TXREG='a';
4
    
5
while(U1STAbits.UTXBF==1)
6
    ;
7
U1TXREG='b';

mal am Oszilloskop nachgeschaut. Kommt alles richtig an.

LCD benötigt laut Datenblatt: 9600 Baudrate, 1 Stop bit, 1 Startbit, no 
parity, 8 bit Datenbreite

Uart Konfig:
1
// 9600baud; 8 bits; 1 stop; no parity. //
2
    U1MODEbits.UARTEN=0; // disable Uart 1
3
    U1MODEbits.USIDL=0; // stop operation when Idle mode
4
    U1MODEbits.UEN=0b00; // only UxTX& UxRX used. UxCTS, UxRTS are I/O.
5
    U1MODEbits.WAKE=0; // Wake disabled
6
    U1MODEbits.ABAUD=0; // BaudRate Measurement disabled
7
    U1MODEbits.URXINV=0; // Idle State = 1
8
    U1MODEbits.BRGH=0; // 16 clocks per bit period ; Standard Speed mode
9
    U1MODEbits.PDSEL=0b00; // 8 bit Data, no Parity
10
    U1MODEbits.STSEL=0; // 1 Stop Bit
11
    U1BRG=259;
12
    U1MODEbits.UARTEN=1; // enable Uart 1
13
    U1STAbits.UTXEN=1; // Enable Transmit
14
    
15
    __delay_us(105);  // 1/9600

Der Pic ist extern getaktet und mittels PLL auf 80Mhz hochgeregelt. 
Zyklustakt ist 40Mhz.
Für die Baudrate habe ich die Formel aus dem Uart Datenblatt entnommen:
(40Mhz/9600/16) -1 = 259,41=259
Gast #5423253
Lesenswert?
• ▲
▼
Sam schrieb:
> Habe das Programm hierwhile(U1STAbits.UTXBF==1)
>     ;
> U1TXREG='a';
>
> while(U1STAbits.UTXBF==1)
>     ;
> U1TXREG='b';
>
> mal am Oszilloskop nachgeschaut. Kommt alles richtig an.

Dann ist ja alles gut.
Wie schnell kann denn das Display die ankommenden Bytes verarbeiten?
Vielelicht brauchts da eine kurze Pause?
Gast #5423258
Lesenswert?
• ▲
▼
tastendrücker schrieb:
> Versuch mal 2 Stop-Bits zu senden, auch wenn der Empfänger nur
> eines
> benötigt.

Du bekommst ein Bier von mir. Alter schwede, es funktioniert jetzt 
endlich ohne die delays.
Herzlichen Dank Tastendrücker, du hast wortwörtlich auf die richtige 
Taste gedrückt! Jetzt ist das ganze auch viel schöner und sauberer ohne 
delays.

Somit ist das hier jetzt geklärt.
Danke nochmal an alle!

Sonnige grüße!
Gast #5423273
Lesenswert?
• ▲
▼
DanVet schrieb:
> Wie schnell kann denn das Display die ankommenden Bytes verarbeiten?
> Vielelicht brauchts da eine kurze Pause?

Sam schrieb:
>> Versuch mal 2 Stop-Bits zu senden, auch wenn der Empfänger nur
>> eines
>> benötigt.
>
> Du bekommst ein Bier von mir. Alter schwede, es funktioniert jetzt
> endlich ohne die delays.

Oder ein zweites StopBit :-)
Gast #5423274
Lesenswert?
• ▲
▼
Entweder das Display benötigt tatsächlich eine Pause, wie DanVet schrieb 
(Busy-Flag?), oder der Baudraten-Fehler ist wirklich zu groß.

Jetzt müsstest du nur noch mal mehrere Zeichen versuchen.
Gast #5423409
Lesenswert?
• ▲
▼
Ich habe vorhin einen ganzen String gesendet, wurde alles korrekt 
angezeigt!

Zum Baudrate Fehler..hatte von 258 bis 261 probiert, immer noch Anzeige 
Fehler.

Busy Flag vom LCD kann ich nicht nachprüfen, da ich nur TX habe. Was 
könnte sonst noch ein Ursache sein, dass zwei Stopbits gebraucht werden?

lG
Gast #5423847
Lesenswert?
• ▲
▼
Naja, das zweite Stopbit beim Senden sorgt ja nur dafür, dass dem 
Empfänger nach dem Empfang eines Datenwortes die "Zeitdauer" eines Bits 
zur Verarbeitung gegeben wird. Da ist sogesehen quasi ein Mikro-Delay.

Eventuell gibt das Datenblatt des Displays noch Aufschluss.

td

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.