Например TDA7294

Форум РадиоКот • Просмотр темы - Таймер с энкодером на ATmega8
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пн май 17, 2021 13:22:47

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


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



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Таймер с энкодером на ATmega8
СообщениеДобавлено: Вс май 24, 2020 13:44:41 
Родился

Зарегистрирован: Вс май 24, 2020 13:27:28
Сообщений: 5
Рейтинг сообщения: 0
Доброго времени суток, уважаемые КОТовчане !!! Такой вопрос. Собрал таймер на ATmega8 на кнопках все норм. все работает.




Тут на видео кнопочный вариант, для наглядности.

Теперь пытаюсь Подружить его с энкодером. Т.е. вместо кнопок поставить энкодер. И недопонимаю что делаю не так. Таймер включается, отображает все нули, и вообще никак не реагирует на повороты энкодера. Может кто подскажет в чем я опять "протупил" ?

ИСХОДНИК (Atmel studio)
Код:
/*Используется семисегментный индикатор с общим АНОДОМ. т.е. на смену разрядов подается "+", а на сементы индикатора "-"
Эмиттеры транзисторов прицепить к "+" кллекторы к семисегментнику (к разрядам), базу через резистор к МК*/

#define F_CPU 1000000UL //Задаем частоту работы МК
#include<util/delay.h> //Библиотека задержек
#include <avr/interrupt.h> //Библиотека прерываний
#include <avr/io.h>

int NewState, OldState, upState, downState;

int start_sec = 0;

unsigned int R1=0, R2=0, R3=0, R4=0; //Переменные для разрядов семисегментника

unsigned int R_count =1; //Для постоянного переключения разрядов на семисегментнике

unsigned int cifri[10]={0b11000000, 0b11111001, 0b10100100, 0b10110000,
    0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000}; //Цыфры 0-9
   
void start_otscheta (void) //Тут будут размещены все настроки 1-го таймер/счетчика
{
   TCCR1B &= ~(1<<CS12); //Устанавливаем бит в 0 (для настройки делителя частоты на 64)
   TCCR1B |= (1<<CS11)|(1<<CS10); //Устанавливаем биты в 1 (для настройки делителя частоты на 64)
   
   /*1000000/64 = 15625 т.е. на этой частоте будет работать МК. Далее для того чтобы получить ровно 12 сек. необходимо
   "убить" эти 15625 тактов. Это можно сделать настроив данный таймер/счетчик на прерывание при совпадении данного числа*/
   
   TIMSK |= (1<<OCIE1A); //Настраивает прерывания при совпадении.
   
   /*Далее в регистре сравнения необходимо записать в двоичной форме число 15625. Данный регист 16-ти битный,
    поэтому он сдвоенный*/
   
   OCR1AH = 0b00111101; //старший разряд
   OCR1AL = 0b00001001; //Младший разряд
   
   /*Когда произойдет совпадение, должно вызваться не только прерывание, но и сброс счетного регистра*/
   
   TCNT1 = 0; //Обнуление счетного регистра
   
   TCCR1B |= (1<<WGM12); //Активация сброса при совпадении.
   
   
}
   
void Chislo_celikom(unsigned int vsego_sekund) //Создаем функцию, будет разделять общее кол-во секунд на мин. и сек.
{
   R1 = vsego_sekund/60/10; //Десятки минут
   R2 = vsego_sekund/60%10; //Минуты (единицы)
   R3 = vsego_sekund%60/10; //десятки секунд
   R4 = vsego_sekund%60%10; //секунды (единицы)
}

ISR (TIMER0_OVF_vect)
{
   if (R_count == 1){PORTB = ~0b00000001;PORTD = cifri[R1];}
   
   if (R_count == 2){PORTB = ~0b00000010;PORTD = cifri[R2];}
   
   if (R_count == 3){PORTB = ~0b0000100; PORTD = cifri[R3];}
   
   if (R_count == 4){PORTB = ~0b00001000; PORTD = cifri[R4];}
   
   R_count++;
   if (R_count>4){R_count=1;}
      
      
 
NewState=PINC & 0b00000111;   //Для инкодера
if(NewState!=OldState)
{
switch(OldState)
   {
   case 2:
      {
      if(NewState == 3) upState++;
      if(NewState == 0) downState++;
      break;
      }
 
   case 0:
      {
      if(NewState == 2) upState++;
      if(NewState == 1) downState++;
      break;
      }
   case 1:
      {
      if(NewState == 0) upState++;
      if(NewState == 3) downState++;
      break;
      }
   case 3:
      {
      if(NewState == 1) upState++;
      if(NewState == 2) downState++;
      break;
      }
   }           
OldState=NewState;
}
         
         
         
         

   
}

