Forum: Mikrocontroller und Digitale Elektronik Atmega128 UART problem


von Hans22 (Gast)


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

von Jörg Wunsch (Gast)


Lesenswert?

Von welchem Oszillator läuft denn Dein ATmega128?

von juergen (Gast)


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

von juergen (Gast)


Lesenswert?

stimmt auch wieder meiner laeuft intern mit
.equ CLOCK = 3686400

von juergen (Gast)


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

von hans22 (Gast)


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

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.