Hallo zusammen.
Ich habe folgendes Programm zum Testen der RS232(1) beim ATmega128
geschrieben. Es soll im Zusammenspiel mit Hyperterminal die serielle
Übertragung vom und zum uC testen.
;.nolist
.include "m128def.inc"
;.list
.def temp1=r16
.def temp2=r17
.equ CLOCK = 16000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK / (BAUD*16)-1
.cseg
.org 0x0000
start:
rcall initRAM
rcall initUART
loop:
rcall receive
rcall transmit
rjmp loop
initRAM:
ldi temp1,High(RamEnd)
out sph,temp1
ldi temp1,Low(RamEnd)
out spl,temp1
ret
initUART:
ldi temp1,High(UBRRVAL)
sts UBRR1H,temp1
ldi temp1,Low(UBRRVAL)
sts UBRR1L,temp1
ldi temp1,(1<<RXEN1) | (1<<TXEN1) ;
sts UCSR1B,temp1 ; Senden und Empfangen aktiv
ldi temp1,(1<<UCSZ11) | (1<<UCSZ10) ; 8 Bit, 1 Stopbit
sts UCSR1C,temp1
ret
transmit:
lds temp1,UCSR1A
sbrs temp1,UDRE1 ; warten bis UART bereit ist
rjmp transmit
sts UDR1,temp2
ret
receive:
lds temp1,UCSR1A
sbrs temp1,RXC1
rjmp receive
lds temp2,UDR1
ret
Ich bringe es nicht zum Laufen.
In C war es kein Problem. Es hat auf Anhieb funktioniert.
Hat jemand eine Idee?
Danke im voraus
Du ruftst eine Funktion auf, bevor der Stack initialisert ist. Ist das Gut?! initRAM und initUART würde ich direkt einbinden. Warum sollte man das callen?! Wird ja eh nur einmal ausgeführt.
Hallo Moi. Da hast Du recht. Da habe ich nicht aufgepasst. Das ursprüngliche Programm sieht eigentlich so aus: ;.nolist .include "m128def.inc" ;.list .def temp1=r16 .def temp2=r17 .equ CLOCK = 16000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK / (BAUD*16)-1 .cseg .org 0x0000 start: ldi temp1,High(RamEnd) ; RAM initialisieren out sph,temp1 ldi temp1,Low(RamEnd) out spl,temp1 ldi temp1,(1<<RXEN1) | (1<<TXEN1) ; sts UCSR1B,temp1 ; Senden und Empfangen aktiv ldi temp1,(1<<UCSZ11) | (1<<UCSZ10) ; 8 Bit, 1 Stopbit sts UCSR1C,temp1 ldi temp1,High(UBRRVAL); Baudrate sts UBRR1H,temp1 ldi temp1,Low(UBRRVAL) sts UBRR1L,temp1 loop: rcall receive rcall transmit rjmp loop transmit: lds temp1,UCSR1A sbrs temp1,UDRE1 ; warten bis UART bereit ist rjmp transmit sts UDR1,temp2 ret receive: lds temp1,UCSR1A sbrs temp1,RXC1 rjmp receive lds temp2,UDR1 ret Ist schon merkwürdig mit dem Hyperterminal. Warum funzt das Programm so nicht?
Hi >Ist schon merkwürdig mit dem Hyperterminal. Warum funzt das Programm so >nicht? Was geht nicht? Kann auch an deiner Hardware liegen. MfG Spess
Die HW ist schon in Ordnung. Wie gesagt, in C hat es auf anhieb funktioniert. Es lag wohl an dem Hyperterminal. Heute morgen ging es plötzlich.
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.