Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.02.2011, 12:00
|
#21
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от omercury
|
Код:
|
EIFR=0; // External Interrupt Flag 0 Disable
internalINT=1; |
Зачем это, если не секрет? При выходе из прерывания оно само всё сбросит.
А вообще, контроллер точно выполняет то, что Вы ему написали. Он выполняет вот это:
Код:
|
// сработали сигнальные входы и пробуждение по INT0, нужно выключить прерывание INT0
GIMSK=0; // External Interrupt Request 0 Disable
EIFR=0; // External Interrupt Flag 0 Disable
internalINT=1; |
и дальше честно спит.
Как же он будет выполнять отключенное прерывание?
Либо не отключайте, либо не забывайте после выполнения реакции на прерывание снова включить его.
|
GIMSK=0; это чтобы вырубить прерывание по INT0 и спокойно обработать выход из powerdown. Иначе это прерывание будет вызываться постоянно, так как лог.0 на INT0 может быть сколько угодно долго.
Мне не важно по какому прерыванию проснулся МК, я потом обрабатываю состояние выходов и выполняю некую логику.
Сейчас все получилось, достаточно было убрать из прерывания INT0 выключение этого самого прерывания. Если кто предложит другой элегантный способов, чтобы выключать INT0 сразу после его возникновения, готов выслушать и отладить?
|
|
|
|
06.02.2011, 12:20
|
#22
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Пока контроллер не получил RETI (если конечно SEI не включать), он не бросится в следующий раз выполнять обработчик. То есть при входе в обработчик автоматически отключаются прерывания(сбрасывается флаг I). Если их специально не разрешить, они и не возникнут. Команда RETI - и есть включение прерываний (установка флага I) совмещённая с выходом из подпрограммы.
И, чтобы МК не кидался в прерывание, сразу после выхода из него, можно его(прерывание) сделать по перепаду, а не по уровню. Тогда, пока не придёт новый перепад, прерывание генерироваться не будет.
Последний раз редактировалось omercury; 06.02.2011 в 12:29.
|
|
|
|
06.02.2011, 12:33
|
#23
|
Вид на жительство
Регистрация: 07.03.2005
Сообщений: 300
Сказал спасибо: 13
Сказали Спасибо 117 раз(а) в 62 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
"Неправда Ваша, tiny2313 прекрасно выходит из power_down по INTO. Могу скинуть пример, можно для протеуса. "
А не надо в PROTEUS. Надо что бы в натуре работало. А даташит я то же читал. Но в железе это так и не заработало! Все, что смог добиться только "Idle" И я не первый. Человек например вот так вышел из положения.
|
|
|
|
06.02.2011, 12:50
|
#24
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от mironov
|
А не надо в PROTEUS. Надо что бы в натуре работало.
|
ATtiny2313 работает и в "натуре ", а Ваш пример для niny45 мне ни о чем не говорит.
|
|
|
|
06.02.2011, 14:33
|
#25
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Сообщение от omercury
|
Пока контроллер не получил RETI (если конечно SEI не включать), он не бросится в следующий раз выполнять обработчик. То есть при входе в обработчик автоматически отключаются прерывания(сбрасывается флаг I). Если их специально не разрешить, они и не возникнут. Команда RETI - и есть включение прерываний (установка флага I) совмещённая с выходом из подпрограммы.
И, чтобы МК не кидался в прерывание, сразу после выхода из него, можно его(прерывание) сделать по перепаду, а не по уровню. Тогда, пока не придёт новый перепад, прерывание генерироваться не будет.
|
Из powerdown tyny2313 выходит только по low level in INT0
|
|
|
|
06.02.2011, 18:07
|
#26
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Не просыпается tiny2313 по INTO
Вообщем остановился на том, что есть. МК выходит из сна по WD или INT0.
Для истории код в winavr+tiny2313:
Код:
|
// настраиваем порты(ножки)
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 секунд)
/****************** ЛОВИМ ПРЕРЫВАНИЕ WATCHDOG ********************/
SIGNAL(WDT_OVERFLOW_vect){
internalINT=2;
}
void go_sleep(void){
// вгоняем МК в POWER-DOWN
sei(); // разрешаем прерывания глобально
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
cli(); // зарещаем прерывания глобально
GIMSK=0; // External Interrupt Request 0 Disable
EIFR=0; // External Interrupt Flag 0 Disable
}
/****************** ЛОВИМ ПРЕРЫВАНИЕ НА INT0 ПО НИЗКОМУ ПОТЕНЦИАЛУ (ДЛЯ ВЫХОДА ИЗ POWER-DOWN) ********************/
SIGNAL(INT0_vect){
// сработали сигнальные входы и пробуждение по INT0
internalINT=1;
} |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:17.
|
|