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.