Ist mein UART zu USB Konverter kapput?

Gast #4177996
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
Gast #4178097
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
#4178190
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.
#4178196
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren