为什么 LED 保持亮起而不是闪烁?

2024-05-27

这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码。端口 A 的引脚 0 (RA0) 未切换至关闭位置。请帮忙...

我是图片组装的新手,我想掌握图片。有没有高手帮我学习一下...

我需要以 1 秒的间隔眨眼。 代码是:

    #include "p16F676.inc"
 
    __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_OFF
    MyCount   EQU       0x20    
    RES_VECT    CODE 0x0000     
        GOTO    CODE_INIT     
    
    ISR     CODE 0x0004     
        GOTO    ISR_HANDLER     
    
    ;MAIN_PROG   CODE    
    CODE_INIT:          
        CALL    PORT_INIT       
        CALL    TIMER_INIT      
        GOTO    IDLE_LOOP       
    
    ISR_HANDLER:   
        DECFSZ    MyCount, 1        
        RETFIE
        movlw 0x01 
        xorwf PORTA, F    
        BCF     INTCON, TMR0IF  
        MOVLW   d'10'       
        MOVWF   TMR0        
        RETFIE      
    IDLE_LOOP:
        NOP
        NOP             
        NOP
        NOP
        GOTO    IDLE_LOOP   
    PORT_INIT:
        BSF     STATUS, RP0 
        MOVLW   b'00000000'     
        MOVWF   ADCON1      
        MOVWF   ANSEL       
        MOVWF   TRISA       
        RETURN   
    TIMER_INIT:
        CLRWDT          
        MOVLW   b'00000110'     
        MOVWF   OPTION_REG    
        BSF     INTCON, GIE     
        BSF     INTCON, TMR0IE    
        BCF     STATUS, RP0   
        MOVLW   d'18'       
        MOVWF   MyCount     
    
        BCF     INTCON, TMR0IF  
        MOVLW   d'10'       
        MOVWF   TMR0        
        RETURN    
        END

看来是赌延迟的问题。但对预标量和计数器进行改组可以保持引导位置不变。我需要打开和关闭 LED。


以下是我在您的代码中发现的一些问题...

1.端口初始化错误

正如我在中提到的这个答案 https://stackoverflow.com/a/77071601/12749998你的初始化代码缺少代码CMCON,控制模拟比较器模式的寄存器。以下是正确设置的方法:

BCF     STATUS,RP0  ;Bank 0
CLRF    PORTA       ;Init PORTA
MOVLW   05h         ;Set RA<2:0> to
MOVWF   CMCON       ;digital I/O
BSF     STATUS,RP0  ;Bank 1
CLRF    ANSEL       ;digital I/O
CLRF    TRISA       ;set all pins as outputs
BCF     STATUS,RP0  ;Bank 0

2.你的定时器设置不会给你1秒的延迟

您将预分频器设置为 1:128,意味着定时器将每 128us 递增一次。
您的计时器重载值为 10,这意味着它将计数 245 直到溢出。那么你的溢出率为128us * 245 = 31360us.
为了从此值产生 1 秒延迟,您应该使用辅助变量并将其设置为1000000 / 31360 = 31.8877我们将其四舍五入为十进制的 32。所以你应该加载MyCount变量为 32,以便总共生成 1 秒的延迟。
但你的实际值是十进制的 18,这将是18 * 31360 = 564.480ms大约是半秒。

3. 不正确的中断处理

让我们先看看你的timer0中断处理程序代码。

ISR_HANDLER:   
    DECFSZ  MyCount, 1        
    RETFIE
    movlw   0x01 
    xorwf   PORTA, F    
    BCF     INTCON, TMR0IF  
    MOVLW   d'10'       
    MOVWF   TMR0        
    RETFIE  

每次timer0 遇到中断时,您都应该清除timer0 标志。但只有当计数器达到零时才将其清除。但问题是:程序将陷入定时器中断,直到其标志被清除。所以DECFSZ MyCount, 1由于连续调用定时器中断,指令将非常快速地执行,导致输出引脚非常快速地闪烁。因此没有人的眼睛会发现它在闪烁。
另一个问题是你没有重新加载MyCount达到零后的值。这将导致变量下溢到 255,并且在第一次之后它将始终从 255 开始倒数。

