Forum: Mikrocontroller und Digitale Elektronik STK500 und UART


von Jörg W. (shiwa)


Angehängte Dateien:

Lesenswert?

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
5
                                                ; Ausgabefunktion übergeben
6
 
7
.equ F_CPU = 7372800                            ; Systemtakt in Hz
8
.equ BAUD  = 9600                               ; Baudrate
9
 
10
; Berechnungen
11
.equ UBRR_VAL   = (F_CPU/(BAUD*16)-1)        ; UBBR Berechnung
12
13
    ; Stackpointer initialisieren
14
 
15
    ldi     temp, HIGH(RAMEND)
16
    out     SPH, temp
17
    ldi     temp, LOW(RAMEND)
18
    out     SPL, temp
19
 
20
    ; Baudrate einstellen
21
 
22
    ldi     temp, UBRR_VAL
23
    out     UBRR, temp
24
 
25
26
 
27
    ; Frame-Format: 8 Bit
28
 
29
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
30
    out     UCSRC, temp
31
 
32
    sbi     UCR,TXEN                  ; TX aktivieren
33
 
34
loop:
35
    ldi     zeichen, 'T'
36
    rcall   serout                      ; Unterprogramm aufrufen
37
    ldi     zeichen, 'e'
38
    rcall   serout                      ; Unterprogramm aufrufen
39
    ldi     zeichen, 's'
40
    rcall   serout                      ; ...
41
    ldi     zeichen, 't'
42
    rcall   serout
43
    ldi     zeichen, '!'
44
    rcall   serout
45
    ldi     zeichen, 10
46
    rcall   serout
47
    ldi     zeichen, 13
48
    rcall   serout
49
    rcall   sync                        
50
    rjmp    loop
51
 
52
serout:
53
    sbis    USR,UDRE                  ; Warten bis UDR für das nächste
54
                                        ; Byte bereit ist
55
    rjmp    serout
56
    out     UDR, zeichen
57
    ret                                 ; zurück zum Hauptprogramm
58
 
59
; 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...

von rkhb (Gast)


Lesenswert?

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

von Jörg W. (shiwa)


Lesenswert?

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

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.