Предыдущая Следующая

//в случае выполнения кода в 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 ? | ПРОГРАММАТОР | ПРОЕКТЫ | СТАТЬИ | ССЫЛКИ | КАРТА САЙТА
Hosted by uCoz