Forum: Mikrocontroller und Digitale Elektronik ATmega USART - Kein Loopback kein Anzeige auf Display


von UnendlichHoherPotentialtopf (Gast)


Lesenswert?

Ich hangle mich gerade zum ersten mal durch USART durch aber ich komme 
nicht klar.

Ich habe ein Display angeschlossen und das funktioniert auch.
Bevor ich erstmalig Daten Empfange Schicke ich noch schnell was ans 
Display und auf Tastendruck lösche ich das Display und komme dann in 
meine Endlosschleife für send/receive USART.

- Ich benutze keinen externen Oszillator.
- CKDIV8 ist aus
- Am PC habe ich nur einen Com Port - > Com1
- Nutze Null Modem Kabel
- Als UART Modul nutze ich dieses: http://www.ebay.de/itm/121212075055
Ich bin mir bei dem Modul nicht sicher was ich anschliessen muss. Muss 
ich 5V und GND anschliessen? Ich denke ja. Muss ich RX vom Modul mit TX 
oder RX vom MC verbinden? Auf dem Modul sind zwei LEDs die habe ich 
bisher nicht leuchten sehen!
- Am PC (Windows 7) habe ich Putty und Terminal v1.19 probiert
- F_CPU steht auf 8Mhz
- #define BAUD 2400
- #define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)

mein init sieht so aus:
1
void uart_init (void)
2
{
3
    UBRR0H=(BAUDRATE>>8);
4
    UBRR0L=BAUDRATE;                     // baud rate setzen
5
    UCSR0B|=(1<<TXEN0)|(1<<RXEN0);       // enable receiver and transmitter
6
    UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01);     // 8bit data format; 1 stop bit
7
}

So sieht mein send/receive aus
1
// Funktion zum senden
2
void uart_transmit (unsigned char data)
3
{
4
    while (!( UCSR0A & (1<<UDRE0)));    // Wait for empty transmit buffer
5
    UDR0= data;                         // Put data into buffer, sends the data
6
}
7
  
8
// Funktion zum empfangen
9
unsigned char uart_receive (void)
10
{
11
    while(!(UCSR0A & (1<<RXC0)));      // Wait for data to be received
12
    return UDR0;                       // Get and return received data from buffer
13
}

Und das passiert in der Endlosschleife. Hier habe ich mal probiert 
gleich die Daten, nach kurzem Delay, wieder an den PC zu senden 
(erfolglos).
1
    a=uart_receive();        
2
    itoa(a,buffer,10);      
3
    lcd_clrscr();            
4
    lcd_home();              
5
    lcd_puts(buffer);        
6
    _delay_ms(100);          
7
    uart_transmit(a);

Bisher war bei Blinky, PWM, Timer und Display war die Fehlersuche nicht 
so Komplex aber jetzt bei USART gibt es so viele Fehlerquellen!
Könnt ihr mir bitte auch schreiben was richtig ist. Damit ich auch schon 
viel gewonnen.


UnendlichHoherPotentialtopf

von STK500-Besitzer (Gast)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:
> Muss ich 5V und GND anschliessen?
das wäre gar nicht so schlecht.

> Ich denke ja. Muss ich RX vom Modul mit TX oder RX vom MC verbinden?
Bietet sich auch an.

> Auf dem Modul sind zwei LEDs die habe ich
> bisher nicht leuchten sehen!
Vermutlich leuchten sie, wenn die Stromversorgung angeschlossen ist und 
Daten transferiert werden.

von Thomas E. (thomase)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:
> - Nutze Null Modem Kabel

Ein Nullmodem-Kabel ist auf beiden Seiten weiblich. Wie bekommst du das 
an deinen Adapter?

Entsprechend dem Stecker/Buchse Standard brauchst du ein normales 
Datenkabel. Denn dein Adapter ist vom Anschluss her wie ein Modem zu 
betrachten. Den Adapter könntest du auch direkt an den PC anschliessen. 
Genauso wie ein Modem auch. Ist nur meistens unpraktisch. Deswegen 
benutzt man ein Kabel.

