Forum: Mikrocontroller und Digitale Elektronik UART mit Atmega8 und FTDI FT232RL


von DeepSpace (Gast)


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!

von Ralf (Gast)


Lesenswert?

Und das hTerm ist richtig konfiguriert?

Ralf

von Daniel (Gast)


Lesenswert?

Wenn du einen 16MHz Quartz hast, musst du "F_CPU" auch entsprechen 
einstellen (16000000)!!!

von DeepSpace (Gast)


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?

von amateur (Gast)


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.

von DeepSpace (Gast)


Lesenswert?

Der richtige Treiber läuft und die Port-Nummer ist COM2.
Eigentlich alles richtig eingestellt und trotzdem kommen nur Vierecke 
und anderer Salat im Terminal!???

von Stefan F. (sfrings)


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.

von Teddynator (Gast)


Lesenswert?

Daniel schrieb:
> Wenn du einen 16MHz Quartz hast, musst du "F_CPU" auch entsprechen
>
> einstellen (16000000)!!!

den Hinweis schon beachtet? Hier wird dein Problem liegen. Das musst du 
im Code ändern

von DeepSpace (Gast)


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!!!

von DeepSpace (Gast)


Lesenswert?

Hat auch nichts genützt. Ich hab absolut keine Ahnung mehr.

von Stefan++ (Gast)


Lesenswert?

DeepSpace schrieb:
> Kann es sein, dass der FT232RL die Signale irgendwie verändert, z.B.
> negiert?

Ja, das kann man eistellen !!!
Hole dir die geeignete Software FT_PROG von FTDI und schau nach !

von Eumel (Gast)


Lesenswert?

Prüfe doch 'mal den Takt (Ausgang toggeln) und schauen ob die Zeit 
stimmt.

von DeepSpace (Gast)


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...!

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.