//в случае выполнения кода в SRAM //Установки контроллера прерываний
VICProtection =0; //К регистрам VIC можно обращаться в пользовательском режиме VICIntEnClear = Oxffffffff; //Запретить все прерывания
VICDefVectAddr = (U16)&TimerInterrupt; //Адрес сервисной подпрограммы
//обработки прерывания VICIntSelect &= ~VIC_TIMER0_bit; //Линия IRQ от Таймера 0
VICVectAddrl = (U16)kTimerlnterrupt; //Адрес сервисной подпрограммы
//обработки прерывания VICVectCntll = 0x20 I VIC_TIMER0; //Разрешить вектор прерывания от Таймера 0
VICIntEnable = VIC_TIMER0_bit; //Разрешить прерывание от Таймера 0
VICIntSelect &= ~VIC_I2C_bit; //Линия IRQ от I2C.
VICVectAddr2 = (U16)&I2CInterrupt; //Адрес сервисной подпрограммы
//обработки прерывания VICVectCntl2 = 0x20 I VIC_I2C; //Разрешить вектор прерывания от I2C.
VICIntEnable = VIC_I2C_bit; //Разрешить прерывание от I2C.
}
//------------------------------------------------------------------------
♦pragma vector=0xl8
_irq ._arm void irq_handler(void)
{
void (*interrupt_function)(); U16 vector;
vector = VICVectAddr; //Поместить адрес вектора в контроллер VIC
interrupt_function = (void(*) ОJvector;
(*interrupt_function)(); //Вызов функции вектора прерывания
VICVectAddr =0; //Сброс прерывания в VIC
}
//функция-обработчик прерывания от I2C ------------------------------------
static void l2CInterrupt() {
switch(I2STAT) {
case (0x08): //было передано условие START
I2C0NCLR = 0x20; //сброс флага START I2C I2DAT=174; //передача адреса устройства на шине и признака записи (W)' //174=0М0101110: тип устройства I2C - EEPROM (1010), //адрес устройства I2C на шине (111) и признак записи (0)
break;
case (0x10): //было передано условие повторный START
I2C0NCLR = 0x20; //сброс флага START I2C I2DAT=175; //передача адреса устройства на шине и признака чтения (R) //175=0Ы0101111: тип устройства I2C - EEPROM (1010), //адрес устройства I2C на шине (111) и признак чтения (1) //переход в режим ведущего приемника
break;
case (0x18): //был передан адрес ведомого + W, получен АСК
//передача старшего байта адреса ячейки EEPROM 24LC64 I2DAT=(I2C_addres & 0xFF00)»8;
//задать порядковый номер переданного байта данных
NUM_byte = 0; break;
case (0x28): //был передан байт данных, получен АСК
swi tch(NUM_byt e) {
case (0): //был передан старший байт адреса ячейки
//передача младшего байта адреса ячейки EEPROM 24LC64 I2DAT=(I2C_addres & OxFF);
//задать порядковый номер переданного байта данных NUM_byte = 1; break;
case (1): //был передан младший байт адреса ячейки
switch(wr_rd)
{
case (0):
//передача байта данных EEPROM 24LC64 I2DAT=I2Cwr_byte;
//задать порядковый номер переданного байта данных
NUM_byte break; case (1):
I2C0NSET break; default: break;
= 2;
0x20;
//передать условие START I2C //повторный START
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |