微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检测PIC中的周期性GPIO变化

如何解决如何检测PIC中的周期性GPIO变化

我正在使用带有 MPLAB X IDE 的 PIC12F675 微控制器。我试图通过用光敏电阻监测 LED 来检测机器的状态。我让电路工作,当机器的 LED 亮起时,我的芯片正在获取输入并打开自己的 LED 以匹配。我现在不使用中断,而是不断轮询光敏电阻电路的输入。

当机器开启时,LED 的两种可能状态是闪烁和开启。当机器通电时,它永远不会只是关闭

我可以使用中断,但我一直在思考如何在轮询时等待一段时间。我正在监控的 LED 大约每秒闪烁两次。所以我需要看一秒钟,然后如果在那一秒内的任何时候引脚变低,则将其记录为“关闭”。 (输入引脚上有一个下拉电阻。)

我对 C 不是很有经验,只用它来编写像这样的小芯片来完成小任务。 C 是否有一些特性或功能对此有用?或者我忽略的逻辑中有什么方法吗?请帮我弄清楚如何检测闪烁的灯和亮灯。

这是我目前的代码

// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONfig

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin,I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = OFF      // brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

#define _XTAL_FREQ 4000000
#include <xc.h>
#include <stdlib.h>
#include <htc.h>

void init_ports(void) {
    ANSEL   = 0x00;  // Set ports as digital IO not analog input.
    ADCON0  = 0x00;  // Shut off ADC.
    CMCON   = 0x07;  // Shut off comparator.
    VRCON   = 0x00;  // Shut off the voltage reference.
    TRISIO  = 0xA;   // All GPIO pins output except 1&3.
    GPIO    = 0x00; // Make all pins LOW
    T0IE    = 0; // disable timer interrupt.
    GPIE    = 0; // GPIO port change interrupt
    GIE     = 0; // Global interrupt for recognition of interrupts.
}

void main(void) {
    init_ports();
    /* Wait 1 second for power up. */
    __delay_ms(1000);
    while(1) {
        // Check for input on GPIO 1
        if (GPIO & 0b000010) {
          // Turn on the LED on GPIO 4
          GP4 = 1;
        }
        else{
          // Turn off the LED on GPIO 4
          GP4 = 0;
        }
    }
}

解决方法

您甚至不必使用中断来跟踪时间。您所要做的就是设置一个自由运行的计时器,然后计时器将为您保留时间。您只需在需要时读取计时器,并保存当前时间值。因此,当您检测到输入发生变化时,您可以比较首次读取计时器值与当前计时器值之间经过的时间。请注意,我们在此处不以小时或分钟为单位使用术语“时间”。这只是您将为滴答事件定义的时基,即 1 毫秒。例如,使用 PIC12F675 的 Timer0 模块可以生成这个时基。您只需要添加 Timer0 init 函数并重建您的主代码。让我向您展示如何通过修改您自己的代码...

altname

希望它对您有所帮助。上面的代码在 MPLAB 仿真中进行了测试,并通过了仿真测试。你在你的真实硬件中测试它,如果你遇到任何问题,请告诉我。祝你好运!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。