今天研究了一下avr的汇编指令,发现第一条指令必须要是rjmp或其他跳转(跳转到主程序),否则程序就跑飞了。把主程序放到falsh的$0000000位置也不行。
cpu不是从flash的0位置顺序读取指令执行吗? 为什么第一条必须是跳转才行?
正确代码:
.org 000000
rjmp start
nop
start:
ldi r16,0xFF
out DDRB,r16
sbi PORTB,PB0
Loop:
rjmp loop
错误:
start:
ldi r16,0xFF
out DDRB,r16
sbi PORTB,PB0
Loop:
rjmp loop
离线
看来楼主不是学电子的出身,学过51的,应该都知道,前面几个地址被中断占了。
最近编辑记录 abigpad (2021-06-04 21:01:31)
离线
看来楼主不是学电子的出身,学过51的,应该都知道,前面几个地址被中断占了。
发帖前确实忘了中断了,但是看到文档,试验了一下在0地址把中断关掉,还是跑飞
离线
算了,还是正常的跳过中断吧:
.cseg
.org $0
rjmp start
.org $000A
start:
sbi DDRB,DDB0
sbi PORTB,PB0
Loop:
rjmp loop
离线
有些跳转是为了让CPU刷新内部指令队列,跳一下它就会重新译码指令了。
离线