Nabend,
ich wollte das UART Beispiel von diesem Forum auf meinem STK500 testen
aber es funktioniert nicht :/ Habe inzwischen auch keine Ahnung mehr wo
ich suchen soll... bin um jede Hilfe dankbar
Der µC ist der AT8515L-8PU, benutze ein Prolific USB-to-Seriel Adapter
und habe den einen Quarz mit 7,3728MHz. Den Jumper habe ich auf OSCAL
2-3 gesteckt und ein Kabel von RXD/TXD auf PD0/PD1 gesteckt wie in der
Anleitung vom STK gezeigt.
Das Programm habe ich etwas abgeändert wegen dem Controller....
1
.include "8515def.inc"
2
3
.def temp = r16 ; Register für kleinere Arbeiten
4
.def zeichen = r17 ; in diesem Register wird das Zeichen an die
; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich
60
; das Kabel getrennt wurde
61
62
sync:
63
ldi r16,0
64
sync_1:
65
ldi r17,0
66
sync_loop:
67
dec r17
68
brne sync_loop
69
dec r16
70
brne sync_1
71
ret
die 8515def.inc habe ich ergänzt bzw abgeändert, so das ich das Programm
problemlos assemblieren konnte.
Die Include hab ich mal im Anhang gepackt
Achja, benutze das Hyperterminal von einem XP Rechner aus, habe die
Einstellung wie im Bsp. vorgenommen also 9600Baud usw...
Dieses Programm funktioniert bei mir auf dem STK500 ohne irgendwelche
Anpassungen:
<avrasm>
.include "8515def.inc"
.equ F_CPU = 7372800 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
.CSEG
; Stackpointer initialisieren
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
; UART initialisieren
ldi r16, F_CPU/(BAUD*16)-1
out UBRR, r16 ; Baudrate einstellen
sbi UCR,TXEN ; TX aktivieren
; FLASH nach SRAM schreiben
ldi ZL, LOW(daten*2) ; Programmspeicher
ldi ZH, HIGH(daten*2)
ldi XH, HIGH(Test) ; SRAM
ldi XL, LOW(Test)
mov YL,XL ; X sichern
mov YH,XH
transfer:
lpm
adiw ZL,1
st X+,r0
and r0,r0 ; r0==0 (Stringende)?
brne transfer ; nein: loop
clr r16 ; sicherheitshalber eine Null schreiben
st X+,r16
mainloop:
mov XL,YL ; X wiederherstellen
mov XH,YH
rcall printX ; String schreiben, Übergabe: X
rjmp mainloop
printX:
ld r16,X+ ; SRAM nach r17
and r16,r16 ; r16==0 (Stringende)?
brne serout ; nein: Ausgabe auf RS232
ret ; ja: fertig
serout:
sbis USR,UDRE ; Warten bis UDR für das nächste Byte bereit
ist
rjmp serout
out UDR, r16 ; Ausgabe auf RS232 (TX)
rjmp printX ; nächstes Zeichen
daten:
.db "Test",13,10,0,0
.DSEG ; SRAM
Test:
.BYTE 20 ; 20 Byte unter dem Namen 'Test' reservieren
</avrasm>
Wenn dieses Programm bei Dir nicht funktioniert, dann könnte es folgende
Ursachen haben:
1) Der Quarz will nicht schwingen. Herausnehmen, wieder einsetzen. Eine
LED zur Kontrolle blinken lassen.
2) Das Protokoll ist falsch eingestellt: 9600 Baud, 8 Bit, keine Parity,
1 Stop Bit, kein Handshaking. Ich selbst komme besser mit terminal.exe
als Hyperterminal zurecht:
http://sites.google.com/site/terminalbpp/
3) Der USB/Serial-Adapter verwendet noch weitere Leitungen nach
RS232-Standard. Dann brauchst Du einen Computer mit eingebauter
COM-Schnittstelle.
viele grüße
ralph
Danke Ralph,
da ich mich auf dein Programm verlassen konnte und es trotzdem nicht
lief konnt ich den Fehler etwas eingrenzen. Ich hab einfach mehrere USB
Ports ausprobiert und plötzlich gings =)
Auch mein Programm funktioniert, war also kein Fehler in der
Programmierung