Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу пробудить М8 из спящих режимов внешним перыванием(
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Electronic)
доработал програму для ухода схемы в спящий режиим. всё не плохо потребление 7,5мкА но не могу пробудить внешним перыванием по INT1. в рабочем режиме всё происходит как и задано программно в прерывании, загораются диоды проверочные и т.д. а только уходит в режим PowerDown не пробуждается и не делает прерывание. из Idle так же не выходит. Хотя сделал всё GICR = 0x80;(разрешение прерывания INT1) +подтягивающий резистор PORTD=0x08;(для +5В на INT1) + MCUCR = 0xa0(спящий режим powerdown); + asm("sleep");

вот само прерывание

#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
WDTCR=0x1F;
WDTCR=0x0F;
LED_ON;
PORTB = 0x10;
PORTC = 0xfe;
PORTD = 0x0f;
LED_ON;
}
если бы порты конфигуриролись как написано то всё бы на плате светилось после замыкания INT на землю). в рабочем режиме замыкаю INT1 на землю всё светится. после ухода в спячку пробуждатся по этому прерыванию не хочет = на плате темнота))

вот подсказанная мне информация из даташита на М8
"Low level interrupts on INT0/INT1 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode."

Подскажите что это может быть!???
Electronic)
добавлю что в книге написано что контроллер сам выходит из спящего режима по любому прерываю что доступно в данном режиме. или может напутали и всё таки нужна какая то команда?

и вот кусок программы который уводит в режим слип при принятии символа с UART:


unsigned char uart0_rx_isr(void)
{
//uart has received a character in UDR
ch=UDR;
/*вот эта строчка уводит в слип*/
UCSRB=0;WDTCR=0x1F;WDTCR=0x00;/*запрещаю WDT что бы не ресетился*/MCUCR = 0xa0;PORTD=0x08;PORTB=0;PORTC=0;asm("sleep");asm("nop");
/*это продолжение порграммы вам её читать не обязательно*/
if(sb==1){TCCR0=0;sb=0;if(ch>=128){CLI();ST=1; UDR=0;UCSRB=0x08;/*only peredacha*/ch-=128;UDR=('#');d();UDR=('1');d();UDR=ch;UCSRB=0;EP_W(0,ch);lcd_t(ch);while(1);}else{ch=0;sl_count=0;TCC
R1B=0x05;}}
if(ch==42){sb=1;UDR=0;UCSRB=0x90;pause_timer1();/*only priyom*/timer=0;TCCR0 = 0x05;}
}
smac
Цитата(Electronic) @ Oct 6 2008, 11:48) *
....добавлю что в книге написано что контроллер сам выходит из спящего режима по любому прерываю что доступно в данном режиме. или может напутали и всё таки нужна какая то команда?


По коду ничего сказать не могу, т. к. не пишу на СИ, но в ДШ написано, что чтобы контроллер вышел из режима слип, нужно, чтобы прерывания инт0/1 были насторены как прерывания по низкому уровню (что в вашем случае по-моему выполнено - MCUCR = 0xa0), во-вторых низкий уровень на соответствующем пине должен держаться на время старта контроллера (задается фьюзами SUT) плюс некоторое время, необходимое на детектирование прерывания. Также неплохо-бы запретить вход в режим слип по пробуждению. Добавлю также, что флаг внешнего прерывания, если оно настроено в режим прерывания по низкому уровню установлен до тех пор, пока условия прерывания не исчезнут, т.е. флаг равен 1 пока на нужной ноге низкий уровень. Поэтому обработчик прерывания будет выполняться пока прерывание разрешено и на нужной ноге присутствует низкий уровень.
SysRq
uart0_rx_isr - это обработчик прерывания (а зачем unsigned char?)? Ежели да, то у вас глобально запрещены прерывания, int1_isr срабатывать не будет.
Electronic)
Цитата(SysRq @ Oct 6 2008, 12:20) *
uart0_rx_isr - это обработчик прерывания (а зачем unsigned char?)? Ежели да, то у вас глобально запрещены прерывания, int1_isr срабатывать не будет.

#pragma interrupt_handler uart0_rx_isr:12
unsigned char uart0_rx_isr(void)
{
//uart has received a character in UDR
ch=UDR; UCSRB=0;C2_OFF;C3_OFF;WDTCR=0x1F;WDTCR=0x00;MCUCR = 0x80;PORTD=0x08;PORTB=0;PORTC=0;asm("sleep");asm("nop");
if(sb==1){TCCR0=0;sb=0;if(ch>=128){CLI();ST=1; UDR=0;UCSRB=0x08;/*only peredacha*/ch-=128;UDR=('#');d();UDR=('1');d();UDR=ch;UCSRB=0;EP_W(0,ch);lcd_t(ch);while(1);}else{ch=0;sl_count=0;TCC
R1B=0x05;}}
if(ch==42){sb=1;UDR=0;UCSRB=0x90;pause_timer1();/*only priyom*/timer=0;TCCR0 = 0x05;}
}
сори! вот так как выше всё. почему unsigned char uart0_rx_isr(void) ну функция так определяется в с++ а вобще фиг его знает... я форму брал из генератора кода. сейчас вынесу вход в спящий режим в main.
Electronic)
SysRq ТЫ СУПЕР!))) огоромное спасибо!
smac спасибо за хорошие советы!!

Есть непонятнка одна. в PowerDown потреблял 100мкА при PORTX=0, я выставил DDRX=0 стало 60мкА, что же ещё надо выключить что бы стало 8 мкА? Вобще есть какие то правила что надо обязательно выключать перед уходом в слип для минимального потребления?
Николай Иванович Приходько
Цитата(Electronic) @ Oct 6 2008, 17:20) *
что же ещё надо выключить что бы стало 8 мкА? Вобще есть какие то правила что надо обязательно выключать перед уходом в слип для минимального потребления?

Вроде бы ватчдог хАвает прилично если его не выключать и схема BOD вроде тоже.
Nanobyte
Ещё отключите аналоговый компаратор, об этом и в DS написано.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.