Proteus仿真ATmega32遇Invalid opcode 0xFFFF at PC=0x5200错误求助
ATmega32汇编代码Proteus仿真报错:Invalid opcode 0xFFFF at PC=0x5200
我编写了ATmega32的汇编代码,预期实现按下按键10次后PD5引脚的LED翻转功能。该代码在AVR实际环境中可正常运行,但在Proteus 8仿真时弹出错误提示:
Invalid opcode 0xFFFF at PC=0x5200
仿真电路截图:
汇编代码
.include "m32def.inc" .equ memory = 0x200 .equ timer1 = 0x00FF .cseg .org 0x00 rjmp RESET RESET: ; 初始化计数变量 ldi r16, 0x00 ldi r30, LOW(memory) ldi r31, HIGH(memory) st Z, r16 ; 将0存入指定内存地址(使用Z指针) ; 设置D口为输出 ldi r16, 0xFF out DDRD, r16 ldi r16, 0x00 out PORTD, r16 ; 配置Timer1为CTC模式 ldi r16, (1 << WGM12) ; 加载配置值,设置Timer1为CTC模式 out TCCR1B, r16 ; 写入TCCR1B寄存器,启用CTC模式 ldi r16, (1 << CS12) ; 加载预分频值(256分频) out TCCR1B, r16 ; 写入TCCR1B,启动Timer1 ldi r16, timer1 out OCR1AL, r16 ; 设置Timer1比较匹配值低字节 ldi r16, 0x00 out OCR1AH, r16 ; 设置Timer1比较匹配值高字节 ldi r16, (1 << OCIE1A) ; 启用Timer1比较匹配A中断 out TIMSK, r16 ; 在中断掩码寄存器中开启Timer1中断 sei ; 开启全局中断 ; Timer1比较匹配A中断服务程序 TIMER1_COMPA_ISR: ldi r30, LOW(memory) ldi r31, HIGH(memory) ld r17, Z ; 从内存地址读取当前计数值 inc r17 ; 计数值加1 cpi r17, 10 ; 比较计数值是否达到10 brne CONTINUE_COUNT ; 未达到则跳转到CONTINUE_COUNT ldi r18, (1 << 5) ; 加载PD5置位值 out PORTD, r18 ; 点亮PD5引脚的LED ldi r17, 0x00 st Z, r17 ; 重置计数值为0 out PORTD, r16 ; 写入当前r16值到PORTD CONTINUE_COUNT: st Z, r17 ; 将更新后的计数值写回内存 reti
内容的提问来源于stack exchange,提问作者k224862 Ahmed Khalid Durrani
相关产品推荐
相关产品推荐

