Прошу помощи, так как лазанье по просторам инета не помогло, уже голова дымится, а толку нет, написал программу для снятия 2х датчиков температуры, и сохранением их в внешний eeprom с текущим реальным временем. В общем нужен простой логгер. Но застрял на пробуждении. Ситуация такова что по переполнению счетчика TCNT0, который по идее тактируется через ногу T0 и частотой 1ГЦ, микропроцессор должен выходить из сна каждые 10 (или около того)минут и считывать данные с последующим их сохранением и обратно уходить в сон, так как питание задумано от батареек. Задача вроде не сложная но не могу нигде найти рабочего примера как это сделать, создать с нуля не хватает ума, так как начинающий. Если вдруг кто то может подсказать буду очень благодарен.
Вложения:
Комментарий к файлу: схема shema.jpg [59.25 KiB]
Скачиваний: 1304
Сможем подсказать только после просмотра кода программы. Ну и как предположение - вы используете слишком глубокий сон, в котором отключена синхронизация TIM0.
Если все что в основном коде я брал из рабочих проектов ( как положено начинающему) и переделывал под себя, то в плане регистров все уже по статьям, так как примеров не нашел, в общем как и ожидалось микроконтроллер по истичению 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 раз.
И еще если я не ошибаюсь, то выхот SOUT у DS1307 типа Открытый коллектор, подтяжки не хватает.
Спасибо - исправил! Может подскажите как правильно уложить спасть в режиме MCUCR=0xA0; //power down mode, я имею ввиду перевести порты чтобы утечек не было и отключить АЦП, может еще какие нюансы есть при питании от батареек.
точно блин - косяк. Получается что максимальный интервал это 256 секунд?
Это зависит от компилятора, скорее всего он просто "отбросит" старшие байты. Что касается спящего режима, то почитайте здесь. Если Вы хотите (если еще хотите), чтобы МК просыпался по переполнению TCNT0, то спящий режим должен быть Idle и не надо запрещать прерывания.
Что касается спящего режима, то почитайте здесь. Если Вы хотите (если еще хотите), чтобы МК просыпался по переполнению TCNT0, то спящий режим должен быть Idle и не надо запрещать прерывания.
Спасибо за ссылку на статью и внимание которое вы уделяете, возникает вопрос, почему при засыпании в MCUCR=0xA0; //power down mode, у меня он из этого режима выходит при переполнении TCNT0, но выходит как из сброса , код исполняется с начала а не с места остановки. По идее его из этого режима может тока ватч дог вывести или внешнее прерывание. Кстати интересно перевести мою задачу на TCNT1 он 16 битный, хотя он не подходит из за отсутствия возможности тактировать из вне.
возникает вопрос, почему при засыпании в 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.
Еще один человек желает набить шишек на протеусе...
Возьмите Мегу16(у ней есть JTAG), соберите за вечер miniICE и отлаживайтесь через AVRStudio в реальном железе! Когда все будет пучком, перенесете код под М8, благо разница минимальна.
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") //Глобальное запрещение прерываний.
Но все таки вопрос остается, почему переполнение работает в режиме power down mode
Не знаю, давайте полностью исходник. Если проверяете уже в железе - ищите ошибки, проверьте конфигурацию портов. У меня все работает штатно. MCUCR=0xA0; //вот так из сна по переполнению счетчика не выходит. MCUCR=0x80; //а вот так выходит, ничего не сбрасывается. #asm("cli") //а так прерывания вообще никогда не наступают, вечный сон
подозрение что действительно глюк протеуса - буду на реальном железе пробовать. Подскажите на счет отключения утечек при MCUCR=0x80; так подозреваю придется с ними повозится.
Но нужно ли регистры переключать перед сном на вход что бы утечки не было? ... Подскажите на счет отключения утечек при MCUCR=0x80;
Я уже пару раз предлагал Вам почитать даташит... Не судьба? Там есть раздел: Power Management and Sleep Modes, а в нем подраздел: Minimizing Power Consumption, где все подробно расписано. Поищите в сети русский вариант описания...
mvn77 писал(а):
...подозрение что действительно глюк протеуса - буду на реальном железе пробовать...
Так проще всего списать свои ошибки. А в железе на что будете списывать? на МК? Я то как раз проверял в Proteus и все работает...
В общем по снижению энергопотребления дела плохи, нашел только SFIOR = (1<<PUD); //включаем на всех шинах Z ACSR |= (1<<ACD); //выключем компаратор ADCSRA = (0<<ADEN);// выключаем АЦП WDTCR = 0x00; //Выключить WDT так и не смог разобраться с выключением Супервизор питания Встроенный источник опорного напряжения Линии портов ввода-вывода - которые я в принципе отцепил от подтягивающих резисторов но не смог пока найти как правильно все перевести на вход.
По поводу даташита, я понимаю вещь хорошая, но не всегда он адекватно может помочь, все таки он рассчитан на инженеров. Часто приходится видеть как человека с той или иной проблемой отправляют к первоисточникам, что ни дает ему никаких шансов на решение той или иной проблемы. Было бы интересно если бы в школах давали детям учебники и говорили - там все есть. Русского варианта даташита на атмегу8 нет, а в английской версии не расписано как выключать, есть просто ссылки на странице где рассматривается то или иное устройство. Вообще переход в спящий режим окутан тайной, есть много вопросов но нигде нет ответов, видно просто мало кто эти микросхемы питает от батарей. Так что постараюсь во всем разобраться, что бы другие уже так не мучились как я.
Было бы интересно если бы в школах давали детям учебники и говорили - там все есть.
Во-первых, мы не в школе, может Вы себя и считаете учеником, но я себя преподавателем не считаю. Даже просто потому, что лучше чем в даташит объяснить не смогу. Во-вторых, следуя этой логике, учебники вообще надо отменить, а домашние задания должны делать сами учителя. В-третьих, если Вы решили изучить предмет, все равно придется читать учебник. Если Вы хотите, чтобы за Вас решили задачу, или списать готовое решение - так сразу и скажите. Вы же даже тетрадку с Вашим решением не показываете...
mvn77 писал(а):
Русского варианта даташита на атмегу8 нет, а в английской версии не расписано как выключать, есть просто ссылки на странице где рассматривается то или иное устройство.
Русского нету, по крайней мере, я не встречал. А в даташит расписано все. Но я же предлагал "Поищите в сети русский вариант описания..." Или тоже все надо на блюдечке... Пример:
mvn77 писал(а):
Линии портов ввода-вывода - которые я в принципе отцепил от подтягивающих резисторов но не смог пока найти как правильно все перевести на вход.
На раздел даташит давать ссылку, я так понимаю бессмысленно, но вот перваяссылка, найденная google по запросу "конфигурация портов ATMEGA8". Если есть конкретные вопросы - задавайте, но прежде даташит читать обязательно! если хотите во всем разобраться. Да и не грех в поисковик задать вопрос, на все вопросы уже есть ответы...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения