PIC - RB7有值吗?

时间:2011-03-19 15:39:05

标签: c microcontroller pic

我读取端口RB7,并在if中检查值。如果RB7上有输出我希望我芯片上的LED亮起(LED D1),但即使没有任何连接到RB7,它也会一直燃烧。我做错了什么?这是PIC 18F4550它是用mplab v8.63和C18编译器编写的。

void main (void) 
{  
 TRISD = 0x00;            // PORTD  als uitgang 
 TRISB = 0b00110000;      // RB4 en RB5 als ingang 

 RCONbits.IPEN = 0;    // prioriteit uit 
 INTCONbits.GIE = 1;   // enable interrupt 
 INTCONbits.RBIE = 1;  // interrupt portB aan 

 TRISBbits.TRISB7 = 0; 
 TRISBbits.TRISB6 = 0; 
 TRISBbits.TRISB3 = 0; 

 while(1) 
 {  
  _asm sleep _endasm  
 } 
} 
#pragma interrupt ISR 
void ISR (void) 
{ 
 if (INTCONbits.RBIF==1) 
 {   
  if(LATBbits.LATB7 == 1)    // value on RB7 ? 
  { 
   LATDbits.LATD1 ^= 1;    // D2 togglen 
  } 
 }  
 INTCONbits.RBIF = 0; 
}

2 个答案:

答案 0 :(得分:2)

三件事:

  1. 无论您是否有任何连线,输入始终为高或低。你有适当的上拉或下拉电路吗?
  2. 您可能需要对该输入进行去抖动,以防止单个输入触发多个状态更改。
  3. 看起来你没有在启动时设置输出D1。我不认为它默认为任何特定的状态。

答案 1 :(得分:0)

您正在回读B7上的输出值,这没有多大意义。 B7将清除(低),除非您在代码中设置它,因此B7没有变化。在任何情况下,更改B7的输出锁存器都不会触发RBIF。

当RB7至RB4中的任何一个改变状态时,RBIF置位。您已将RB5和RB4声明为输入,那么为什么不在RBIF触发时读取其中一个?

if (PORTBbits.RB5 == 1)
   LATDbits.LATD1 ^= 1;

如果您在端口中断更改功能方面遇到问题,只需在主循环代码中尝试以下行来证明您的IO。

  LATDbits.LATD1 = PORTBbits.RB5;

如果您的硬件没有上拉或下拉,则应使用INTCON2中的RBPU标志启用端口B上的弱上拉。请注意,当您将引脚声明为输出时,这些会自动关闭。