Например TDA7294

РадиоКот > Конкурс: Поздравь Кота по-человечески 2017!

Простые часы на tiny2313

Опубликовано 31.08.2017.
Создано при помощи КотоРед.

Всегда что то с чего то начинается. История о том как я решил сделать что то на микроконтроллере. 

 

      Лет в 14 я начал увлекаться электроникой. Да сначала были простые схемки. Мультивибраторы, всякие пищалки. Потом я собирал и усилители. Были и передатчики, диммеры, преобразователи. Потом конечно же я столкнулся с такими микросхемами как контроллеры. Было вообще непонятно как их программировать и как писать к ним программы. Начал читать книгу по CodeVishion AVR от автора Белова А.В. В интернете много информации по данному языку программирования. И постепенно вник в суть. Не хочу сказать что я разбираюсь в данный момент как профессионал, но что то теперь умею. Вот и сейчас расскажу как я сделал часики на tiny2313.

 

     Данные часы предназначались как замена штатным часам в ВАЗ2107 (хотя я их туда так и не поставил, а корпус взял от манометра). Если кто знает там что бы поменять время нужно было давить на кнопочку и минутная стрелка вращалась по часовой с шагом около 5 минут. В тех часах что я сделал принцип примерно тот же. Нажатием на кнопку время меняется по +10 минут раз в секунду по прирыванию. Я потом подробно опишу программу, а исходник вы найдете внизу страницы. Давайте взглянем на схему.

     Очень простая типичная схема. Индикация динамическая. Питается индикаторы и контроллер через кренку. Потребление около 100 ма. (предел кренки). В моем случае используется блок питания с сетевым трансформатором на 12 вольт с простейшим фильтром. 

 

Давайте немного разберем алгоритм работы. Тактовый генератор микроконтроллера работает на частоте 4 мгц. Регистры 16 битного таймера настроены таким образом что бы на вход поступали тактовые импульсы через делитель на 64. Это 62500 импульсов в секунду. Что как раз входит в диапазон 16 битного таймера. Каждые 62500 тактов происходит прерывание по которому выполняется подпрограмма. В этой подпрограмме выполняется следующее:

 interrupt [TIM1_COMPA] void sec (void)
{
se++; 
if (se>=43199) 
{se=0;}; 
if (PIND.6==0) 
{delay_ms (2);
se=se+600; 
};
PORTB.0=~PORTB.0; 
}

    Инкрементирование 1 в переменную которая хранит количество секунд. Проверка данной переменной на количество секунд в 12 часах. (часы работают в 12 часовом формате). Соответственно обнуление счета если больше 12. Так же сюда входит опрос кнопки и присваение по этому событию 10 минут в счет переменной. И изменение состояния младшего разряда B порта (который является двумя мигающими точками по схеме)

В основной программе происходит разбивание переменной se на секунды, минуты и часы. С занесением в массив каждого значания. Далее из массива уже соответственно вывод информации на индикаторы. 

while (1)
{#asm ("sei"); 
discharge [0]=se/36000; 
discharge [1]=(se%36000)/3600; 
discharge [2]=(se%3600)/600; 
discharge [3]=(se%600)/60; 
discharge [4]=(se%60)/10; 
discharge [5]=se%10;
PORTB=(digits[discharge[0]])|(PORTB&mask);
PORTD.0=0; 
PORTD.5=1;
delay_ms(2);
PORTB=(digits[discharge[1]])|(PORTB&mask);
PORTD.1=0;
PORTD.0=1;
delay_ms(2);
PORTB=(digits[discharge[2]])|(PORTB&mask);
PORTD.4=0; 
PORTD.1=1; 
delay_ms(2);
PORTB=(digits[discharge[3]])|(PORTB&mask);
PORTD.5=0; 
PORTD.4=1; 
delay_ms(2);
PORTD.5=1;
}

В программе реализованы единицы и десятки секунд. Хотя на деле выводов порта D микроконтроллера не хватило. На схеме кнопка подключена к PD.6.

    Я немного прикинул погрешность данного девайса. Если кварц 4.000 Мгц при максимальной погрешности в 4.000999 Мгц это около 20 минут в год. Но она же не может быть максимальной. Это маловероятно. 

Вот и все. На этом я хочу закончить свой рассказ. А вообще если есть вопросы то давайте задавайте. Будем улучшать часики. Есть идеи немножко их улучшить. 


Файлы:
Архив RAR


Все вопросы в Форум.


ID: 2547

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

11 21 20
1
Подробно