mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart Transmission klappt nicht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

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

Leider wird das TRMT bit NIE gesetzt.

Was funktioniert:
UxTXREG='a';
__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

Autor: DanVet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird denn etwas übertragen?
Kompletten Code zeigen!

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne was zum PIC sagen zu können: du solltest es andersherum machen. 
Erst prüfen, ob das Register frei ist (und dann ggf. so lange zu warten 
bis es frei ist) und nicht danach stur abwarten bis es raus ist. Die 
Zeit, während gesendet wird kann man sinnvoller nutzen.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mich eben falsch ausgedrückt. Wie gesagt, die Übertragung 
funktioniert so ohne Probleme:
U1TXREG='a';
__delay_ms(4);

U1TXREG='b';
__delay_ms(4);




So funktioniert es NICHT:
U1TXREG='a';

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



Da wird das zweite Zeichen falsch ausgegeben.

Funktioniert auch nicht:
U1TXREG='a';

while(U1STAbits.UTXBF==1)
;//warte solange Transmit Buffer noch voll ist.

Da wird das zweite Zeichen falsch ausgegeben.

Wo liegt mein Denkfehler ?

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anders herum:

1. Warten bis TX-Buffer leer ist
2. Daten in Buffer schreiben


while(U1STAbits.UTXBF==1)
U1TXREG='a';


Du must nach dem Schreiben nicht warten, bis das Byte gesendet wurde.

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nope..funktioniert auch nicht.
Habs so gemacht wie du es gesagt hast:
while(U1STAbits.UTXBF==1)
    ;
U1TXREG='a';
    
while(U1STAbits.UTXBF==1)
    ;
U1TXREG='b';

Zweites Zeichen wird FALSCH ausgegeben.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie überprüfst du denn, was ausgegeben wird. Protokoll korrekt 
eingestellt?

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Uart übergibt Daten einem einfachen LCD 16x2 Display der eben mit 
Uart funktioniert.
Da die Daten mit dem delay() richtig angezeigt werden nehme ich an dass 
alles richtig eingestellt ist.

Autor: Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch die Anzahl der Stoppbits?

Autor: DanVet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sam schrieb:
> Die Uart übergibt Daten einem einfachen LCD 16x2 Display der eben
> mit
> Uart funktioniert.
> Da die Daten mit dem delay() richtig angezeigt werden nehme ich an dass
> alles richtig eingestellt ist.

kompletten Code zeigen!

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Programm hier
while(U1STAbits.UTXBF==1)
    ;
U1TXREG='a';
    
while(U1STAbits.UTXBF==1)
    ;
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:
// 9600baud; 8 bits; 1 stop; no parity. //
    U1MODEbits.UARTEN=0; // disable Uart 1
    U1MODEbits.USIDL=0; // stop operation when Idle mode
    U1MODEbits.UEN=0b00; // only UxTX& UxRX used. UxCTS, UxRTS are I/O.
    U1MODEbits.WAKE=0; // Wake disabled
    U1MODEbits.ABAUD=0; // BaudRate Measurement disabled
    U1MODEbits.URXINV=0; // Idle State = 1
    U1MODEbits.BRGH=0; // 16 clocks per bit period ; Standard Speed mode
    U1MODEbits.PDSEL=0b00; // 8 bit Data, no Parity
    U1MODEbits.STSEL=0; // 1 Stop Bit
    U1BRG=259;
    U1MODEbits.UARTEN=1; // enable Uart 1
    U1STAbits.UTXEN=1; // Enable Transmit
    
    __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

Autor: tastendrücker (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Versuch mal 2 Stop-Bits zu senden, auch wenn der Empfänger nur eines 
benötigt.

Autor: DanVet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: DanVet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.