пробуждение atmega8 при переполнении TCNT0

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

Прошу помощи, так как лазанье по просторам инета не помогло, уже голова дымится, а толку нет, написал программу для снятия 2х датчиков температуры, и сохранением их в внешний eeprom с текущим реальным временем. В общем нужен простой логгер. Но застрял на пробуждении.
Ситуация такова что по переполнению счетчика TCNT0, который по идее тактируется через ногу T0 и частотой 1ГЦ, микропроцессор должен выходить из сна каждые 10 (или около того)минут и считывать данные с последующим их сохранением и обратно уходить в сон, так как питание задумано от батареек.
Задача вроде не сложная но не могу нигде найти рабочего примера как это сделать, создать с нуля не хватает ума, так как начинающий.
Если вдруг кто то может подсказать буду очень благодарен.
Вложения
shema.jpg
схема
(59.25 КБ) 1312 скачиваний
shema.jpg
(59.25 КБ) 611 скачиваний
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Сможем подсказать только после просмотра кода программы. Ну и как предположение - вы используете слишком глубокий сон, в котором отключена синхронизация TIM0.
Вложения
sleep.JPG
(43.96 КБ) 386 скачиваний
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

И еще если я не ошибаюсь, то выхот SOUT у DS1307 типа Открытый коллектор, подтяжки не хватает.
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

Если все что в основном коде я брал из рабочих проектов ( как положено начинающему) и переделывал под себя, то в плане регистров все уже по статьям, так как примеров не нашел, в общем как и ожидалось микроконтроллер по истичению 10 секунд не просыпается.
вот блок засыпания:

// ----сон---------

TIMSK |= (1<<TOIE0); // разрешить прерывание по переполнению таймера счетчика TCCR0
TCCR0 = (1<<CS02)|(1<<CS01)|(1<<CS00); // устанавливаем отсчет по синхроимпульсу на T0
// TCNT0 = 64936; // до переполнения 600 тактов в нашем случае 600 секунд или 10 минут
TCNT0 = 65526; // до переполнения 10 тактов в нашем случае 10 секунд
GICR|=0x40; //включить INT0
//MCUCR=0x80; // idle mode
//MCUCR=0xA0; //power down mode
MCUCR=0xB0; // power save mode только в этом режиме можно проснутся по переполнению
//MCUCR=0xE0;; // standby mode
GIFR=0x40;

#asm("sei") //Глобальное разрешение прерываний.
#asm("sleep") //Отправляем контроллер в спящий режим
#asm("cli")
delay_ms(100); //просыпаемся
//-----------------


Что не верно?

Странно в MCUCR=0xA0; //power down mode работает как задумано.
Последний раз редактировалось mvn77 Вс янв 20, 2013 11:28:52, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а): TCNT0 = 65526; // до переполнения 10 тактов в нашем случае 10 секунд
-----------------
Что не верно?
The Timer/Counter (TCNT0) is an 8-bit register
Реклама
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

точно блин - косяк. Получается что максимальный интервал это 256 секунд?
Реклама
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

uk8amk писал(а):И еще если я не ошибаюсь, то выхот SOUT у DS1307 типа Открытый коллектор, подтяжки не хватает.
Спасибо - исправил!
Может подскажите как правильно уложить спасть в режиме MCUCR=0xA0; //power down mode, я имею ввиду перевести порты чтобы утечек не было и отключить АЦП, может еще какие нюансы есть при питании от батареек.
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а):точно блин - косяк. Получается что максимальный интервал это 256 секунд?
Это зависит от компилятора, скорее всего он просто "отбросит" старшие байты.
Что касается спящего режима, то почитайте здесь.
Если Вы хотите (если еще хотите), чтобы МК просыпался по переполнению TCNT0, то спящий режим должен быть Idle и не надо запрещать прерывания.
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

Что касается спящего режима, то почитайте здесь.
Если Вы хотите (если еще хотите), чтобы МК просыпался по переполнению TCNT0, то спящий режим должен быть Idle и не надо запрещать прерывания.
Спасибо за ссылку на статью и внимание которое вы уделяете, возникает вопрос, почему при засыпании в MCUCR=0xA0; //power down mode, у меня он из этого режима выходит при переполнении TCNT0, но выходит как из сброса , код исполняется с начала а не с места остановки. По идее его из этого режима может тока ватч дог вывести или внешнее прерывание.
Кстати интересно перевести мою задачу на TCNT1 он 16 битный, хотя он не подходит из за отсутствия возможности тактировать из вне.
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а): возникает вопрос, почему при засыпании в MCUCR=0xA0; //power down mode, у меня он из этого режима выходит при переполнении TCNT0
Не знаю, что у Вас там в программе. У меня такого не происходит. Запустите отладку, пройдите в пошаговом режиме...
mvn77 писал(а):Кстати интересно перевести мою задачу на TCNT1 он 16 битный, хотя он не подходит из за отсутствия возможности тактировать из вне.
Если это для решения первоначальной задачи, то смысла нет, до 10 (TCNT0 = 249) может досчитать и 8 битный счетчик.
А если в принципе, то читайте даташит:
Datasheet писал(а): The Timer/Counter can be clocked by an internal or an external clock source. The clock
source is selected by the clock select logic which is controlled by the clock select
(CS12:10) bits located in the Timer/Counter Control Register B(TCCR1B).
.................
1 1 0 External clock source on T1 pin. Clock on falling edge.
1 1 1 External clock source on T1 pin. Clock on rising edge.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Еще один человек желает набить шишек на протеусе...

Возьмите Мегу16(у ней есть JTAG), соберите за вечер miniICE и отлаживайтесь через AVRStudio в реальном железе!
Когда все будет пучком, перенесете код под М8, благо разница минимальна.
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

