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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.