Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.02.2011, 17:30
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Не просыпается tiny2313 по INTO
Добрый день.
Столкнулся со странной проблемой выхода tiny2313 из powerdown.
Нужно было будить МК из powerdown по двум событиям - WD и low level INT0.
С WD проблем нет, раз в 8 секунд МК будится как часы, а вот когда прижимаю к земле INT0 то выполняется только код в прерывании INT0_vect и дальше МК продолжает спать.
Шаманил уже долго, errata читал, гугл тоже не помог. Что посоветуете?
Куски кода по делу, весть проект со схемой архивом ниже:
Код:
|
// настраиваем порты(ножки)
DDRB=0b11101111; // делаем выходами все порты PINB, кроме PB4(IRQ).
PINB=0b00000000; // выводим на все выходы PORTB 0
PORTB=0b00000000; // и НЕ подягиваем на +питания.
DDRD=0b11111011; // делаем выходами все порты PIND, кроме PD2 (INT0)
PIND=0b00000000; // выводим на все выходы PORTD 0
PORTD=0b00000000; // и НЕ подягиваем на +питания.
DDRA=0b11111100; // делаем выходами все порты PINA, кроме PA1 (STOP) и PA0 (STOP).
PINA=0b00000000; // выводим на все выходы PORTD 0
PORTA=0b00000000; // и НЕ подягиваем на +питания.
// конфигурим wachdog
WDTCSR|=(1‹‹WDIF)|(1‹‹WDIE)|(0‹‹WDE)|(1‹‹WDIE); // Watchdog Interrupt Flag=Enable, Watchdog Interrupt Enable, Mode=Interrupt Mode
WDTCSR|=(1‹‹WDP3)|(0‹‹WDP2)|(0‹‹WDP1)|(1‹‹WDP0); // Watchdog Typical Time=8sec (просыпаться будем раз в 8 секунд)
MCUCR|=(0‹‹ISC01)|(0‹‹ISC00); // The low level of INT0 generates an interrupt request.
GIMSK|=(1‹‹INT0); // External Interrupt Request 0 Enable
EIFR|=(1‹‹INTF0); // External Interrupt Flag 0
sei(); // разрешаем прерывания глобально
go_sleep(); // засыпаем
void go_sleep(void){
// вгоняем МК в POWER-DOWN
cli(); // зарещаем прерывания глобально
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei(); // разрешаем прерывания глобально
sleep_mode();
_delay_ms(20);
PORTD ^= 0b00010000;
_delay_ms(800);
_delay_ms(800);
PORTD ^= 0b00010000;
}
SIGNAL(WDT_OVERFLOW_vect){
//internalINT=2;
}
/****************** ЛОВИМ ПРЕРЫВАНИЕ НА INT0 ПО НИЗКОМУ ПОТЕНЦИАЛУ (ДЛЯ ВЫХОДА ИЗ POWER-DOWN) ********************/
SIGNAL(INT0_vect){
// сработали сигнальные входы и пробуждение по INT0, нужно выключить прерывание INT0
GIMSK=0; // External Interrupt Request 0 Disable
EIFR=0; // External Interrupt Flag 0 Disable
internalINT=1;
PORTD ^= 0b00010000;
_delay_ms(800);
PORTD ^= 0b00010000;
} |
|
|
|
Сказали "Спасибо" TechMike
|
|
|
05.02.2011, 18:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Попробуйте в ИНТе включать IDLE, после выполнения программы - снова POWER DOWN. И не забывайте снова включать ИНТ в ГИМСКе
|
|
|
|
05.02.2011, 19:30
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от niXto
|
Попробуйте в ИНТе включать IDLE, после выполнения программы - снова POWER DOWN. И не забывайте снова включать ИНТ в ГИМСКе
|
Не помогло, а только стало еще хуже. Добавил в прерывание по INT0
Код:
|
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode(); |
и как до него доходит, то все виснет напрочь...
Может в общем случае WD чудит, нужно при вызове прерывания INT0 что-то делать с WD?
|
|
|
Сказали "Спасибо" TechMike
|
|
|
05.02.2011, 20:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от TechMike
|
Не помогло, а только стало еще хуже. Добавил в прерывание по INT0
Код:
|
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode(); |
и как до него доходит, то все виснет напрочь...
Может в общем случае WD чудит, нужно при вызове прерывания INT0 что-то делать с WD?
|
Не выходя из прерывания уходить в слип? Что-то новенькое...
Прерывание должно быть обслужено и завершено. В слип только из основной программы.
|
|
|
|
05.02.2011, 22:11
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от ut1wpr
|
Не выходя из прерывания уходить в слип? Что-то новенькое...
Прерывание должно быть обслужено и завершено. В слип только из основной программы.
|
по ощущениям, прерывание выполняется но МК не выходит из powerdown.
Попробуб сам МК заменить, уж больно необычно все это.
|
|
|
Сказали "Спасибо" TechMike
|
|
|
05.02.2011, 22:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от TechMike
|
по ощущениям, прерывание выполняется но МК не выходит из powerdown.
Попробуб сам МК заменить, уж больно необычно все это.
|
Не полагайся на ощущения. ![Улыбка](images/smilies/icon_smile.gif)
В обработчике прерываний - минимум действий. Отработай обязательные (по запрету). Всё остальное - после обработчика. Следуя логике: "Раз уж мы здесь, значит нас разбудили". ![Улыбка](images/smilies/icon_smile.gif) Это в том случае, если у тебя выход из слипа по одному единственному прерыванию.. В противном случае нужна более расширенная логика.
И никаких delay(xx) внутри обработчика! А если у тебя в библиотеке используются таймерные задержки? А если на это время прерывания запрещены? delay навсегда?
Последний раз редактировалось ut1wpr; 05.02.2011 в 22:50.
|
|
|
|
05.02.2011, 23:28
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
|
|
|
Сказали "Спасибо" TechMike
|
|
|
05.02.2011, 23:37
|
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
TechMike, а вы не пробовали, пока не отладите INTO, не использовать
WD.
|
|
|
|
05.02.2011, 23:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от kittec
|
TechMike, а вы не пробовали, пока не отладите INTO, не использовать
WD.
|
Ну правильно. Метод исключений еще никто не отменял. Чего гадать?
|
|
|
|
06.02.2011, 00:44
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Собственно чем и занимаюсь, как показали опыты, если в прерывании INT0 не вырубать его возникновение (чтобы зря его не вызывать) то все функционирует как надо. Но это в некоторые моменты тормозит выполнение программы, так как включаю прерывание INT0 но еще не заснул МК...
|
|
|
Сказали "Спасибо" TechMike
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:33.
|
|