Например TDA7294

Форум РадиоКот • Просмотр темы - ATTiny13 - помогите разобраться со sleep-mode!
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пт июл 19, 2019 17:51:25

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 08:48:39 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
Доброго времени суток всем!
Нужна Ваша помощь с простой задачкой - МК, на одном пине (PB3) которого - кнопка, на другом (PB4) - светодиод.
Замыкаем кнопку -светодиод загорается на 4 секунды. Потом гаснет, независимо от состояния кнопки. А главное - пока кнопка не нажата - МК должен пребывать в глубоком сне и не жрать почти ни капли тока.


Собственно код:

Код:
#include <avr/io.h>      // инициализация портов ввода-вывода МК
#include <avr/wdt.h>      // здесь организована работа с ватчдогом
#include <avr/sleep.h>      // здесь описаны режимы сна
#include <avr/interrupt.h>                 // работа с прерываниями
#include <avr/delay.h>      // описание программных задержек

// Обработчик прерываний
ISR (WDT_vect)
{
   WDTCR |=_BV(WDE);   // разрешаем прерывания по ватчдогу, иначе будет резет!
}


// Основная программа
int main()
{

   // Инициализация порта кнопки (PB3)
   DDRB &=~_BV(PB3);      // ставит в DDRB в бит PB3 - "0" (инициирует его работу как "вход")
   PORTB |= _BV(PB3);      // ставит в PORTB в бит PB3 - "1" (при замыкании пина на землю она становится нулем, при размыкании - еденицей)
   
   // Условие включения светодиода по нажатию кнопки
   if((PINB & (1 << PB3)) == 0)
      {        
      // Иницализация порта светодиода (PB4)
      DDRB |= _BV(PB4);    // Указатель пина
      PORTB |= _BV(PB4);   // Выставить на PB4 - "1"
      _delay_ms (4000);   // Задержка
      PORTB &= ~_BV(PB4);   // Выставить на PB4 - "0"
               
            // Инициализация цикла контроля ложного включения светодиода
            while ((PINB & (1 << PB3)) == 0)
            {   // пока кнопка нажата (после завершения цикла включения светодиода)...
               PORTB &= ~_BV(PB4);   // ...светодиод не горит (до отключения, и последующего включения кнопки)
            }


};
      
      // Инициализация ватчдога   
      wdt_reset();         // сброс
      wdt_enable(WDTO_120MS);                 // разрешение ватчдога раз в 120мс
      WDTCR |= _BV(WDE);      // разрешение прерываний по ватчдогу (иначе будет резет)!
      sei();            // разрешение прерывания

      // Инициализация режима сна
      set_sleep_mode (SLEEP_MODE_PWR_DOWN);
      while(1)
      {
         sleep_enable();   // разрешение режима сна
         sleep_cpu();   // активация режима сна
      }
}



Я понимаю что код - не ахти (с МК вожусь считанные месяцы, через раз, по выходным), но в протеусе - работает как надо. А вот в реале - светодиод моргает непрерывно, пока нажата кнопка. Помогите пожалуста разобраться - где косяк?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 12:32:49 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 312
Зарегистрирован: Вт ноя 27, 2007 12:32:06
Сообщений: 2176
Откуда: Tashkent
Рейтинг сообщения: 0
1. Кнопка на вход прерывания по низкому уровню. Только прерывание низким уровнем разбудит МК из глубокого сна.
2. В векторе прерывания по низкому уровню отключаем IRQ по уровню чтоб постоянно не молотил, переключим на "по фронту" или вообще отключим если будем потом мониторить статус кнопок софтварно. Запускаем антидребезг кнопки(например таймер).
3. Когда отработал антидребезг реагируем на события(включаем светомузыку, лампочки, биперы и делаем что надо).
4. Ждем/ничего не делаем пока нажата кнопка.
5. Когда отпустили кнопку ждем антидребезг и снова разрешаем прерывание по низкому уровню, усыпляем проц.

Для прерывания по низкому уровню вход дожен быть подтянут резистором ввех, кнопка замыкает на землю. Можно параллельно кнопке малый кондер добавить чтоб от наводок всяких избавиться.


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 12:44:23 
Мудрый кот
Аватар пользователя

Карма: 21
Рейтинг сообщений: 138
Зарегистрирован: Сб фев 21, 2009 14:11:40
Сообщений: 1899
Откуда: Москва
Рейтинг сообщения: 0
а кнопку будут держать дольше 4 секунд или не обязательно?

_________________
Ставим плюсы: )


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 13:05:44 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
ibiza11 писал(а):
а кнопку будут держать дольше 4 секунд или не обязательно?

В том то и дело что дольше. Поэтому у меня такой кривоватый код в итоге получился.