Nullmodem-Kabel ist aber falsch. Damit verbindet man 2 PCs, bzw. 
Terminals.

mfg.

von UnendlichHoherPotentialtopf (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> UnendlichHoherPotentialtopf schrieb:
>> Muss ich 5V und GND anschliessen?
> das wäre gar nicht so schlecht.
Ok, hatte ich ja. Also kann ich das ausschließen. Danke one down!

STK500-Besitzer schrieb:
>> Ich denke ja. Muss ich RX vom Modul mit TX oder RX vom MC verbinden?
> Bietet sich auch an.
Da hatte ich ein "oder" geschrieben. TX auf TX oder auf RX?

Thomas Eckmann schrieb:
> Ein Nullmodem-Kabel ist auf beiden Seiten weiblich. Wie bekommst du das
> an deinen Adapter?
Ich hab nen männlich angelötet. Durchgemessen und sollte i.O sein.
Habe nicht nur 2&3 sondern auch 4&6 und 7&8 getauscht.
Danke für den Hinweis.

Ich habe jetzt ein 1:1 Kabel genommen und RX an TX angeschlossen.
Und siehe da es funkt.
Bei "A" bekomme 65 und bei "a" bekomme ich "97".
Und die Antwort wird auch zurück an den PC gesendet.
Die Leds am Modul gehen auch an.
Ich bin begeistert.
Ich muss nochmal spielen aber ich denke es lag am Kabel.
Vielen Dank!

UnendlichHoherPotentialtopf

Thomas Eckmann schrieb:
> Denn dein Adapter ist vom Anschluss her wie ein Modem zu
> betrachten.
Woher weiss man das? Und ich Dussel hab mir extra noch nen Null-Modem 
Kabel gebastelt. Im Artikel 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART steht das 
auch noch, dass man KEINS nutzen soll.

So gehe jetzt auf Rotwein.

von Daniel R. (h3po)


Lesenswert?

Du könntest noch einfacher ansetzen um den UART zu testen, als in einen 
Eingabebuffer zu lesen und ans Display zu schicken. Sende z.B. "..." und 
ändere so lange an deinen Steckern/Lötstellen/Terminal Einstellungen bis 
das Zeichen auch ankommt. Die Gegenrichtung hast du dann in 5 Minuten 
auch gelöst.

von Karl H. (kbuchegg)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:

> Woher weiss man das?

Indem man sich ansieht, welche Verbindung mit wem herzustellen ist und 
an welcher Position die Leitung an Stecker/Buchse liegt.

> Und ich Dussel hab mir extra noch nen Null-Modem
> Kabel gebastelt. Im Artikel
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART steht das
> auch noch, dass man KEINS nutzen soll.

Da ist aber auch kein Modul zwischengeschaltet. Das Tutorial geht von 
einer jungfräulichen PC-UART aus.


Letzten Endes, wenn man nicht weiss, welche Belegung der jeweilige 
Stecker/Buchse hat, probiert man einfach. Nicht umsonst gab es früher 
eine ganze Reihe von 'Zwischenstecker', die zb Leitungen gekreuzt haben 
oder die die Pegel der Leitungen mit LED sichtbar gemacht haben.

von Georg (Gast)


Lesenswert?

Karl Heinz schrieb:
> Nicht umsonst gab es früher
> eine ganze Reihe von 'Zwischenstecker', die zb Leitungen gekreuzt haben

Zweckmässig: eine "Break Out Box" mit beidseitig Stiften an allen 
Anschlüssen, die man mit entsprechnden Kabelstückchen verbinden kann.

Georg

von Wolfgang (Gast)


Lesenswert?

Karl Heinz schrieb:
> Letzten Endes, wenn man nicht weiss, welche Belegung der jeweilige
> Stecker/Buchse hat, probiert man einfach.

Spätestens, wenn irgendwelche Handshakeleitungen genutzt werden, diverse 
Baudraten und Baudratenfehler auftreten können (falscher Takt am µC) und 
die genutzten Pegel (RS232/TTL) nicht klar sind, ist Ausprobieren die 
schlechteste Lösung. Systematisches Vorgehen mit Multimeter für die 
Ruhepegel und ein Blick auf die Anzahl der tatsächlich verfügbaren 
Schnittstellenleitungen (wg. HW-Handshake) hilft schon mal, um etliche 
Kombinationen auszuschließen.

von Karl H. (kbuchegg)


Lesenswert?

Wolfgang schrieb:
> Karl Heinz schrieb:
>> Letzten Endes, wenn man nicht weiss, welche Belegung der jeweilige
>> Stecker/Buchse hat, probiert man einfach.
>
> Spätestens, wenn irgendwelche Handshakeleitungen genutzt werden

Ich geh von einem 'voll' verdrahtetem Kabel aus. Rx-Tx, CTS-DTS, 
DSR-DTR, GND. Damit kriegt man 99% aller Verbindungen zum laufen.

> , diverse
> Baudraten und Baudratenfehler auftreten können

Der unterschied ist, dass du bei falscher Verkreuzung keine Daten am 
anderen Ende kriegst, bei Baudratenfehlern kriegst du welche aber sie 
sind falsch.
Das lässt sich leicht auseinanderhalten.

> (falscher Takt am µC) und
> die genutzten Pegel (RS232/TTL) nicht klar sind, ist Ausprobieren die
> schlechteste Lösung. Systematisches Vorgehen mit Multimeter für die
> Ruhepegel und ein Blick auf die Anzahl der tatsächlich verfügbaren
> Schnittstellenleitungen (wg. HW-Handshake) hilft schon mal, um etliche
> Kombinationen auszuschließen.

Mein ehemaliger Admin hatte mit seinen Zwischensteckern und probieren 
eine Unterflur-UART von der VAX zu den Terminals schneller 
funktionsfähig als du dein Multimeter auch nur ausgepackt hast.

Seit TTL UART in Mode gekommen sind, ist in der Doku normalerweise immer 
angegeben, um welche UART es sich handelt: RS232 mit +-12V Pegel oder 
TTL. Das ist das kleinere Problem. Das größere Problem ist historisch 
gewachsen, weil nicht klar war, wie man einen 2.ten Rechner ansehen 
will. Als DTE oder als DCE. Damit ging einher ein Wildwuchs in der 
Verwendung von Stecker/Buchse bzw. welche der beiden Belegungen 
anzuwenden ist. Wenn gar nichts geht einfach mal die andere Kreuzung 
probieren und in mehr als 98% aller Fälle wars das dann auch schon.
Bei einem AVR kommt dann natürlich noch das Tak-'Problem' dazu. Aber das 
kann man leicht erkennen: Kommt was, aber das falsche, dann ist es der 
Takt. Kommt gar nichts, dann ist zumindest mal die Kreuzung falsch.

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:
> Woher weiss man das? Und ich Dussel hab mir extra noch nen Null-Modem
> Kabel gebastelt. Im Artikel

Leider gibt es da keinen Standard, häufig hängt es immer vom 
Anwendungsfall ab wie der Herstelle die Buchse/Stecker belegt.



Aber in der Regel hat sich folgendes durchgesetzt:

Stecker (wie beim PC oder USB-RS232-Wandler) sind als DTE beschaltet.
Buchsen (bei Modems und andere Geräte die man direkt an den PC 
anschließen kann) sind als DCE beschaltet.

Dazwischen brauch man ein RS232-Verlänergungskabel das 1:1 beschaltet 
ist.

Für alle anderen Fälle ein NULL-Modem-Kabel mit zwei Buchsen bzw. zwei 
Steckern.

: Bearbeitet durch User
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.