www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega128 UART problem


Autor: Hans22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe versucht das beispiel UART programm vom atmega8 auf den atmega128
umzuschreiben, ging aber nicht so ganz :)


Bin auch ne echter neuling in diesem gebiet !



--------------------------------------------------
.include "m128def.inc"

.def temp = r16
.equ CLOCK = 16000000
.equ BAUD = 19200
.equ UBRRVAL = CLOCK/(BAUD*16)-1

        ; Stackpointer initialisieren
        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, HIGH(RAMEND)
        out SPH, temp

        ; Baudrate einstellen
        ldi temp, LOW(UBRRVAL)
        out UBRR0L, temp




        sbi UCSR0B,TXEN                    ; TX aktivieren

loop:   ldi temp, 'T'
        rcall serout                      ; Unterprogramm aufrufen
        ldi temp, 'e'
        rcall serout                      ; Unterprogramm aufrufen
        ldi temp, 's'
        rcall serout                      ; ...
        ldi temp, 't'
        rcall serout
        ldi temp, '!'
        rcall serout
        ldi temp, 10
        rcall serout
        ldi temp, 13
        rcall serout
        rjmp loop

serout:
        sbis UCSR0A,UDRE0                   ; Warten bis UDR für das
nächste
                                          ; Byte bereit ist
        rjmp serout
        out UDR0, temp
        ret                               ; zurück zum Hauptprogramm

--------------------------------------------------


so "müsste" es doch funktionieren ? oder ? bei mir kommt aber nur
zeichensalat an der rs-232 an !


Danke für brauchbare tipps :)

MfG Hans

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von welchem Oszillator läuft denn Dein ATmega128?

Autor: juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi !!
vieleicht hilft dir das weiter.
auf jeden muss du sts fuer out nehmen!!
sonst steht auch was im pdf vom mega128

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                    USART1  Init                        ;;
;;                   ==============                       ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ; Baudrate einstellen
        ldi temp1, LOW(UBRRVAL)
        sts UBRR1L, temp1
        ldi temp1, HIGH(UBRRVAL)
        sts UBRR1H, temp1

; RX / TX aktivieren
ldi temp1, (1<<RXEN)|(1<<TXEN)
sts UCSR1B,temp1

; Set frame format: 8data, 2stop bit
ldi temp1, (1<<USBS)|(3<<UCSZ0)
sts UCSR1C,temp1

Autor: juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt auch wieder meiner laeuft intern mit
.equ CLOCK = 3686400

Autor: juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier noch "meine" transmit routine

USART_Transmit:
; Wait for empty transmit buffer
;push temp1
lds temp1, UCSR1A
sbrs temp1 ,UDRE1
rjmp USART_Transmit
; Put data (r18) into buffer, sends the data
;pop temp1
sts UDR1,temp2
ret

Autor: hans22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich nochmal

habe ein anderes tutorial mal umgeschrieben, mmmh ging auch nicht :(


-------------------------------------------------------------


.include "m128def.inc"

.def temp = R16

        ldi R16, RAMEND
        out SPL, R16                      ; Stackpointer
initialisieren

        sbi UCSR0B,TXEN0                    ; UART TX aktivieren
        ldi temp,16000000/(19200*16)-1      ; Baudrate 19200
einstellen
        out UBRR0L,temp

start:
        ldi ZL, LOW(text*2)               ; Adresse des Strings in den
        ldi ZH, HIGH(text*2)              ; Z-Pointer laden
        rcall print                       ; Unterfunktion print
aufrufen

        ldi R16, 10                       ; die Bytes 10 und 13 senden
        rcall sendbyte                    ; (Zeilenumbruch im
Terminal)
        ldi R16, 13
        rcall sendbyte

        rjmp start                        ; das Ganze wiederholen


; print: sendet die durch den Z-Pointer adressierte Zeichenkette
print:
        lpm                               ; Erstes Byte des Strings
nach R0 lesen
        tst R0                            ; R0 auf 0 testen
        breq print_end                    ; wenn 0, dann zu print_end
        mov r16, r0                       ; Inhalt von R0 nach R16
kopieren
        rcall sendbyte                    ; UART-Sendefunktion
aufrufen
        adiw ZL, 1                        ; Adresse des Z-Pointers um 1
erhöhen
        rjmp print                        ; wieder zum Anfang springen
print_end:
        ret

; sendbyte: sendet das Byte aus R16 über das UART
sendbyte:
        sbis UCSR0A, UDRE0                  ; warten bis das UART
bereit ist
        rjmp sendbyte
        out UDR0, R16
        ret

text:
.db "AVR-Assembler ist ganz einfach",0    ; Stringkonstante, durch
eine 0 abgeschlossen
-------------------------------------------------------------



es müsste doch beim debuggen immer im i/o register UDR0 das Zeichen
drin stehen das auch an die rs-232 ausgegeben wird. Oder ?

mein atmega128 läuft auf 16MHz mit 19200baud 8,N,1 !
kann mir jemand sagen ob dies programm richtig geschrieben ist ?

MfG Hans22

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.