www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STK500 und UART


Autor: Jörg W. (shiwa)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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....

.include "8515def.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 = 7372800                            ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = (F_CPU/(BAUD*16)-1)        ; UBBR Berechnung

    ; Stackpointer initialisieren
 
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Baudrate einstellen
 
    ldi     temp, UBRR_VAL
    out     UBRR, temp
 

 
    ; Frame-Format: 8 Bit
 
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCR,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    USR,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

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

Autor: rkhb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg W. (shiwa)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.