0

我读取了端口 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; 
}
4

2 回答 2

2

三件事:

  1. 无论您是否有任何东西连接到它们,输入总是高或低。你有合适的上拉或下拉电路吗?
  2. 您可能需要对该输入进行去抖动处理,以防止单个输入触发多个状态更改。
  3. 看起来您从未在启动时设置过输出 D1。我不会假设它默认为任何特定状态。
于 2011-03-19T15:56:11.380 回答
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 上的弱上拉。请注意,当您将引脚声明为输出时,这些会自动关闭。

于 2011-03-21T13:28:46.863 回答