【问题标题】:Control relay from PIC18 microchipPIC18微芯片的控制继电器
【发布时间】:2016-09-04 15:01:47
【问题描述】:

我有一个 PIC18F24K20 微芯片,想控制一个继电器。它通过我的 RasPI 通过 GPIO 工作正常 - 但我无法通过我的微芯片让它工作。

我的测试程序是这样的:

#include <xc.h>

#define R1          LATBbits.LATB0
#define R1_TRIS     TRISBbits.RB0

#define R2          LATBbits.LATB1
#define R2_TRIS     TRISBbits.RB1

void main(void) {

    R1_TRIS = 0;
    R2_TRIS = 0;

    R1 = 1;
    R2 = 0;

    return;
}

我做错了什么?

【问题讨论】:

    标签: microchip mplab pic18


    【解决方案1】:
    1. 替换return;

    与:

    while(1)
    {
       ClrWdt();
    }
    
    1. 根据数据表,RB0 和 RB1 有几个模块连接到这些引脚,因此您应该验证它们是否已关闭: 模拟, ECCP, 比较器。 顺便说一句,为什么要使用两个引脚来控制一个继电器?

    3.您可能需要添加驱动程序才能操作继电器。

    根据数据表,添加以下初始化代码:

    CCP1CON=0;
    CCP2CON=0;
    ADCON0=0;
    CM1CON0=0;
    CM2CON0=0;
    

    配置位的 PBADEN 位也应为零。

    【讨论】:

    • 我只是使用两个引脚进行测试。无需驱动,只需输入信号即可开机。但是如何禁用引脚上的其他功能?
    • 我更新了答案。请尝试添加初始化代码。
    【解决方案2】:

    主函数永远不应该在嵌入式 PIC 处理器中返回。在某些实现中,它会导致软件复位,从而导致您的引脚返回高阻抗模式。尝试添加 while (1);在你的主要结尾。

    【讨论】:

    • 我将代码更改为: void main(void) { R1_TRIS = 0; R2_TRIS = 0; R1 = 0; R2 = 1; while(1){ // 保持程序运行 } } 但它仍然没有打开 RB1 或 RB0 上的继电器
    【解决方案3】:

    检查使用的引脚是否有其他功能。典型的问题是这些引脚兼作模拟引脚并且默认启用。

    通过在数据表中查找它们对应的 AN 引脚来禁用它们,并使用类似的代码禁用它们

      ANSEL.ANS0 = 0;  
      ANSEL.ANS1 = 0;
    

    如果您启用了看门狗功能,您可能还需要添加一个

      ClrWdt(); 
    

    到主 WHILE 循环(这是 Mathieu 的一个很好的建议)

    【讨论】:

    • 添加您提供的 ANSEL 代码时,我的 XC8 编译器无法构建?
    • 如果您使用的引脚具有模拟功能,请查看数据表。
    猜你喜欢
    • 2013-02-02
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多