Дребезг мне кажется тут маловероятен - подтягивающий резистор имеется, а кнопка - на самом устройстве там оптопара, и проверял я его зажигая светодиод оптопары от батарейки, то есть как мне представляется - там все достаточно стабильно.

А насчет IRQ - честно сказать не просвещен пока. В свое время удачно получилось режим глубокого сна организовать именно на Тини13 - power down. В этом режиме там почти все обесточено в МК, только независимо тактируемы вочдог фурычит. Вот от него то я и плясал. Поэтому и прерывания все - по вачдогу. Благо в Тини он несколько более широкими возможностями наделен, нежели в Мегах.


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 13:12:30 
Мудрый кот
Аватар пользователя

Карма: 21
Рейтинг сообщений: 138
Зарегистрирован: Сб фев 21, 2009 14:11:40
Сообщений: 1899
Откуда: Москва
Рейтинг сообщения: 0
тогда вообще зачем здесь микроконтроллер?)))
одновибратор на 4 секунды, а кнопка включает питание одновибратора)))
если обязательно с микроконтроллером, то можно аналогично кнопкой рулить питанием тиньки13, а в программе написать тупо:
Код:
LedOn();
delay_ms(4000);
LedOff();
while(1);
:write:

_________________
Ставим плюсы: )


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 13:57:35 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
ibiza11 писал(а):
тогда вообще зачем здесь микроконтроллер?)))


Товарищь, который меня попросил это сделать как раз с одновибратора и начинал, но у него что-то там не срослось. Вот он слезно попросил меня попробовать на МК. Плюс - тот самый режим энергосбережения. Схема по его задумке должна вечность пахать от батарейки.

Код:
LedOn();
delay_ms(4000);
LedOff();
while(1);


вообще у меня практически это и сделано. Но что-то не работает оно как надо.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 14:06:00 
Мудрый кот
Аватар пользователя

Карма: 21
Рейтинг сообщений: 138
Зарегистрирован: Сб фев 21, 2009 14:11:40
Сообщений: 1899
Откуда: Москва
Рейтинг сообщения: 0
Цитата:
то можно аналогично кнопкой рулить питанием тиньки13

_________________
Ставим плюсы: )


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 14:46:36 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
Будить МК по внешнему прерыванию у меня пока получается только из режима Idle. И этот вариант я оставил на крайний случай, если так не выйдет ничего.
Из Power-Down так будить вообще не получится (если я правильно все понял), так как все лишнее обесточено. Остается только ватчдог.
Да уже и бог бы с ним - просто интересно, в чем у меня-то проблема? В целях повышения образованности, так сказать, хотелось бы разобраться. Тем более что в симуляции все как надо работает...


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб дек 01, 2012 18:52:36 
Друг Кота
Аватар пользователя

Карма: 65
Рейтинг сообщений: 494
Зарегистрирован: Ср дек 24, 2008 10:58:58
Сообщений: 3121
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
ATTINY13 можно будить из powerdown либо watchdog-ом как Вы делаете, либо низким уровнем, но только на входе INT0, т.к. только при этом низкий уровень отслеживается асинхронно. Первый подход приводит к гораздо большему токопотреблению, по ДШ около 6 мкА при питании от 5в.


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Вс дек 02, 2012 10:11:10 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
Попробовал переделать на прерывание по INT0.
Вот что получилось:
Код:
#include <avr/io.h>         // инициализация портов ввода-вывода МК
#include <avr/sleep.h>      // здесь описаны режимы сна
#include <avr/interrupt.h>   // работа с прерываниями
#include <avr/delay.h>      // описание программных задержек

// Обработчик прерываний
SIGNAL(SIG_INTERRUPT0)  // Прерывание по низкому уровню на PB1
{           

   PORTB |= _BV(PB4);   // Выставить на PB4 - "1"
   _delay_ms (4000);   // Задержка
   PORTB &= ~_BV(PB4); // Выставить на PB4 - "0"
   while ((PINB & (1 << PB1)) == 0)
   {   
   }
}       


// Основная программа
int main()
{

//   PORTB &= ~_BV(PB4);   // Выставить на PB4 - "0"
//   DDRB |= _BV(PB4);    // Указатель пина

   PORTB = 0b11101111;  // Выставить на PB4 - "0"
   DDRB  = 0b00010000;  // Указатель пина
      
   // Инициализация прерываний по INT0   
   GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
   MCUCR = 0b00000000; // при перепаде низком уровне на PB1
   sei(); // Общее разрешение прерываний
      
   // Инициализация режима сна
   set_sleep_mode (SLEEP_MODE_PWR_DOWN);
   while(1)
   {
      sleep_enable();   // разрешение режима сна
      sleep_cpu();   // активация режима сна
   }
}

В симуляции работает (хотя это видимо не многого стоит) - подскажите, нет ли опять каких явных ошибок?

