Понедельник, 21.09.2020, 19:21
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

Делаем простые часы с будильником.
Итак, для этого мы используем таймер, который настроены на частоту тактирования 1Гц. ЖК-дисплей пару кнопок для настройки времени кнопку для выбора режима (часы/будильник), кнопку сброса времени и кнопку отключения сирены. Кнопка ALR/Clock служит для переключения режима настройки часов, либо настройки будильника. В качестве индикатора срабатывания будильника мы используем светодиод. 

Собираем схемку:

А вот сам исходник:

#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h>

unsigned char sek;
unsigned char min;
unsigned char hour;
// стандартные значения будильника
unsigned char hour_b=12;
unsigned char min_b=0;
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
  TCNT1H=0;
  TCNT1L=0;
  sek++;  
}
// Declare your global variables here
void main(void)
{
PORTB=0xFF;
DDRB=0x00;

PORTC=0x00;
DDRC=0x7F;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
  {
  // Place your code here
  // Кнопки
  if (PINB.5==0) // режим Alarm/clock
  {
  if (PINB.0==0) // если нажата первая кнопка
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  hour++;
  }
  if (PINB.1==0) // если нажата вторая кнопка
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  hour--;
  }
  if (PINB.2==0) // если нажата третья кнопка
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  min++;
  }
  if (PINB.3==0) // если нажата четвертая кнопка
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  min--;
  }
  if (PINB.4==0) // Reset
  {
  hour=0;
  min=0;
  sek=0;  
  }
  if (PINB.6==0) // Stop ALARM (светодиод будильника затушить)
  {
  PORTC.0=0;  
  }
   
   
   
   
  ///// Условия часов.
  if(sek==60) // если сек = 60 
  {
  min++; // добавляем 1 к переменной "минута" 
  sek=0; // зануляем переменную "секунда"
  }
  if(min==60) // если мин = 60 
  {
  hour++; // добавляем 1 к переменной "час" 
  min=0; // зануляем переменную "минута"
  }
  if (hour==24) // так как у нас часы имеют 24 часовый формат
  { // при достыжении 24 часов, онулируем все переменные.
  hour=0;
  min=0;
  sek=0;
  }
  // защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус.
  if (hour==255)
  hour=0;
  if (min==255)
  min=0;
   
  if (hour==hour_b && min==min_b) // срабатывание будильника
  PORTC.0=1; // будильник будет работать только одну минуту, когда время и минуты совпадают.
   
  lcd_gotoxy(4,0);  
  lcd_putchar(hour/10+0x30);
  lcd_putchar(hour%10+0x30);
  lcd_putchar(':');
  lcd_putchar(min/10+0x30);
  lcd_putchar(min%10+0x30);
  lcd_putchar(':');
  lcd_putchar(sek/10+0x30);
  lcd_putchar(sek%10+0x30);
  }
  else
  {  
  if (PINB.0==0)  
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  hour_b++;
  }
  if (PINB.1==0)  
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  hour_b--;
  }
  if (PINB.2==0)  
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  min_b++;
  }
  if (PINB.3==0)  
  {
  delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
  min_b--;
  }
   
  // защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус.
  if (hour_b==255)
  hour=0;
  if (min_b==255)
  min=0;
   
  lcd_gotoxy(4,0); // выводим посередине, если хотите вывести в начале дисплея тогда нужно выставить lcd_gotoxy(0,0);  
  lcd_putchar('A');
  lcd_putchar('l');
  lcd_putchar('.');
  lcd_putchar(' ');
  lcd_putchar(hour_b/10+0x30);
  lcd_putchar(hour_b%10+0x30);
  lcd_putchar(':');
  lcd_putchar(min_b/10+0x30);
  lcd_putchar(min_b%10+0x30);
  }  
  };
}


Файлы по проекту находятся в разделе файлы. Все вопросы на форум :) 



Категория: Учимся работать с AVR | Добавил: my-avr (25.01.2009)
Просмотров: 17279 | Комментарии: 23 | Рейтинг: 5.0/1 |
Всего комментариев: 221 2 »
0
22 m1ster   [Материал]
Там в архиве есть папка EXE там два файла clock2.hex и clock2.rom
второй это EEPROM?

0
20 иринка   [Материал]
а на каком языке написано?

0
21 HiSER   [Материал]
C++

0
19 linerx   [Материал]
этот участок проверки и обнуления секунд
///// Условия часов.
if(sek==60) // если сек = 60

лучше написать так

if(sek>59){
sek=sek-60;
...
};

тогда глючить не будет


0
15 linerx   [Материал]
Здесь опечатка

// защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус.
if (hour_b==255) ----------- проверяем на совпадение переменную hour_b
hour=0; ------------ а обнуляем hour
if (min_b==255) ----------- то же и здесь min_b
min=0; ------------ обнуляем min


0
14 linerx   [Материал]
Тут есть один глюк.
Если нажать кнопку установки будильника в конце любой минуты (к примеру 58, 59 секунда) и отпустить ее секунд через 5, то показания секунд часов не обнуляются и продолжают считать 63, 64,... и т.д.)

вопрос, в этом участке программы два раза обнуляются секунды

///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда" - обнуляем секунды
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0; - зачем здесь снова обнуляем секунды?

Я собрал часы на М8, часы спешили на 38 секунд в сутки. После программной автоподстройки точность хода составила 3 секунды в месяц. Но получается то, что автоподстройку необходимо подстраивать под конкретный кварц.

А зачем настраивать таймер на частоту 1 Гц?
Не проще ли настроить его на 1000 - 10000 тиков в секунду? Тогда автоподстройку хода часов производить может абсолютно любой пользователь прямо из меню часов.


0
16 HiSER   [Материал]
Зачем делать какую-то авто подстройку если можно просто повешать кварц на 32768Hz и настроить асинхронный счетчик.

0
18 linerx   [Материал]
У любого кварца есть погрешность. Я когда-то собирал часы на ИМС К176ИЕ12 и кварцев поменял штук десять, причем даже подстроечными конденсаторами не всегда удавалось подстроить частоту.

Р.С. Спасибо за CodeVision


0
12 urii   [Материал]
что и куда припаять чтоб не отставали?

0
11 urii   [Материал]
для дальнейшего развития можно метеостанцию сделать только LCD на 4x20

0
10 urii   [Материал]
lcd_putchar('A');
lcd_putchar('l');
lcd_putchar('.');
lcd_putchar(' '); //вот это совсем тут не надо или будет оставаться символ при вызове будильника т. е. еще один символ после секундочек. либо нужно чистить LCD после вызова будильника

0
9 SergK   [Материал]
Кстати в качестве просто часов такая конструкция неудобна из-за высокой цены и малого размера символов индикатора...
Вот в качестве основы для дальнейшего развития самое то...

0
8 SergK   [Материал]
Делал часы на тини2313 и светодиодных индикаторах, точность даже без кварца вполне достаточна для многих целей, а с хорошим кварцем уход значительно меньше минуты в месяц, точно сказать не могу, т.к. чаще случаются перебои в электросети...

1-10 11-17
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2020
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Какой МК вы используете?
Всего ответов: 3213
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz