Forum: Mikrocontroller und Digitale Elektronik Ist mein UART zu USB Konverter kapput?


von Miko (Gast)


Lesenswert?

Hallo,

Ich haben einen billigen USB zu UART Verbinder aus China, und zwar nur 
diesen. Ich weiß jetzt nicht ob der Kaputt ist, oder ob mein Programm 
falsch ist.
Das USB-Gerät meldet sich unter /dev/ttyUSB1 und ich versuche mit 
gtkterm etwas auszulesen, es kommt aber nichts an.

Der Konverter ist ähnlich zu diesem:

http://www.amazon.com/PL2303HX-RS232-Cable-Module-Converter/dp/B008AGDTA4/ref=sr_1_2?ie=UTF8&qid=1435248231&sr=8-2&keywords=usb+uart

Ich habe die Pins 14 und 15 meines ATmega16 entsprechend verbunden. Ich 
habe mir aus dem Tutorial und dem Datenblatt Code zusammenkopiert. Der 
Code lässt eine LED blinken, damit ich feststellen kann das der 
Mikrocontroller überhaupt etwas tut, was aber der Fall ist.

Könnte mir jemand sagen ob der Code so korrekt und mein Konverter kapput 
ist, oder ob hier ein Fehler vorliegt?

Ich verwende einen ATmega16 bei 5V.

1
#include <avr/io.h>
2
#define F_CPU 1600000UL  // Es wird ein 16.000 MHz Kristall verwendet.
3
#include <util/delay.h>
4
#include <stdint.h>
5
 
6
int main( void )
7
{
8
    DDRB |= (1 << PB0); // PB0 ist ein Ausgang, der Blinkt
9
    DDRA = 0; // Alles Eingänge.
10
11
    // Uart einschalten
12
    UCSRB |= (1<<TXEN);                           // UART TX (transmitter) einschalten
13
    UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1, 7 bit charaters
14
#define BAUD 9600
15
#define UBRR F_CPU/16/BAUD-1    // (Taktfrequenz / (Baudrate *16 )) -1
16
//  16  MHz / (9600*16) = 104.166
17
    int ubrr = UBRR ; 
18
    UBRRH = (unsigned char)(ubrr>>8);
19
    UBRRL = (unsigned char)ubrr;
20
21
    while(1){
22
        PORTB = !PORTB; // Blinken
23
        _delay_ms(1000); // Warten
24
        while (!(UCSRA & (1<<UDRE))); //Warten bis auf der UART gesendet werden kann.
25
        UDR = 'x'; //Ein 'x' versenden.
26
    }
27
28
    return 0;
29
}

Miko

von Hans M. (Gast)


Lesenswert?

Verbinde mal an deinem USB-Serial mal rx und tx.
Dann sende mal mit deinem Terminalprogramm was und schau ob du das 
gleiche wieder empfängst.

Hans

von Planlos (Gast)


Lesenswert?

Verbinde zum Testen(ohne AVR dazwischen) RX und TX vom Konverter.
Alles was du sendest sollte als Echo zurückkommen, wenn der USB-Stöpsel 
noch funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Wenn die Direktverbindung (also grünes und weisses Kabel ohne den µC 
einfach miteinander verbinden) klappt, dann steck die mal anders rum an 
den Mega an

von Miko (Gast)


Lesenswert?

Danke für die Antworten.

Einfach mal das UART Interface mit sich selber verbinden ist clever. 
Zeigt dass er noch funktioniert.

Welcher Pin welcher ist wir wohl unterschiedlich angegeben und ich habe 
just die falsche Angabe gefunden.

Das Funktioniert manchmal nur wenn ich den ISP abziehe. Vermutlich 
irgendwelche Erden die nicht auf dem Selben Potential liegen, wobei ich 
eigendlich extra drauf geachtet habe.

Es immerhin was an, leider kein 'x', sondern '`~'. Vermutlich habe ich 
das Terminalprogramm falsch eingestellt, weiß aber nicht in wie weit. 
Änderung an Pariätst und Stoppbit ändern nichts.

Wenn ich die Baudrate von 9600 auf das Doppelte stelle kommt immer ein 
'|' an. Immerhin nur ein Zeichen scheint schon besser zu sein, wo auch 
immer der Faktor 2 her kommt. '|' ist 127, 'x' ist 120, ich weiß nicht 
was ich daraus jetzt schließen soll. Werde da noch weiter rumprobieren.

Miko

von Karl H. (kbuchegg)


Lesenswert?

Miko schrieb:

> ich weiß nicht
> was ich daraus jetzt schließen soll.

Dass dein µC sehr wahrscheinlich nicht auf 16Mhz läuft.

In F_CPU kannst du reinschreiben was du willst. Das interessiert den µC 
nicht die Bohne.
F_CPU ist die Angabe für den Compiler, damit der mit dieser Zahl die 
weiteren benötigten Zahlenwerte ausrechnen kann.

von Karl H. (kbuchegg)


Lesenswert?

Miko schrieb:

> Das Funktioniert manchmal nur wenn ich den ISP abziehe. Vermutlich
> irgendwelche Erden die nicht auf dem Selben Potential liegen, wobei ich
> eigendlich extra drauf geachtet habe.

?
Du hast aber die GND Leitung vom Konverter auch mit GND von deiner 
µC-Platine verbunden?
Du musst 3 Kabel verbinden! Rx Tx und GND

von Karl H. (kbuchegg)


Lesenswert?

Äh Moment mal.

da steht
1
#define F_CPU 1600000UL

1.6 Millionen und nicht 16 Millionen. Da fehlt eine 0

Was mich allerdings alles in allem ein bisschen verblüfft: Sagtest du 
nicht, dass dein LED sauber blinkt.
1
     _delay_ms(1000); // Warten

da scheint einiges im argen zu sein. Denn gefühlt kann man 1 Sekunde 
eigentlich von den in Frage kommenden Vielfachen ganz gut unterscheiden. 
Das hätte dir auffallen müssen, wenn die 1 Sekunde plötzlich in der 
Gegend von 10 Sekunden liegt.

-> mein Fazit
Du hast 2 Fehler
* einmal läuft dein µC nicht auf Quarzbetrieb. Der läuft immer noch auf 
ca. 1Mhz, so wie er ab Werk geliefert wurde.
* im define hast du nicht 16Mhz sondern nur 1.6Mhz angegeben.

beides zusammen ergibt, dass die Led nah genug an 1 Sekunde blinkt, dass 
man das nicht sofort bemerkt.
Nur ist natürlich die Berechnung der UART-Konstanten dadurch soweit 
daneben, dass das Gegenstück da nichts nehr sauber draus machen kann.

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.