You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:35:25