Также возник вопрос - почему перестала работать конструкция:
Код:
//   PORTB &= ~_BV(PB4);   // Выставить на PB4 - "0"
//   DDRB |= _BV(PB4);    // Указатель пина

в теле основной программы?

И еще - в обработчике прерывания пришлось опять вставить цикл, ждущий когда будет отпущена кнопка на PB1 (то же самое что мне не нравилось в предидущей версии программы). И все это время МК будет в нормальном режиме работать, а не энергосберегающем, можно ли как-то избавиться от этого? Все мои попытки привели пока только к тому что светодиод не гаснет, пока нажата кнопка...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Вс дек 02, 2012 11:01:37 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 312
Зарегистрирован: Вт ноя 27, 2007 12:32:06
Сообщений: 2176
Откуда: Tashkent
Рейтинг сообщения: 0
Если в программном коде более понятно, то примерно такая структура выходит:
Код:
volatile uint8_t have_int0 = FALSE;
volatile uint8_t goto_sleep = FALSE;

// Обработчик прерываний INT0
SIGNAL(SIG_INTERRUPT0)  // Прерывание по низкому уровню на PB1
{           

   PORTB |= _BV(PB4);   // Выставить на PB4 - "1"
   
   disable_int0(); //отключить INT0 IRQ, обязательно иначе тутже сюда залетим снова
   enable_timer1(); //включить таймер на 4 сек
   have_int0 = TRUE;//флаг было прерывание, можно пойти в IDLE
}

// Обработчик прерываний TIM1
interrupt TIMER1_OVF_IRQ  // 4 сек прошло - залетели сюда
{
   PORTB &= ~_BV(PB4); // Выставить на PB4 - "0"

   disable_timer1();// отключить TIM1
   enable_int0(); // включить прерывание по низкому уровню
   goto_sleep = TRUE; //теперь можно полностью отключиться
}

// Основная программа
int main()
{
   device_init();//настройка портов и периферии
   while(1)
   {
   if( have_int0 == TRUE )
      {
      have_int0 = FALSE;
      sleep_idle();//усыпить в IDLE чтоб меньше жрало, но периферия работает
      };
   if( goto_sleep == TRUE )
      {
      goto_sleep = FALSE;
      sleep_power_down();//теперь все совсем отключено
      };
   }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Вс дек 02, 2012 14:21:29 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
uk8amk, спасибо!
А насчет PORTB &= ~_BV(PB4); не подскажете? Почему оно вдруг перестало нормально работать? Разве это не то же самое что и PORTB = 0b11101111;??? Я проверил - дело именно в PORTB, а не DDRB.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Вс дек 02, 2012 19:46:21 
Друг Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 389
Зарегистрирован: Сб сен 10, 2011 18:46:25
Сообщений: 3241
Рейтинг сообщения: 0
не одно и тоже первое - установить в "0" один пин порта, второе установить весь порт
тут почитайте: http://we.easyelectronics.ru/AVR/avr-po ... -spat.html


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Пн дек 03, 2012 17:19:10 
Родился

Зарегистрирован: Вс авг 26, 2012 18:46:05
Сообщений: 17
Рейтинг сообщения: 0
Спасибо! Вроде разобрался. Вот еще задумался - я в самом начале фьюзы оставил все по дефолту. Только вотчдог разрешил.
Старший байт - все 1. (Внутренний RC-генератор 9.6МГц; Задержка запуска: 14 тактов + 64мс)
Младший байт:
SPIOEN - 0;
EESAVE -1;
WDTON - 0;
CKDIV8 - 0;
SUT1 - 1;
SUT0 - 0;
CKSEL1 - 1;
CKSEL0 - 0;

Может я чего-то не учел?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: ATTiny13 - помогите разобраться со sleep-mode!
СообщениеДобавлено: Сб янв 06, 2018 21:45:27 
Сверлит текстолит когтями
Аватар пользователя

Карма: 9
Рейтинг сообщений: 19
Зарегистрирован: Ср мар 10, 2010 23:28:34
Сообщений: 1142
Откуда: Запад Беларуси
Рейтинг сообщения: 0
Написал прошивку под этот контроллер, чтобы отправлял частоту в радиомодуль по I2C. Большую часть времени он будет ждать, когда нажмут на кнопку. Хочу загнать его в sleep mode, чтобы не молотил впустую. Никак не могу с ним разобраться. Контроллер не отправляет данные в TEA5767.

Схема во вложении. Хочу сделать всё сразу, т.к. выпаивать микру очень неудобно, а надо прошивать "Тритоном", т.к. Reset используется как порт.
Всё работает только когда отправляю в Idle режим.
Как правильно настроить PCINT, чтобы правильно срабатывали кнопки? Чтобы можно было отправлять в PWR_DOWN.


Вложения:
1.PNG [2.89 KiB]
Скачиваний: 278

_________________
Изображение
Изображение
Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y