Например TDA7294

Форум РадиоКот • Просмотр темы - Atmega88 асинхронный таймер и спящий режим.
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 25, 2024 20:25:33

Часовой пояс: UTC + 3 часа


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



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Atmega88 асинхронный таймер и спящий режим.
СообщениеДобавлено: Пн ноя 25, 2019 22:35:11 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 24
Рейтинг сообщения: 0
Приветствую. Решил вместо atmega8 использовать atmega88. Возникла проблема со спящим режимом.
Почему-то при включении спящего режима асинхронный счетчик начинает работать в два раза быстрее, в итоге минута происходит за 30 сек. Если спящий режим не использовать, то все в норме.


Код:

static volatile int16_t rtc_total_compensation = 1000; // Итоговое значение компенсации хода, прибавляется к компенсационному счётчику.
static volatile int16_t rtc_calib_counter = 0; // Компенсационный счётчик: при его переполнении происходит прибавление или убавление 1/256 секунды.




ISR(TIMER2_COMPA_vect)
 {
  TIFR2 |= (1 << OCF2B);

 
 int16_t rcc = rtc_calib_counter;
 uint8_t prevcb = (rcc >> 8);
 int16_t cal = rtc_total_compensation;
 rcc += cal;
 rtc_calib_counter = rcc;
 uint8_t newcb = (rcc >> 8);
 if ((((prevcb ^ newcb) & 0x80) != 0) && ((((uint8_t)(cal >> 8) ^ newcb) & 0x80) != 0))
  { // Счётчик перекинулся.
  int8_t add = (cal >= 0) ? 1 : -1;
  TCNT2 += add;
  }
 
.............

 }


void rtc_wait() {
  while (ASSR & ((1 << TCR2AUB) | (1 << TCR2BUB) | (1 << OCR2AUB) | (1 << OCR2BUB) | (1 << TCN2UB))) {};
}


int main(void)
 {

  TIMSK2 = 0;
  ASSR = (1 << AS2);
 
  TCNT2 = 0;
  OCR2A = 255;
  OCR2B = 254;
  TCCR2A = 0;
  TCCR2B = (1 << CS22) | (1 << CS20);
 
  rtc_wait(); 
  TIFR2 = (1 << TOV2) | (1 << OCR2A) | (1 << OCR2B); 
  TIMSK2 = (1 << OCIE2A);

.......................

 while(1)
  {

  .......................

 rtc_wait()
   
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);     
  sleep_enable();     
  sleep_mode();                        // System sleeps here   
  sleep_disable(); 
 


  }

 }



Если сделать так

Код:
  rtc_wait();   
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  rtc_wait();   
  sleep_enable();   
  rtc_wait();   
  sleep_mode();                        // System sleeps here 
  rtc_wait();   
  sleep_disable(); 
  rtc_wait();   


Все работает, как нужно. Получается что счетчик не успевает отработать. Х.з. куда копать…
Пока так оставил.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Atmega88 асинхронный таймер и спящий режим.
СообщениеДобавлено: Вт ноя 26, 2019 00:27:26 
Вымогатель припоя

Карма: 9
Рейтинг сообщений: 155
Зарегистрирован: Сб ноя 16, 2013 23:34:34
Сообщений: 671
Рейтинг сообщения: 0
я так понимаю, что речь про avr_gcc? там либо
Код:
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_mode();
либо
Код:
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_enable();
  sleep_cpu();
  sleep_disable();
что будет, если использовать так, как Вы использовали эти макросы, и почему в атмеге8 это проканало, мне лень разбираться. Попробуйте привести код к одному из вариантов, может, и заработает, как надо :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Atmega88 асинхронный таймер и спящий режим.
СообщениеДобавлено: Вт ноя 26, 2019 09:02:21 
Держит паяльник хвостом

Карма: 10
Рейтинг сообщений: 99
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 968
Рейтинг сообщения: 0
Потому что таймер2 тормоз.) И после каждой с ним операции необходимо ждать её завершения. Типа:
Код:
void rtcInit()
{
  set_rtc_mode();
  wait_rtc_update();
  set_rtc_divider();
  wait_rtc_update();
  set_rtc_counter();
  wait_rtc_update();
  set_rtc_interrupt();
}


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Atmega88 асинхронный таймер и спящий режим.
СообщениеДобавлено: Вт ноя 26, 2019 18:02:17 
Первый раз сказал Мяу!

Зарегистрирован: Ср янв 23, 2019 20:18:44
Сообщений: 24
Рейтинг сообщения: 0
Нашел такой вариант

Цитата:
… Для того, чтобы убедится в том что генератор работает нормально нужно сделать запись в любой регистр таймера, из тех, которые не нарушат работу. После того как флаг сбросился можно переводить микроконтроллер в режим сна…


Х.з. какой регистр не нарушит, у меня все используются и что-то в них писать не вариант.
Сделал так:
Код:
  TCCR2B = (1 << CS22) | (1 << CS20);

  rtc_wait();   

 
  set_sleep_mode(SLEEP_MODE_PWR_SAVE); 
  sleep_enable();     
  sleep_mode();                        // System sleeps here   
  sleep_disable();


посмотрим что получится.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: maxlab и гости: 23


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

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


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