因此,您应该做的是清除标志并在每次中断发生时重新加载timer0值,无论计数器的值如何。您还应该重新加载MyCount值,以便从计算值开始不断倒计时。最后,定时器中断的正确流程如下:

ISR_HANDLER
    bcf     INTCON, TMR0IF
    movlw   d'10'
    BANKSEL TMR0    ; Make sure you're in correct data bank
    decfsz  MyCount, 1
    retfie
    movlw   d'32'
    BANKSEL MyCount ; Again make sure you're in correct bank
    movwf   MyCount
    ; PORTA and MyCount are in the same bank since MyCount's address is 0x20
    movlw   1
    xorwf   PORTA, F ; Toggle output due to 1 sec time out
    retfie  

将上述修复应用到您的代码中,然后重试。让我知道结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 LED 保持亮起而不是闪烁? 的相关文章

  • 了解汇编语言中的 cmpb 和循环

    我有一个函数 string length 它具有以下汇编代码 0x08048e90 lt 0 gt push ebp 0x08048e91 lt 1 gt mov esp ebp 0x08048e93 lt 3 gt mov 0x8 ebp
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • 优化算术编码器

    我正在优化名为的 C 库的编码步骤PackJPG http www elektronik htw aalen de packjpg 我使用 Intel VTune 对代码进行了分析 发现当前的瓶颈是 PackJPG 使用的算术编码器中的以下
  • 有哪些 x86 指令会对 ESP 产生副作用?

    我知道call and ret将修改的值esp然后push and pop有很多变体 但是还有其他指令会影响堆栈指针吗 The following instructions modify the stack pointer as an im
  • MIPS 汇编不支持“.set noat”吗?

    目前 我正在学习GNU as 并在 info as 中找到了很多有用的信息 我发现 set noat 在MIPS指定的代码中使用 但是当在 info as 中搜索该指令时 我在节点 alpha指令 中找到了它的解释 但在 MIPS Depe
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • 为什么我可以访问寄存器中较低的双字/字/字节,但不能访问较高的双字/字/字节?

    我开始学习汇编程序 这对我来说看起来不合逻辑 为什么我不能在寄存器中使用多个高字节 我明白了历史原因rax gt eax gt ax 所以让我们关注new64 位寄存器 例如 我可以使用r8 and r8d 但为什么不呢r8dl and r
  • RISC-V反汇编器与秒杀运行结果不符?

    我已经设置了一个 hello world 程序只是为了测试我的riscv32 unknown elf工具链 spike pk等等虽然我设法使用打印了 hello worldspike isa RV32 pk hello elf 我发现如果我
  • 两个 16 位数字相乘 - 为什么结果是 32 位长? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我将两个 16 位数字相乘 结果将是 32 位长 但为什么会这样呢 对此有何明确解释 为了我的正确理解 其计算方法是 n 位数字乘以
  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • 二元炸弹 - 第 6 阶段

    这是拆解phase 6 08048dbf
  • 使用 Windows (XP+) api 发送(串行)中断

    有没有比 setcommbreak delay clearcommbreak 序列更好的方法来发送串行中断 我必须与使用串行中断作为 115k2 上数据包开头的微控制器进行通信 而 setcommbreak 有两个问题 对于 115k2 中
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 如何在 MOS 6502 的 asm 中创建延迟

    我是 ASM 新手 我正在尝试研究如何为以下代码创建延迟 org 1000 loop inc d021 jmp loop 我想评论已经足够清楚了 每帧更改颜色的代码示例 1 50 秒 sei enable interrupts loop1
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 内存映射图形输出

    我正在探索使用内存映射图形绘制像素和线条 我在 Windows 的 Textpad 中使用 TASM 当我单击 运行 时 整个屏幕变成蓝色 就是这样 没有绘制像素 model small stack data saveMode db xVa
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • 为什么我们要关闭 Mysqli 中的结果

    为什么我们要关闭 result mysqli new mysqli localhost root root test if mysqli gt connect errno echo Failed to connect to MySQL my
  • Freebase RDF 转储的 C# 解析仅产生 1150 万个 N-三元组,而不是 19 亿个

    我正在构建一个 C 程序来读取 RDF 数据Google Freebase 数据转储 https developers google com freebase data 首先 我编写了一个简单的循环来简单地读取文件并获取三元组的计数 然而
  • 控制 HTML 中的图像加载顺序

    有没有办法控制网页上图像的加载顺序 我正在考虑尝试通过首先加载轻量级 加载 图形来模拟预加载器 有任何想法吗 Thanks 使用 Javascript 并填充图像src属性稍后 这 告诉浏览器链接到页面上的 URL 因此不会向服务器发送请求
  • 最小工作聚合物示例

    我一直在尝试使用 Polymer 获得一个极其简单的网页 以便在浏览器中简单地呈现 我在服务器端使用 Node ExpressJS Jade 设置 我的代码与 Polymer 文档附带的示例非常接近 我认为我缺少一些非常简单的东西 我正在使
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 除了在断点处停止之外,如何测量一大块代码的时间?

    我正在 Windows 上开发 C 游戏 模拟 图形应用程序 编辑开始 如果重要的话 我正在使用 Visual Studio 2013 编辑完 Setup 我正在使用 QueryPerformanceCounter 测量从一帧到下一帧的时间
  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • 无法在 phppgadmin 中编辑或删除数据或行

    当我尝试在 phppgadmin 中编辑数据时 无论哪个表或行 我总是收到以下通知 No unique identifier for this row 并且没有任何更改 保存 我登录的用户对数据库具有完全权限 并且数据库中的所有表都有主键
  • Facebook API 注销我的应用程序,但不注销 Facebook

    如何使用 Facebook 的 api 进行注销 让我退出我的应用程序 网站 但保持登录 facebook com 的状态 这让我登录正常 window fbAsyncInit function FB init appId status t
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • Cookie 过期时间格式

    我从谷歌浏览器的 Cookies 文件和其中的一列创建了数据库cookies表是expires utc 该列的格式类似于 13169399213145330 这更像是unix时间 但是当我尝试使用 unix 时间转换器时 它给出了错误的值
  • 接口对象无法扩展 Record

    为什么接口无法扩展Record interface Data a string Data extends Record
  • dplyr 标准评估:summarise_ 以及求和变量的变量名称

    我遇到了很多与我的问题类似的问题 但只解决了我问题的一部分 我使用带有标准评估的 dplyr 来容纳变量名称 这对于管道中的 filter 和 group by 效果很好 但是 为了总结 我无法为我正在求和的指标提供变量名称 一个例子就可以
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • 在 UIPickerView 中选择某些内容时发生某些事情

    我正在致力于创建一个使用 UIPickerView 的应用程序 我制作了视图 但我试图让某个按钮改变它的功能 请帮忙 UIPickerView 和许多其他控件使用委托模式来通知您发生的事件 要使用它添加
  • 使用“class-validator”在 TypeScript 中确认密码

    今天 我试图弄清楚如何在应用程序的后端 NestJS 验证注册表单 我只是想知道是否存在一种验证方法password and passwordConfirm匹配 使用class validator包来构建自定义验证器或利用提供的验证器 我正
  • 会话变量由于某种原因丢失

    我尝试建立一个电子商店 每件物品旁边都有一个asp imagebutton单击此图像按钮时 我正在检查会话变量是否session basket 是否存在 如果不存在 则我将值添加到列表 实体类 中 然后在会话中添加此列表 如果会话不为空 那
  • 在类中设置默认值

    我正在用 Python 创建一个类 但我不确定如何正确设置默认值 我的目标是为所有类实例设置默认值 也可以通过类方法对其进行修改 但是 我希望在调用方法后恢复初始默认值 我已经能够使用下面所示的代码使其工作 它不是很 漂亮 所以我怀疑这是解
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是