1 1 0 External clock source on T1 pin. Clock on falling edge.
1 1 1 External clock source on T1 pin. Clock on rising edge.
Блин что то правда проглядел, все перенастроил - работает. Но все таки вопрос остается, почему переполнение работает в режиме power down mode, и почему код начинается исполнятся не с момента окончания а с нуля, получается не просыпание а запуск. В принципе и такой вариант меня очень даже устраивает. Но нужно ли регистры переключать перед сном на вход что бы утечки не было?
2 uk8amk - спасибо за подсказку, учту но 16той под руками нет, а брать тока за 160 км.
код щас выглядит так:
// ----сон---------

TIMSK |= (1<<TOIE1); // разрешить прерывание по переполнению таймера счетчика
TCCR1B = (1<<CS12)|(1<<CS11)|(1<<CS10); // устанавливаем отсчет по синхроимпульсу на T1
TCNT1 = 65525; // до переполнения 10 тактов в нашем случае 10 секунд
GICR|=0x40; //включить INT0
//MCUCR=0x80; // idle mode
MCUCR=0xA0; //power down mode только в этом режиме можно проснутся по переполнению
//MCUCR=0xB0; // power save mode
//MCUCR=0xE0;; // standby mode
GIFR=0x40;

#asm("sei") //Глобальное разрешение прерываний.
#asm("sleep") //Отправляем контроллер в спящий режим
#asm("cli") //Глобальное запрещение прерываний.
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а):Но все таки вопрос остается, почему переполнение работает в режиме power down mode
Не знаю, давайте полностью исходник. Если проверяете уже в железе - ищите ошибки, проверьте конфигурацию портов. У меня все работает штатно.
MCUCR=0xA0; //вот так из сна по переполнению счетчика не выходит.
MCUCR=0x80; //а вот так выходит, ничего не сбрасывается.
#asm("cli") //а так прерывания вообще никогда не наступают, вечный сон
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

подозрение что действительно глюк протеуса - буду на реальном железе пробовать. Подскажите на счет отключения утечек при MCUCR=0x80; так подозреваю придется с ними повозится.
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а):Но нужно ли регистры переключать перед сном на вход что бы утечки не было?
...
Подскажите на счет отключения утечек при MCUCR=0x80;
Я уже пару раз предлагал Вам почитать даташит... Не судьба? Там есть раздел:
Power Management and Sleep Modes, а в нем подраздел: Minimizing Power Consumption, где все подробно расписано. Поищите в сети русский вариант описания...
mvn77 писал(а):...подозрение что действительно глюк протеуса - буду на реальном железе пробовать...
Так проще всего списать свои ошибки. А в железе на что будете списывать? на МК?
Я то как раз проверял в Proteus и все работает...
Родился
Сообщения: 14
Зарегистрирован: Пн янв 07, 2013 16:56:30

Сообщение mvn77 »

В общем по снижению энергопотребления дела плохи, нашел только
SFIOR = (1<<PUD); //включаем на всех шинах Z
ACSR |= (1<<ACD); //выключем компаратор
ADCSRA = (0<<ADEN);// выключаем АЦП
WDTCR = 0x00; //Выключить WDT
так и не смог разобраться с выключением
Супервизор питания
Встроенный источник опорного напряжения
Линии портов ввода-вывода - которые я в принципе отцепил от подтягивающих резисторов но не смог пока найти как правильно все перевести на вход.

По поводу даташита, я понимаю вещь хорошая, но не всегда он адекватно может помочь, все таки он рассчитан на инженеров.
Часто приходится видеть как человека с той или иной проблемой отправляют к первоисточникам, что ни дает ему никаких шансов на решение той или иной проблемы. Было бы интересно если бы в школах давали детям учебники и говорили - там все есть.
Русского варианта даташита на атмегу8 нет, а в английской версии не расписано как выключать, есть просто ссылки на странице где рассматривается то или иное устройство. Вообще переход в спящий режим окутан тайной, есть много вопросов но нигде нет ответов, видно просто мало кто эти микросхемы питает от батарей. Так что постараюсь во всем разобраться, что бы другие уже так не мучились как я.
Друг Кота
Сообщения: 3956
Зарегистрирован: Ср окт 14, 2009 10:37:49
Откуда: Украина

Сообщение Soir »

mvn77 писал(а):Было бы интересно если бы в школах давали детям учебники и говорили - там все есть.
Во-первых, мы не в школе, может Вы себя и считаете учеником, но я себя преподавателем не считаю. Даже просто потому, что лучше чем в даташит объяснить не смогу.
Во-вторых, следуя этой логике, учебники вообще надо отменить, а домашние задания должны делать сами учителя.
В-третьих, если Вы решили изучить предмет, все равно придется читать учебник. Если Вы хотите, чтобы за Вас решили задачу, или списать готовое решение - так сразу и скажите. Вы же даже тетрадку с Вашим решением не показываете...
mvn77 писал(а):Русского варианта даташита на атмегу8 нет, а в английской версии не расписано как выключать, есть просто ссылки на странице где рассматривается то или иное устройство.
Русского нету, по крайней мере, я не встречал. А в даташит расписано все. Но я же предлагал "Поищите в сети русский вариант описания..." Или тоже все надо на блюдечке... Пример:
mvn77 писал(а):Линии портов ввода-вывода - которые я в принципе отцепил от подтягивающих резисторов но не смог пока найти как правильно все перевести на вход.
На раздел даташит давать ссылку, я так понимаю бессмысленно, но вот первая ссылка, найденная google по запросу "конфигурация портов ATMEGA8".
Если есть конкретные вопросы - задавайте, но прежде даташит читать обязательно! если хотите во всем разобраться. Да и не грех в поисковик задать вопрос, на все вопросы уже есть ответы...
Ответить

Вернуться в «AVR»