| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Atmega 8. Выход из режима power-down. https://radiokot.ru/forum/viewtopic.php?f=57&t=102140 |
Страница 1 из 2 |
| Автор: | kushman [ Ср мар 26, 2014 11:34:15 ] |
| Заголовок сообщения: | Atmega 8. Выход из режима power-down. |
Добрый день! Использую в своем девайсе контроллер Atmega8 совместно с часами реального времени DS1339. По задумке, будильник часов должен выводить контроллер из спящего режима, с помощью подтяжки линии прерывания к земле. Линия также подтянута к питанию через резистор. Использую режим power-down, как самый экономичный. Согласно даташиту, из этого режима контроллер выходит с помощью внешнего прерывания или ресета. Прерывание настроено на срабатывание по перепаду из 1 в 0, однако он категорически отказывается из него выходить. Без использования спящего режима все в порядке, прерывание срабатывает. В чем может быть дело? Заранее благодарен. |
|
| Автор: | Gudd-Head [ Ср мар 26, 2014 11:39:46 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
kushman писал(а): Прерывание настроено на срабатывание по перепаду из 1 в 0, однако он категорически отказывается из него выходить. Естессно отказывается. Читайте в ДШ раздел вывода из сна по прерываниям внимательней (сноки и пр.). |
|
| Автор: | ARV [ Ср мар 26, 2014 11:40:12 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
данный МК не пробуждается из Power Down по внешнему прерыванию, настроенному на перепад (фронт) - настройте прерывание на УРОВЕНЬ и будет вам счастье. |
|
| Автор: | kushman [ Ср мар 26, 2014 12:22:38 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Да, извиняюсь за свою невнимательность, пропустил это в даташите. Но возникла другая проблема, МК вообще не хочет генерировать прерывание по уровню. Хотя часы притягивают линию к земле, это точно, тестером проверял. Может маленькая длительность? |
|
| Автор: | Gudd-Head [ Ср мар 26, 2014 12:24:13 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
kushman писал(а): Может маленькая длительность? Может, прерывание не настроено? |
|
| Автор: | akl [ Ср мар 26, 2014 12:32:51 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
kushman писал(а): Хотя часы притягивают линию к земле, это точно, тестером проверял. Может маленькая длительность? Может это поможет.
|
|
| Автор: | kushman [ Ср мар 26, 2014 13:14:49 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Да нет, все вроде настроено, я только поменял пару битов в регистре MCUCR, настроил их на работу по низкому уровню (ISC11=0, ISC10=0). По перепаду без использования спящего режима срабатывает на ура, а по уровню, что со спящим, что без спящего - никакой реакции. |
|
| Автор: | akl [ Ср мар 26, 2014 15:43:00 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
С примером кода было бы проще. |
|
| Автор: | kushman [ Ср мар 26, 2014 17:56:20 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Вот кусок кода (лишнее выкинул). Код: interrupt [EXT_INT1] void INT1_ISR(void)
{ normal_mode(); } void sleep_mode(void) { MCUCR = MCUCR|0xA0; //SE=1, power-down mode #asm sleep #endasm } void normal_mode(void) { #asm nop nop nop nop nop #endasm MCUCR = MCUCR&0x7F; //SE=0; } void INT_Init(void) { GICR=0xC0; MCUCR=0x00; } void main(void) { INT_Init(); SREG.7=1; sleep_mode(); } |
|
| Автор: | akl [ Чт мар 27, 2014 09:03:59 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
В принципе нормально. Если бы ещё сделали так void sleep_mode(void) { MCUCR = MCUCR|0xA0; //SE=1, power-down mode ; #asm ; sleep ; #endasm - при высоком уровне на входах INTx сбросить флаги GIFR=0xC0 - глобально разрешить прерывания SREG.7=1 - и только теперь #asm SLEEP #endasm то камень обязан уйти в POWER DOWN Но, вопрос корректного выхода из POWER DOWN остался. |
|
| Автор: | kushman [ Чт мар 27, 2014 10:11:50 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Пробовал сгенерировать прерывание по уровню без спящего режима - не срабатывает. По перепаду - пожалуйста, по уровню - ни в какую. Вот в чем проблема. С чем это может быть связано? Линия то притягивается к земле, это точно. |
|
| Автор: | Alexeyslav [ Чт мар 27, 2014 15:34:28 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
А ДО этого, она удерживается в плюсе? Может попробовать не прерывание от порта, а специальный вход внешнего прерывания INT0/INT1? |
|
| Автор: | Gudd-Head [ Чт мар 27, 2014 15:41:34 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Alexeyslav писал(а): Может попробовать не прерывание от порта, а специальный вход внешнего прерывания INT0/INT1? В смысле? Из PD только INT0/INT1 и выводят. |
|
| Автор: | kushman [ Чт мар 27, 2014 16:08:16 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Alexeyslav писал(а): А ДО этого, она удерживается в плюсе? Может попробовать не прерывание от порта, а специальный вход внешнего прерывания INT0/INT1? Так и и использую вход INT1. А как от порта можно прерывание получить? Или может я что-то не понял. |
|
| Автор: | Gudd-Head [ Чт мар 27, 2014 16:13:16 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
kushman писал(а): А как от порта можно прерывание получить? В других МК есть прерывания от портов. |
|
| Автор: | codenamehawk [ Чт мар 27, 2014 22:57:08 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
kushman писал(а): Код: GICR=0xC0; 0xC0 == 11000000 , значит разрешены прерывания INT0,INT1 , а обработчик прерывания только для INT1. Если раньше возникнет INT0, то начнется цирк. Цитата: Код: MCUCR = MCUCR&0x7F; Чего этим хотите достичь? Попробуйте оформлять в виде Код: MCUCR &= ~((1<<ISC11) | (1<<ISC10)); //INT1 low level GICR |= (1<<INT1); // разрешить прерывание INT1 Сразу видно что к чему. Я бы советовал изменить логику программы, изменения режимов работы производите в маин, а в прерывании устанавливайте информационный флаг. |
|
| Автор: | codenamehawk [ Чт мар 27, 2014 23:43:39 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Гляньте на пример. Код: /* * main.c * * Created on: 27.03.2014 * Author: Marian */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> volatile uint8_t flag1; uint8_t musor; ISR(INT1_vect ) { // user code here flag1=0; } int main(void) { DDRB = 0xFF;//na vyvod DDRD &=~((1<<PD3)|(1<<PD0)); //na vvod PORTD |= (1<<PD3)|(1<<PD0); //vkl podciazku MCUCR &= ~((1<<ISC11) | (1<<ISC10)); //INT1 low level GICR |= (1<<INT1); // разрешить прерывание INT1 flag1=1;//dla otslezivanija prerywanija musor=0; //dla primera; set_sleep_mode(SLEEP_MODE_PWR_DOWN); while (1) { musor++; PORTB = musor; if((PIND & 0x01)!= 0x01 ) { flag1=1; sei(); sleep_mode(); cli(); } } } // В архиве проект для протеуса Вложение:
|
|
| Автор: | codenamehawk [ Сб мар 29, 2014 21:59:13 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Тут присутствует одна особенность, прерывания (если назначены по низкому уровню) происходят до тех пор, пока на ноге низкий уровень. Значит проц будет постоянно выходить из повер довн. |
|
| Автор: | kushman [ Пн мар 31, 2014 11:32:38 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Попробовал выводить контроллер из спящего режима по любому логическому изменению на INT1 - и все в порядке, выходит и работает. Единственная загвоздка в том, что возникает два прерывания, несмотря на то, что они глобально запрещены на время обработки. Сегодня еще попробую вышеприведенный код, посмотрим что получится. |
|
| Автор: | codenamehawk [ Пн мар 31, 2014 16:16:16 ] |
| Заголовок сообщения: | Re: Atmega 8. Выход из режима power-down. |
Не ясно для чего вы выставляете "по любому логическому изменению на INT1", если есть возможность выставить по фронту или по спаду на INT1. kushman писал(а): Единственная загвоздка в том, что возникает два прерывания, несмотря на то, что они глобально запрещены на время обработки. Флаг прерывания устанавливается, даже если они глобально запрещены, если есть необходимость выполните ручной сброс флага прерывания, перед разрешением прерываний. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


