-
Ja ich hab auch mit dem Jumper noch ein bisschen experimentiert. Herausgenommen, Textdateien gesendet mit und ohne Jumper, etc. Ohne Jumper kann man nicht mal was eingeben. Beim Board habe ich einen Jumper an die falsche stelle gesetzt. Jetzt funktioniert die Übertragung. Aber ich bekomme anstatt "Test!", "0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R".
Woran könnte das liegen?
-
Das klingt nach Baudrate. (Oder µC Taktfrequenz --> check fuses)
Wenn das Teminal mehr Zeichen (als gesendet) zeigt, ist die µC Baudrate zu niedrig. (oder der Quartz, s.o)
Mich wundert aber etas das gleichförmige 0R0R.....
das wiederum könnte am µC Programm liegen, das in wirklichkeit schrott statt des Textes schickt.
-
Die fuses sind so http://www.mikrocontroller.net/image...a8-nachher.png
Einen Fehler im Programm kann ich auch nahezu ausschließen weil ich den kompletten Syntax schon aus dem avr-Toturial kopiert und geflasht habe.
Dabei kam auch 0Ò0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R 0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R
0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R0R 0R0R0R0R0R0R0R0R0R0R0R0R0R0R0
heraus.
Ich habe es auch schon mit einem AT-mega8 anstatt des ATMEGA16 probiert. Mach keinen unterschied.
-
Mach mal dein Programm mal ohne Loop, d.h. schick' nur einmal den Text und dann nix mehr.
Und zeig möglichst genau, was das Teminal dann bringt.
Die Baudrate stimmt dann, wenn genausoviele Zeichen gezeigt werden, wie geschickt wurden. Schwierigkeit: das Terminalprogramm zeigt eventuelle binär "00" nicht her. Aber vielleicht kommen wir der Sache trotzdem näher.
Zweite Möglichkeit: du schickst immer nur EIN bestimmtes Zeichen und dann pause und dann wieder.
Gut sind da ein-bit-zeichen, z.B. "@" also 0x40. Je nachdem, was dann das Terminal zeigt, kann man ableiten, was es mit der Baudrate auf sich hat.
Nach wie vor sorge ich mich wegen der Dauer-R's
-
Hallo.
Beim Programm ohne loop kommt nichts an. Sende ich ein Zeichen z.B. "T" ohne loop kommt auch nichts an. Sende ich das zeichen'@' mit anschließender verzögerung und dann rjmp loop kommt þ~~~~~~
hmmmn. Aber immerhin kenn ich mich schon ein bisschen besser aus. Vielleicht krieg ich es ja noch hin.
-
Achso es kommt immer nur ein ~ und dann die Pause. Die Baudrate müsste somit stimmen.
-
naja, eine Tilde "~" ist hex 0x7E 01111110
Dass die Baudrate stimmt, kann man da nicht ableiten, wenn du eigentlich
"@" schickst, also 0 0000 00101 . Das schaut ja schom fast verkehrt polarisiert aus
01111110 "~"
00000010 "@"
Schau dir bitte (mir zuliebe) in deinem Programm nochmal insbes.
.equ F_CPU = 4000000
.equ UBRR_VAL = ((F_CPU+BAUD*8 )/(BAUD*16)-1)
ZEICHENGENAU an.
bei den nullen bei der CPU hab ich mich schon mal vertan und lange gesucht
-
.equ F_CPU = 16000000
.equ UBRR_VAL = ((F_CPU+BAUD*8 )/(BAUD*16)-1)
So sieht das bei meinem Programm aus. Ich habe ein 16MHz-Quarz.
Ich habe immer noch das 0R0R...-Problem.
-
Code:
.include "m8def.inc"
.def temp = r16 ; Register für kleinere Arbeiten
.def zeichen = r17 ; in diesem Register wird das Zeichen an die
; Ausgabefunktion übergeben
.equ F_CPU = 16000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
; Berechnungen
.equ UBRR_VAL = ((F_CPU+BAUD*8 )/(BAUD*16)-1) ; clever runden
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
; Stackpointer initialisieren
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
loop:
ldi zeichen, 'T'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 'e'
rcall serout ; Unterprogramm aufrufen
ldi zeichen, 's'
rcall serout ; ...
ldi zeichen, 't'
rcall serout
ldi zeichen, '!'
rcall serout
ldi zeichen, 10
rcall serout
ldi zeichen, 13
rcall serout
rcall sync
rjmp loop
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, zeichen
ret ; zurück zum Hauptprogramm
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
; das Kabel getrennt wurde
sync:
ldi r16,0
sync_1:
ldi r17,0
sync_loop:
dec r17
brne sync_loop
dec r16
brne sync_1
ret
-
Aus dem Toturial kopiert und nur .equ F_CPU 4000000 zu .equ F_CPU 16000000 verändert