ПИК - есть ли значение для RB7? - PullRequest
0 голосов
/ 19 марта 2011

Я прочитал порт RB7, и в проверке, если значение.если есть выход на RB7, я хочу, чтобы светодиод на моем чипе загорелся (светодиод 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 ]

2 голосов
/ 19 марта 2011

Три вещи:

  1. Входы всегда высокие или низкие, независимо от того, подключены ли к ним какие-либо устройства.У вас есть подходящая схема подтягивания или понижения?
  2. Возможно, вам нужно отменить этот вход, чтобы один вход не вызывал многократные изменения состояния.
  3. Это не похоже на васвсегда устанавливать выход D1 при запуске.Я бы не предположил, что по умолчанию используется какое-либо конкретное состояние.
0 голосов
/ 21 марта 2011

Вы читаете обратно значение output на B7, что не имеет большого смысла. B7 будет чистым (низким), если вы не установите его в коде, чтобы с B7 не происходило никаких изменений. В любом случае изменения выходной защелки для B7 не вызовут RBIF.

RBIF устанавливается, когда любой из RB7-RB4 меняет состояние. Вы объявили RB5 и RB4 в качестве входных данных, так почему бы вам не прочитать один из них при запуске RBIF?

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

Если у вас возникли проблемы с функцией прерывания при изменении порта, просто попробуйте следующую строку в коде основного цикла, чтобы подтвердить свой ввод-вывод.

  LATDbits.LATD1 = PORTBbits.RB5;

Если ваше оборудование не имеет подтягиваний или опусканий, вы должны включить слабые подтягивания на порте B, используя флаг RBPU в INTCON2. Обратите внимание, что они автоматически отключаются, когда вы объявляете вывод выводом.

...