ISR (TIMER1_COMPA_vect) //Прерывания для первого таймера по сравнению. Чтобы отслеживать 1сек.
{
   start_sec--;
   
   if (start_sec < 0)
      start_sec = 0;
   
   
      /*Теперь когда изначальное значение снизилось до 0, включать пищалку*/
      
      if (start_sec == 0)
      {
         PORTC |= (1<<3);
      }
      
      else
      {
         PORTC &= ~(1<<3);
      }
   
}

int main(void)
{
   
   //TCCR0 |= (1<<1);
   //TCCR0 &= ~((1<<0)|(1<<2)); //Активация нулевого таймера (делим на 8)
   
   TCCR0 |= (1<<CS01);
   
   TCNT0 = 0; //Обнуляем (на всякий случай) нулевой таймер
   
   sei(); //Разрешаем выполнение прерываний
   
   TIMSK |= (1<<0); //Устанавливаем 1 в нулевой бит, т.е. Прерывания для нулевого таймера (TOIE0)
   
    DDRB = 0b00001111; //Выводы на выход
   DDRD = 0b01111111; //Выводы на выход
   
   DDRC |= (1<<3); //тут будет выход на пищалку.
   PORTC &=~(1<<3); //по умолчанию сигнал на пищалку не подается этот порт в 0-ле
   
   DDRC = 0b00000000; //Выводы на вход (тут кнопки)
   PORTC = 0b00000111; //Подтягивающие резисторы к кнопкам
   
   
   Chislo_celikom(start_sec);
    while (1)
    {
      Chislo_celikom(start_sec);
      
      
      /* для инкодера*/
      
   
      
      if (upState >=4)
      {
         start_sec++;
         upState = 0;
         
         if (start_sec>5999)
         {
            start_sec=0;
         }
      }
      
      
      if (downState >=4)
      {
         start_sec--;
         downState = 0;
         
         
         if (start_sec<0)
         {
            start_sec=5999;
         }
         
      }
      
      if (~PINC & (1<<2))
      {
         if (start_sec == 0)
         {
            PORTC &= ~(1<<3);
         }
         start_otscheta();
         _delay_ms(200);
      }
      
    }
}




Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Пн май 25, 2020 10:45:52 
Мудрый кот

Карма: 18
Рейтинг сообщений: 509
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1875
Рейтинг сообщения: 0
Возьмите энкодер, уберите индикатор и всё, что с ним связано. Подключите светодиод (или пару) и начните его/их зажигать по энкодеру. Разберитесь с энкодером на этом просто примере, тогда разберетесь и дальше.


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

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

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

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

Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Пн май 25, 2020 12:59:27 
Родился

Зарегистрирован: Вс май 24, 2020 13:27:28
Сообщений: 5
Рейтинг сообщения: 0
Возьмите энкодер, уберите индикатор и всё, что с ним связано. Подключите светодиод (или пару) и начните его/их зажигать по энкодеру. Разберитесь с энкодером на этом просто примере, тогда разберетесь и дальше.


В том то и дело что с самим энкодером разобрался, а вот в программно реализовать "затык" получается (. Уже и сам пробовал код писать и в сети находил пытался использовать, просто не могу понять в чем дело. Логику кода (из сети) вроде понимаю, вижу что должно работать прошиваю МК подключаю все и результат нулевой...


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Пн май 25, 2020 13:29:58 
Мудрый кот

Карма: 18
Рейтинг сообщений: 509
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1875
Рейтинг сообщения: 0
Так я вам и говорю, чтобы с программой именно разобраться, для начала отбросьте весь код про таймер и прочие минуты и т.п. Сделайте на энкодере что-то элементарное. Как заработает - уже можно переносить на таймер. Вам так будет быстрее и проще разобраться.


Вернуться наверх
 
Вебинар «Экосистема MEAN WELL. Решения для любых задач электропитания» (20.05.2021)

Приглашаем 20 мая на вебинар, посвященный линейке поставок компании MEAN WELL и ее подходу к производству источников питания — как экосистемы продукции и услуг, которая позволяет подобрать оптимальный источник питания для любых задач электропитания. Рассмотрим весь спектр выпускаемой продукции MEAN WELL в области AC/DC-, DC/DC- и DC/AC-преобразователей с подробным разбором интересных и уникальных новинок, их применении и многое другое.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Пн май 25, 2020 17:15:36 
Родился

Зарегистрирован: Вс май 24, 2020 13:27:28
Сообщений: 5
Рейтинг сообщения: 0
Разобрался все заработало)).





