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!