【问题标题】:PIC16F877A - Interrupt using Push ButtonPIC16F877A - 使用按钮中断
【发布时间】:2023-03-20 17:30:02
【问题描述】:

这是任务: 您将使用“外部中断”引脚(引脚名称为“INT”)来产生中断。该引脚与 PICDEM 2 Plus 评估板上的开关“S3”相连。按下此开关将产生中断。 我们将此引脚配置为输入,启用外部中断,启用全局中断,并使用我们创建的名为“Push_Count”的寄存器跟踪我们生成此中断的次数。

这是我的代码:

; PIC16F877A Configuration Bit Settings

; ASM source line config statements

#include <p16F877A.inc>

; CONFIG
; __config 0xFF7B
 __CONFIG _FOSC_EXTRC & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF

                cblock  0x020
                        COUNTERL
                        COUNTERH
                        PUSH_COUNT
                endc

                org     0x0000          ;put next line of code at address 0x0000
RESET_V         goto    START           ;reset vector


START           org     0x040
                clrf    PUSH_COUNT      ;reset counter to 0
                clrf    INTCON          ;clear INTCON register
                bsf     INTCON,INTE     ;enable external int on INT pin
                bsf     INTCON,GIE      ;enable global int

                bsf     STATUS,RP0      ;switch to bank 1
                movlw   b'00000001'     ;set RB0 as input
                movwf   TRISB           ;move value to TRISB
                bcf     STATUS,RP0      ;switch to bank
                clrf    PORTB           ;clear PORTB output vector
                bsf     PORTB,0         ;turn on LED on RB0
                goto    $               ;loop here forever

INT_SERVICE     org     0x004
                call    DELAY
                incf    PUSH_COUNT,f    ;increment PUSH_COUNT
                bcf     INTCON,INTF     ;clear int flag
                retfie

DELAY           decfsz  COUNTERL        ;decrement COUNTERL
                goto    DELAY           ;if not zero, keep decrementing COUNTERL
                decfsz  COUNTERH        ;decrement COUNTERH
                goto    DELAY           ;if not zero, keep decrementing COUNTERH
                return

                END

我的问题是,每次我按下 PICDEM 2 上的 S3 开关时,中断都不起作用,PUSH_COUNT 寄存器的值不会增加/计数。我的代码有问题吗?我只是 PIC 的新手。谢谢

【问题讨论】:

  • 你的时钟频率是多少? DELAY 会不会太长。你如何检查“PUSH_COUNT”的内容?您是否在调试模式下运行?
  • 我的振荡器设置为 EXT,我没有设置任何时钟频率。我正在 MPLAB X 的“文件寄存器”窗口中检查 PUSH_COUNT 的内容
  • 对于板上的 EXT 时钟频率检查 Y2(或 Y1)。但更重要的是:当您中断调试模式(通过单击“调试主项目”运行)时,如果该变量在范围内,文件寄存器窗口将向您显示当前寄存器值。

标签: assembly interrupt pic


【解决方案1】:

我对 PIC 不熟悉,也不知道交换机是如何连接的,但是: 检查上拉配置是否与开关连接匹配(如果开关位于引脚和 VCC 之间,则无上拉)。检查边缘配置(OPTION-register)并检查是否在首次启用中断之前清除了 INTF。

另外,请注意是否没有用于开关的去抖动过滤器。在线路状态稳定之前,单独的开关可能会产生长系列的脉冲。高达 100 毫秒。这可能会使中断内的循环成为问题。 不知道你的时钟频率,我不知道循环需要多长时间。看起来你循环了 65536 次。

【讨论】:

    【解决方案2】:

    乍一看,您的代码看起来不错(免责声明;我从未使用过这张特定的图片,我通常用 C 编写代码)。

    这可能只是一个刷新问题,因为微芯片工具(例如 PicKit、ICD、...)无法获取实时内存信息,它们会在代码执行暂停时加载图片的内存。您的帖子没有提及任何排除此问题的内容。要查看变量的变化,您必须偶尔暂停执行,以便 IDE 有机会重新加载 PIC 的内存并刷新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多