И такой еще вопрос: если выполнять в корпусе уже готовое устройство этот таймер или что то другое. Что лучше всего использовать в качестве питания? Батарейки или аккумулятор ? Если аккумулятор для него ведь какой нибудь адаптер еще нужен что бы заряжать ? Не саму зарядку имею ввиду, а некий сигнализатор когда зарядка завешена, защита от перезарядки (высокой напруги) Может кто поделиться ссылкой где про это почитать можно ?


Вернуться наверх
 
Интеллектуальные ключи верхнего плеча семейства PROFET™+2 12V от Infineon

Компания Infineon представила новое семейство защищенных силовых ключей PROFET™+2 12V. Изделия объединяют в себе функции диагностики и различные защиты. Ключи PROFET™+2 12V имеют одно из самых низких в отрасли сопротивлений в открытом состоянии RDS(ON) (от 2,6 мОм) и выпускаются в миниатюрном корпусе TSDSO-14 с шагом выводов 0,65 мм. Благодаря функции ReverseON все семейство соответствует строгим требованиям по защите от обратной полярности питания, впервые реализованной в одном чипе.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Пн май 25, 2020 18:13:14 
Мудрый кот

Карма: 18
Рейтинг сообщений: 509
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1875
Рейтинг сообщения: 1
Ну с АКБ удобнее конечно. Замерьте потребление тока в вашей схеме - будете понимать сколько от АКБ ваше ус-во проработает.
Стоит опять же предусмотреть выключение питания или целиком, или выход МК в сон когда не используется, хотя у вас индикатор потребляет больше.
Для зарядки лучше использовать отдельную готовую микруху. Самые народные и частые - копеечные TP4056. На Алиэкспрессе полно разных модулей с ними, в т.ч. со встроенным Step-Up (повышайка) до 5В для атмеги. Хотя если возьмете Atmega8L вместо просто 8 - можно будет питать напрямую от 1 банки Li-Ion, т.к. там диапазон питания более широкий. Там же есть индикатор зарядки уже. На али есть микромодули сразу с парой светодиодов - есть питание/зарядка завершена.
Для индикации разряда - подключаете батарею на АЦП атмеги через делитель и измеряете относительно встроенного ИОН (2.56В емнип). Делитель ес-но подбирается т.о. образом, чтобы на макс заряда напряжение после делителя было ниже напряжения ИОН, но близко к нему. Ну и дальше просто измеряете АЦП напряжение на батарее. Либо ловите падение ниже уровня определенного, либо многоуровневую индикацию, как угодно. Там уже смотрите по графику разряда вашего акка.

Ссылку... да гуглится как "контроль заряда акб atmega8" и т.п. Хотя бы вот: https://www.rlocman.ru/shem/schematics.html?di=73220


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Вт янв 19, 2021 18:11:46 
Родился

Зарегистрирован: Вс май 24, 2020 13:27:28
Сообщений: 5
Рейтинг сообщения: 0
Доброго времени суток, Уважаемые форумчане!
Такой вопрос возникла необходимость немного улучшить вышеописанный код. А именно настроить работу таймера в асинхронном режиме. На 9-ю и 10-ю ножку прицеплен часовой кварц, без конденсаторов. Код согласно даташиту на ATmega 8. Все нормально все включается НО сам таймер не запускается. т.е. при нажатии на кнопку старт ничего не происходит. При прошивке МК фьюзы по умолчанию, т.к. как я понял тактируется только таймер - 2, а не весь МК.

Никак не могу понять в чем я опять "протупил". )))

Заранее благодарю за ответ.
Код:
#define F_CPU 1000000UL //Задаем частоту работы МК
#include<util/delay.h> //Библиотека задержек
#include <avr/interrupt.h> //Библиотека прерываний
..........................................................................................................

