Цитата(misemikl @ Oct 15 2012, 15:06)

Я пишу в mikroC PRO, он ругается если вводишь имя функции
Тогда подробности смотрите в мануале mikroC.
Сорцы программ оформляйте тегами code, /code (иконка с рулоном бумаги и зелёной стрелкой).
А по программе:
- пишите комменты к 0b1010101010101, лучше в дифайнах и побитово (чтобы не лезть в ДШ из-за склероза);
- прерывание от IOCB может выглядеть как-то так (подробности по именам битов за Вами):
Код
volatile uint8_t prev_PORTB; // нужно хранить предыдущее состояние входов PORTB
void main(void)
{
...
// где-то после инициализации TRISB
prev_PORTB = PORTB & (TRISB_CFG & IOCB_CFG);
// 0b01011110 и 0b00100000 в Вашем случае
// ошибку видите?
// & (TRISB_CFG & IOCB_CFG) можно упростить до & IOCB_CFG, если TRISB и IOCB далее не меняются
// если меняются, вероятно стоит завести что-то вроде IOCB_mask = TRISB & IOCB;, обновляемую по случаю.
...
}
void interrupt()
{
if(RBIF) // приключилось прерывание от разрешённых в IOCB ног
{
// выделили изменившиеся ноги
uint8_t tmp = (PORTB ^ prev_PORTB) & IOCB_CFG;
// uint8_t tmp = (PORTB ^ prev_PORTB) & IOCB_mask;
// далее придётся каким-то образом перебрать все ноги, разрешённые в IOCB (или IOCB_mask);
if(tmp & (1<<0)) { ... }; // а ногам можно дать осмысленные дифайны
if(tmp & (1<<1)) { ... };
...
// обновить prev_PORTB
prev_PORTB ^= tmp;
// сбросить RBIF
RBIF = 0;
}
}
Цитата
приходит сигнал на пятую ножку В, как только приходит постоянный ноль,должно сработать прерывание
RBIF будет устанавливаться в 1 по _изменению_ любого разрешённого в IOCB бита PORTB, а не по постоянному нулю.
Если до момента "tmp = (PORTB ^ prev_PORTB) & IOCB_CFG;" нога вернётся в прежнее состояние, её изменение, естесно, не будет обработано.
Если состояние ноги изменится после "tmp = ...", но до "RBIF = 0;", это изменение тоже может быть пропущено.