基于PIC16F84A汇编的PWM项目栈下溢问题求助
PIC汇编生成PWM时栈下溢问题解决
我正在完成一个课程项目,需要用PIC汇编语言生成PWM信号。为简化实现,设置高电平5ms、低电平15ms,通过多次调用同一个delay_5ms子程序来实现,但却引发了栈下溢问题。我刚接触编程,不确定解决方法,已尝试搜索但未找到方案,使用的开发环境是MPLab 9.82。
原代码如下:
list p=16F84A #include <p16F84A.inc> __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF ;关闭看门狗定时器 org 0x00 ;程序从0x00地址开始执行 counter equ 4Fh ;在RAM的4Fh位置定义计数器 BSF STATUS, RP0 ;选择Bank 1 BCF TRISB, D'1' ;将PORTB的第1脚设置为输出 BCF STATUS, RP0 ;选择Bank 0 goto main main BSF PORTB,1 ;PORTB第1脚置高(输出高电平) call delay_5ms ;调用5ms延时子程序 BCF PORTB,1 ;PORTB第1脚置低(输出低电平) call delay_5ms ;调用5ms延时子程序 call delay_5ms ;调用5ms延时子程序 call delay_5ms ;调用5ms延时子程序 delay_5ms movlw D'200' ;将十进制200载入工作寄存器W movwf counter ;将W中的值存入计数器 lp nop ;空操作,占用1个指令周期 nop ;空操作,占用1个指令周期 decfsz counter ;计数器减1,若结果为0则跳过下一条指令(1个指令周期) goto lp ;跳转到lp标签(2个指令周期) return ;返回主程序 end
问题原因
你的main段执行完四次延时调用后,没有循环跳转逻辑,程序指针会继续向下执行delay_5ms的代码。此时不是通过call指令调用子程序,所以不会把返回地址压入栈中;当执行到delay_5ms里的return时,栈中没有有效的返回地址可取,就会触发栈下溢错误。
修复方法
在main段的最后添加goto main,让程序循环执行PWM的高低电平切换逻辑,避免程序指针意外进入子程序代码:
修改后的完整代码:
list p=16F84A #include <p16F84A.inc> __CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF ;关闭看门狗定时器 org 0x00 ;程序从0x00地址开始执行 counter equ 4Fh ;在RAM的4Fh位置定义计数器 BSF STATUS, RP0 ;选择Bank 1 BCF TRISB, D'1' ;将PORTB的第1脚设置为输出 BCF STATUS, RP0 ;选择Bank 0 goto main main BSF PORTB,1 ;PORTB第1脚置高(输出高电平) call delay_5ms ;调用5ms延时子程序 BCF PORTB,1 ;PORTB第1脚置低(输出低电平) call delay_5ms ;调用5ms延时子程序 call delay_5ms ;调用5ms延时子程序 call delay_5ms ;调用5ms延时子程序 goto main ;循环执行PWM逻辑 delay_5ms movlw D'200' ;将十进制200载入工作寄存器W movwf counter ;将W中的值存入计数器 lp nop ;空操作,占用1个指令周期 nop ;空操作,占用1个指令周期 decfsz counter ;计数器减1,若结果为0则跳过下一条指令(1个指令周期) goto lp ;跳转到lp标签(2个指令周期) return ;返回主程序 end
内容的提问来源于stack exchange,提问作者iwasjohn
相关产品推荐
相关产品推荐

