Доброе время суток.
Подскажите пожалуйста как правильно работать с прерываниями.
К 18F4550 подключены:
- rb0 rb1 часы реального времени
ds1307 по интерфейсу I2C;
- rc4,rc5 USB в режиме cdc(то есть com-порт);
- к rb4-rb7 кнопки, подтянуты через резисторы к 5в.
При нажатие на кнопки (rb4-rb7) необходимо чтобы
происходила обработка.
Но происходит за зацикливание в обоработчике #int_rb
Подскажите пожалуйста что делают неправильно.
Код приведен ниже
------------------------------------------------------------
#include ‹18F4550.h›
//configure a 12MHz crystal to operate at 48MHz
#fuses PLL3,CPUDIV1,USBDIV,HSPLL,NOFCMEN,NOIESO,BROWNOUT, BORV20,VREGEN,NOWDT,WDT32768,NOMCLR,NOLPT1OSC,NOPB ADEN,CCP2C1,STVREN,NOPROTECT,NOCPB,NOCPD,NOWRT,NOW RTC,WRTB,NOWRTD
#use delay(clock=12000000)
#include ‹usb_cdc.h›
#include "main.h"
//------------------------------------------------
#INT_RB
rb_handler()
{
disable_interrupts(int_rb);
//---
output_low(PIN_D0);
delay_ms(500);
output_high(PIN_D0);
delay_ms(3000);
output_low(PIN_D0);
delay_ms(500);
output_high(PIN_D0);
delay_ms(3000);
output_low(PIN_D0);
delay_ms(500);
//---
clear_interrupt(int_rb);
enable_interrupts(int_rb);
}
//------------------------------------------------
void main()
{
disable_interrupts(int_rb);
usb_cdc_init();
usb_init();
while(!usb_cdc_connected())
{
}
clear_interrupt(int_rb);
//если строчку ниже закоментировать
//USB и I2C работает,
//иначе программа зацикливается в обработчике #INT_RB
enable_interrupts(int_rb);
enable_interrupts(global);
do
{
usb_task();
output_low(PIN_D0);
delay_ms(500);
output_high(PIN_D0);
delay_ms(500);
if (usb_enumerated())
{
if(usb_cdc_kbhit())
{
data = usb_cdc_getc();
switch(data)
{
case '1' : {
//код получения времени и даты
//под I2C интерфейсу
//
}; break;
default : {
output_low(PIN_D0);
delay_ms(500);
output_high(PIN_D0);
delay_ms(50000);
output_low(PIN_D0);
delay_ms(500);
}; break;
}
delay_ms(50);
}
}
} while (TRUE);
}