2011-03-19 44 views
0

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

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; 
} 
+0

对不起!这就是pic 18F4550,以及c18编译器。感谢您的帮助! – user001 2011-03-19 15:44:07

+0

您的意思是图片18F4550? – 2011-03-19 15:44:49

回答

2

三件事:

  1. 的输入总是高或低,无论你是否有任何有线了他们。你有适当的上拉或下拉电路吗?
  2. 您可能需要消除该输入以保持单个输入不会触发多个状态更改。
  3. 它看起来不像你在启动时设置输出D1。我不会认为它默认任何特定的状态。
+0

TRISD是我picdem上的LED这些是输出。我没有设备去调试或类似的东西。 – user001 2011-03-19 16:29:45

+0

我认为它比你的观点更基本2. yannick正在读取RBIF处理ISR中的输出锁存器。 Debouncing将在稍后发布。关于第3点,我认为由于C运行时清除RAM例程,可以确保输出设置为低电平,除非故意禁用该例程。 – Martin 2011-03-21 13:35:06

+0

是的,我最初没注意到闩锁的使用情况。 – 2011-03-21 14:08:45

0

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

当任何RB7到RB4改变状态时,RBIF被置位。你已经宣布了RB5和RB4作为输入,那么为什么当RBIF发生火灾时你还没有阅读其中的一个呢?

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

如果您有与该中断的端口,改变功能的麻烦,只是尽量在主回路下面的一行代码,以证明你的IO。

LATDbits.LATD1 = PORTBbits.RB5; 

如果你的硬件没有引体向上或拉起伏,你应该使用RBPU标志INTCON2在端口上开启B上的弱上拉UPS。请注意,当您将该引脚声明为输出时,它们会自动关闭。