【问题标题】:Reading state of input pins on a PIC18读取 PIC18 上输入引脚的状态
【发布时间】:2012-04-04 23:05:05
【问题描述】:

我已经能够让输出在我的 PIC 上工作,并且可以在我将各种输出锁存器设置为高/低时使一堆 LED 闪烁。但是,我在大头针状态下阅读时遇到了很多困难。

请参阅下面的代码。我设置了我的配置,并将 TRISC 定义为输入,将 TRISB 定义为输出。在一个无限循环中,我检查 RC6 是高还是低,并根据结果将整个 B 锁存器设置为高或低。

#include <htc.h>

__CONFIG(1, FOSC_IRC   & FCMEN_OFF & IESO_OFF);
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF);
__CONFIG(3, MCLRE_OFF);
__CONFIG(4, STVREN_ON  & LVP_OFF   & DEBUG_OFF);
__CONFIG(5, 0xFFFF);
__CONFIG(6, 0xFFFF);
__CONFIG(7, 0xFFFF);

void main(void)
{
  TRISC = 0xFF; // input
  TRISB = 0x00; // output

  while (1)
  {
    if (PORTCbits.RC6 == 0)
      LATB = 0b00000000;
    else
      LATB = 0b11111111;
  }

  return;
}

代码编译良好,没有警告或错误。如果我的代码逻辑只是将锁存器设置为高电平和低电平,那么它可以正常工作,但我无法成功读取引脚的状态。

有什么想法吗?

我正在使用 PIC18F14K50 和 MPLAB v8.43 以及 HiTech ANSI C 编译器。

我的连接是 +5V 到 VDD(引脚 1),VSS(引脚 20)到地。我有 +5V 到 C6(引脚 8),以及从 B7(引脚 10)到地的 100K 电阻和 LED。要切换 RC6,我将电线连接/断开连接到 C6。

     ┌────────┐
+5v -│ 01  20 │- gnd
    -│ 02  19 │-
    -│ 03  18 │-
    -│ 04  17 │-
    -│ 05  16 │-
    -│ 06  15 │-
    -│ 07  14 │-
+5v -│ 08  13 │-
    -│ 09  12 │-
led -│ 10  11 │-
     └────────┘

【问题讨论】:

    标签: microcontroller pic pic18 mplab


    【解决方案1】:

    不幸的是,PIC 上的 ADC 引脚在上电时被配置为模拟输入。您需要禁用该引脚上的 ADC 功能才能将其用作数字输入。

    清除 ANSELH 的位 0 会将 RC6 设置为数字输入。然后你的代码就可以工作了。

    这在数据表的第 9.4 节:端口模拟控制中有记录

    PIC18F/LF1XK50 Datasheet

    【讨论】:

    • 谢谢,在我的真实代码中,我使用所有引脚,而不仅仅是 RC6。要将所有引脚设置为数字而不是模拟,我会将ANSEL = 0; ANSELH = 0; 放在我的main() 方法的开头?
    • 或者我需要对 ADCON1 做些什么吗?
    • 是的,将 ANSEL 和 ANSELH 设置为 0 将清除所有模拟功能。
    • 我昨天下午测试了这个,效果很好。我的 PIC 代码终于可以工作了。非常感谢:)
    【解决方案2】:

    设置...

    TRISC = 1; // input
    

    ...应仅将 PORTC 的引脚 RC0 设置为输入引脚,所有其他引脚定义为输出。 所以PORTCbits.RC6 == 0 不应该返回正确的 RC6 引脚输入状态。

    TRISC = 255 应该将 PORTC 的所有引脚设置为输入。

    【讨论】:

    • 感谢您发现 - 我应该看到它。我更新了我的代码,但结果是一样的。当我将 +5V 加到 RC6 时,什么也没有发生。我已经更新了我的问题并将其保持打开状态。
    【解决方案3】:

    值得一提的是,其他一些 PIC18 变体的设置有所不同:

    PIC18F4520PIC18F4680 上,您需要通过 ADCON1 寄存器而不是 ANSELH 将引脚配置为数字引脚。

    位设置为 1 将使 pin 数字化

    除此之外,您还需要通过在相应的 TRIS 寄存器中将一个位设置为 1 来使它们成为输入引脚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多