void start_otscheta (void) //Тут будут размещены все настроки 2-го таймер/счетчика
{
   
   /*1. Отключите прерывания таймера / счетчика 2, очистив OCIE2 и TOIE2.*/
   TIMSK &= ~(1 << OCIE2)|(1 << TOIE2); // Запрещаем прерывания по T2
   
   
   /*2. Выберите источник синхронизации, установив соответствующий параметр AS2.*/
   ASSR |= (1 << AS2); // Включаем асинхронный режим T2
   
   /*3. Запишите новые значения в TCNT2, OCR2 и TCCR2.*/
   
   TCNT2 = 0; // Сбрасываем регистр счета
   
   TCCR2 &= ~(1 << WGM21)|(1 << WGM20);
   TCCR2 |= (1 << CS22)|(1 << CS20);
   TCCR2 &= ~(1 << CS21);               // Предделитель на 128(32768/128 = 256 тиков/c)
   
   
   /*4. чтобы переключиться на асинхронную работу: дождитесь сброса битов TCN2UB, OCR2UB и TCR2UB.*/
   
   while (ASSR != 0b00001000)
   {
      asm("nop");
   }
   
   /*5. Снимите флаги прерывания Timer/Counter2.*/
   TIMSK |= (1 << OCIE2)|(1 << TOIE2); // разрешаем прерывания по T2
   
   
   /*6. Разрешить прерывания, если это необходимо.*/
   sei();
   
   
}

..........................................................................
ISR (TIMER2_OVF_vect) //Прерывания для второго таймера по переполнению. Чтобы отслеживать 1сек.
{
   start_sec--;
   
   if (start_sec < 0)
      start_sec = 0;
   
   
      /*Теперь когда изначальное значение снизилось до 0, включать пищалку*/
      
      if (start_sec == 0)
      {
         PORTC |= (1<<3);
         PORTD = 0b0001000;
         PORTB = 0b00001111;
         _delay_ms(300);
         PORTC &= ~(1<<3);
....................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Вт янв 19, 2021 19:27:29 
Мудрый кот

Карма: 18
Рейтинг сообщений: 509
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1875
Рейтинг сообщения: 1
Цитата:
/*3. Запишите новые значения в TCNT2, OCR2 и TCCR2.*/

Вот именно запишите, а вы их пытаетесь менять. В ДШ написано, что при переключении режима таймера синх/асинх, эти регистры будут содержать мусор. Поэтому не надо пытаться их менять. Надо целиком перезаписать значения.

Попробуйте так:
Код:
void start_otscheta (void) //Тут будут размещены все настроки 2-го таймер/счетчика
{
   
   /*1. Отключите прерывания таймера / счетчика 2, очистив OCIE2 и TOIE2.*/
   TIMSK &= ~((1 << OCIE2)|(1 << TOIE2)); // Запрещаем прерывания по T2
   
   /*2. Выберите источник синхронизации, установив соответствующий параметр AS2.*/
   ASSR |= (1 << AS2); // Включаем асинхронный режим T2
   
   /*3. Запишите новые значения в TCNT2, OCR2 и TCCR2.*/
   
   TCNT2 = 0; // Сбрасываем регистр счета

// Почему OCR2 не писали?
   OCR2 = 0;   

   TCCR2 = 0;
// Пока просто сбросим этот регистр тоже, таймер запустим после переключения режима!     

   /*4. чтобы переключиться на асинхронную работу: дождитесь сброса битов TCN2UB, OCR2UB и TCR2UB.*/
   
   while (ASSR != (1 << AS2));
   
   /*5 Очистите флаги прерывания (!) Timer/Counter2 */
   TIFR &= ~((1 << OCF2) | (1 << TOV2));
   
// Флаги прерывния - в регистре TIFR!

   /*6. Разрешить прерывания, если это необходимо.*/
   TIMSK |= (1 << TOIE2); // разрешаем прерывания по переполнению (!) T2
// - зачем у вас тут OCIE2 было? У вас же нет прерывания по совпадению с OCR2.

// Запускаем таймер. Всё остальное тут было лишнее. В TCCR2 надо писать, а не пытаться менять биты, смысла нет, когда мы пишем все биты. Через = записывают только 1, остальные все пишутся в 0. И именно это и нужно сделать
   TCCR2 = (1 << CS22)|(1 << CS20); // Предделитель на 128(32768/128 = 256 тиков/c)

   sei();
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер с энкодером на ATmega8
СообщениеДобавлено: Ср янв 20, 2021 16:26:59 
Родился

Зарегистрирован: Вс май 24, 2020 13:27:28
Сообщений: 5
Рейтинг сообщения: 0
Спасибо тебе огромное, добрый человек!!! Все заработало!


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

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


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

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


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

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


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