UART mit Atmega8 und FTDI FT232RL

Gast #2815767
Lesenswert?

Guten Abend,

ich habe eine Schaltung mit einem Atmega8 uC aufgebaut und will Daten 
mit UART an den PC schicken. Da ich keine RS-232 Schnittstelle habe, 
habe ich einen FTDI FT232RL Driver angeschlossen. Der Simuliert am USB 
eine RS-232 Schnittstelle. Einen MAX232 benötige ich dann ja nicht mehr, 
weil der ja schon mit 5V vom USB aus arbeitet. Jedenfalls habe ich 
versuchshalber den Quellcode aus euerm Tutorial ausprobiert und auf 
hTerm bekomme ich nur kryptische Zeichen. Ein totales durcheinander.
1
.include "m8def.inc"
2
 
3
.def temp    = r16                              ; Register für kleinere Arbeiten
4
.def zeichen = r17                              ; in diesem Register wird das Zeichen an die
5
                                                ; Ausgabefunktion übergeben
6
 
7
.equ F_CPU = 4000000                            ; Systemtakt in Hz
8
.equ BAUD  = 9600                               ; Baudrate
9
 
10
; Berechnungen
11
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
12
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
13
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
14
 
15
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
16
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
17
.endif
18
 
19
    ; Stackpointer initialisieren
20
 
21
    ldi     temp, HIGH(RAMEND)
22
    out     SPH, temp
23
    ldi     temp, LOW(RAMEND)
24
    out     SPL, temp
25
 
26
    ; Baudrate einstellen
27
 
28
    ldi     temp, HIGH(UBRR_VAL)
29
    out     UBRRH, temp
30
    ldi     temp, LOW(UBRR_VAL)
31
    out     UBRRL, temp
32
 
33
    ; Frame-Format: 8 Bit
34
 
35
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
36
    out     UCSRC, temp
37
 
38
    sbi     UCSRB,TXEN                  ; TX aktivieren
39
 
40
loop:
41
    ldi     zeichen, 'T'
42
    rcall   serout                      ; Unterprogramm aufrufen
43
    ldi     zeichen, 'e'
44
    rcall   serout                      ; Unterprogramm aufrufen
45
    ldi     zeichen, 's'
46
    rcall   serout                      ; ...
47
    ldi     zeichen, 't'
48
    rcall   serout
49
    ldi     zeichen, '!'
50
    rcall   serout
51
    ldi     zeichen, 10
52
    rcall   serout
53
    ldi     zeichen, 13
54
    rcall   serout
55
    rcall   sync                        
56
    rjmp    loop
57
 
58
serout:
59
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
60
                                        ; Byte bereit ist
61
    rjmp    serout
62
    out     UDR, zeichen
63
    ret                                 ; zurück zum Hauptprogramm
64
 
65
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
66
; das Kabel getrennt wurde
67
                                    
68
sync:
69
    ldi     r16,0
70
sync_1:
71
    ldi     r17,0
72
sync_loop:
73
    dec     r17
74
    brne    sync_loop
75
    dec     r16
76
    brne    sync_1  
77
    ret

Ich verwende einen 16MHz Quarz, entsprechende Fuse-Bits müssten richtig 
gesetzt sein. Ist vielleicht der Systemtakt falsch oder muss ich im Code 
noch etwas ändern? Ein Oszilloskop besize ich leider (noch) nicht.

Danke im Voraus! Gute Nacht!
Gast #2816156
Lesenswert?

Habe schon alle möglichen Einstellungen ausprobiert, aber immer noch 
kommt nur Zeichensalat. Was gibts an hTerm außer der Baudrate noch groß 
zu konfigurieren?

Kann es sein, dass der FT232RL die Signale irgendwie verändert, z.B. 
negiert?
Gast #2816188
Lesenswert?

Hast du mal den originalen FTDI-Treiber mal ausprobiert/installiert?
Außer im Zusammenhang mit Elektrostatik habe ich mit den Teilen noch nie 
Probleme gehabt.
Ist eventuell die COM-Port-Nummer aus den Ruder gelaufen? Bei jedem 
neuen USB-Seriell-Wandler wird der zugeordnete Port erhöht. Wenn mich 
nicht alles täuscht bis COM99. Damit haben allerdings manche Programme 
Schwierigkeiten, wenn sie nur einstellige Ports vorgesehen haben.
#2816843
Lesenswert?

Kreise den Fehler ein, anstatt herum zu raten. Vorschlag:

Nimm den AVR aus dem Sockel heraus und stecke eine Drahtbrücke von RxD 
nach Txd. Sende damm im Terminal Programm ein paar Zeichen und prüfen, 
ob sie als Echo zurück kommen.

Wenn DU dann immer noch falsche Zeichen empfängst, dass liegt das 
Problem nicht beim AVR.
Gast #2817015
Lesenswert?

Ich habe alles im Code geändert, mit verschiedenen Einstellungen am 
Quarz experimentiert, verschiedene Baud-Raten eingestellt, den internen 
RC-Resonator ausprobiert... nichts hilft.

Wenn ich TXD und RXD verbinde empfange ich richtige Symbole. Ich probier 
jetzt noch einen anderen Atmega8 aus und wenn das dann immer noch nichts 
bringt hab ich halt pech.

Trotzdem Danke für eure Bemühungen!!!
Gast #2817069
Lesenswert?

Oh mann,

die Aus- und Eingänge waren negiert und noch einige andere Einstellung 
daneben geraten!!! Jetzt kommt das was ich wollte!

Vielen Dank für eure umfangreiche und schnelle Hilfe!!! Hochachtung...!

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