我有这样的atmega8515代码
.nolist
.include "m8515def.inc"
.list
.equ fCK = 8000000
.equ BAUD = 9600
.equ UBRR_value = (fCK/(BAUD*16))-1
.cseg
.org 0
main:
rcall init_USART
LDI R16, 0xFF
OUT DDRC, R16
rcall USART_recieve
OUT PORTC, R16
LDI R16, 0x00
OUT DDRA, R16
in R16, PINA
OUT PORTC, R16
rcall USART_send
init_USART:
ldi R16, high(UBRR_value)
out UBRRH, R16
ldi R16, low(UBRR_value)
out UBRRL, R16
ldi R16, (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
out UCSRB, R16
ldi R16, (1<< URSEL)|(1<<UPM1)|(1<<UPM0)|(1<< UCSZ1)|(1<< UCSZ0)
out UCSRC, R16
ret
USART_send:
out UDR, R16
sending:
sbis UCSRA, TXC
rjmp sending
ret
USART_recieve:
sbis UCSRA, RXC
rjmp USART_recieve
in R16, UDR
ret 我在proteus中运行这段代码,并得到以下循环错误
PC=0x0030.AVR USART RX奇偶校验错误U1
PC=0x0024.当接口未启用时,AVR内存外部存储器读取(SRE=0):0x0260。U1
PC=0x0000.当接口未启用时,AVR内存外部内存读取(SRE=0):0x0261。U1
PC=0x0000.AVR CPU RET地址= 0x0000 U1
PC=0x0002.当接口未启用时,AVR内存外部内存写入(SRE=0):0x0261=01。U1
PC=0x0002。当接口未启用时,AVR内存外部内存写入(SRE=0):0x0260=00。U1**
PC=0x0024。当接口未启用时,AVR内存外部存储器读取(SRE=0):0x0260。U1**
PC=0x0002。当接口未启用时,AVR内存外部内存读取(SRE=0):0x0261。U1**
我还包括proteus模式,以更好地理解

发布于 2020-04-05 21:24:09
看起来问题出在未初始化的堆栈指针中。
重置后,SPH:SPL被初始化为0x0000,因此对堆栈的任何写入(由push、rcall等)将写入地址0x0000 (映射为注册r0),然后堆栈指针将减少,成为0xFFFF。在ATmega8515中,0x0260及以上的内存位置映射到外部内存,而外部内存显然不在您的示意图中连接。
添加堆栈指针初始化,作为程序中的第一个操作,例如:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16另外,您的程序中没有循环,在rcall USART_send之后,它将超越init_USART:标签。
您可能希望在这一点上添加rjmp main。
你为什么要用汇编语言写程序呢?用C写不是更简单吗?
https://stackoverflow.com/questions/61034925
复制相似问题