ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
572704
Ljutik1 (14.01.2015 17:05, просмотров: 19210)
Помогите с CAN AVR ATmega32 !!! Проблема в том, что периодически (через совершенно произвольные промежутки времени) процессор перестает вываливаться в прерывания по определенным MOb. Помогает перезапись регистра CANCDMOB = 0xD0; (или 0х90) И еще. Так и не осознал разницу между CANCDMOB = 0xD0; и CANCDMOB = 0x90; Вот обработчик прерывания: interrupt [CAN_IT] void can_isr(void) { char addr, temp1; // Place your code here unsigned char i, flag, temp_c; char temp_f, temp_f1; CANGIE &= (~(1<<ENRX)); //Запретить прерывание по приему temp_f1 = CANSIT1 ; temp_f = CANSIT2; LED_CAN = !LED_CAN; //чтоб видеть прерывания timer_can = time_can; if ((temp_f & 0b1)!=0) // MOB 0 { CANPAGE = 0<<4; addr = CANMSG; // первым байтом идет дополнительный адрес пакета temp1 = 0; while ((temp1 < 7) & ((addr+temp1) <= max_data_reg)) // ну, здесь данные переписываются в массив { data_reg [1] [addr + temp1] = CANMSG; temp1++; } CANSTMOB &= ~(1<<RXOK); //сбросить флаг удачного завершения приема CANCDMOB = 0xD0; } CANGIE=0b10100000; } Больше нигде в программе CANCDMOB не используется.