// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here if (input_index==0) { OCR1B=((1023.0-PWMnach)/1023.0)*adc_data[input_index]+PWMnach; //delta=adc_data[0]-adc_data[4]; //if (delta>=0) {OCR1B=((1023.0-PWMnach)/1023.0)*(adc_data[4]/*+delta*/)+PWMnach;} //else {OCR1B=((1023.0-PWMnach)/1023.0)*(adc_data[4]/*+delta*/)+PWMnach;} } // External Interrupt(s) initialization // INT0: Off // INT1: Off MCUCR=0x00; //Вот здесь я пытаюсь отключить прерывание по INT1 но т. к. на INT1 низкий уровень я не могу выйти из этого прерывания. }
MCUCR=0x00; //Вот здесь я пытаюсь отключить прерывание по INT1 но т. к. на INT1 низкий уровень я не могу выйти из этого прерывания.
почему это не можешь ? вообще вроде как прерывания выключаются через "General Interrupt Control Register" ну там ещё обычно надо бы сбросить какие нить флаги , например в GIFG, проверить вложенные прерывания...
EDIT: имел ввиду, разумеется, регистр GIFR
Последний раз редактировалось nest 06 янв 2009, 18:23, всего редактировалось 2 раз(а).
avr123.nm.ru, вы сегодня спали ещё хуже чем обычно ?
если кто где чего неверно сказал. вы поправьте открытым ясным текстом, доводами, там, или цитатами. и старайтесь в сообщениях хоть от обсуждаемой темы не отклоняться, даже если у вас что то непоправимое случилось.
В Протеусе проверяю, 8-го приду на работу выложу проект целиком, просто не хотел грузить, а то там сильного много я всего наваял, уже самому тяжело осиливать что я там и где писал.
Вот проект целиком. Работать должно по идее так, потенциометром задаеца величина ШИМ двигателя, на INT1 заведено прерывание по низкому уровню от ШИМ, т. е. в момент когда ШИМ находица в нуле в этот момент измеряеца какое напряжение вырабатывает двигатель в этот момент и при необходимости увеличивает или уменьшает ШИМ. Причем прерывания по INT1 я включаю периодически, а у меня получаеца что при попадании в прерывание я не могу из него выйти.
Вместо MCUCR=0x00; (настройка от чего ИНТ срабатывает) я воткнул GICR = 0; General Interrupt Control Register – GICR стр 49 даташит и подробнее стр 67 - он включает и выключает прерывания INT Из прерывания вышел таки ...
Настройка внешних прерываний "External Interrupts" стр 66 По русски в даташите на http://avr123.nm.ru/02.htm
В курсе по AVR я прошу: Узнайте в даташите что делает каждая строка кода созданого мастером CVAVR или ICC
Добавлено спустя 26 минут 43 секунды: ИМХО врядли имеет смысл мерить напругу так часто. Поэтому я бы отключал ШИМ например 100 раз в сек и делал спокойно АЦП - 10 подряд и усреднение последних 4 значений, а потом снова ШИМ включать.
Переключи на жругой вход АЦП чтоб i2c не занимать.
И на АЦП подавай через RC цепочку 1 ком и конденсатор наверно 100 нФ