Пятница, 29.03.2024, 12:16
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по статьям » Простые часы на Atmega8.
Простые часы на Atmega8.
Vladimir-19Дата: Среда, 06.01.2010, 12:04 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Offline
Привет всем!!!

Отличный сайт!!! good

Немного переработал код для точности хода часов
(использую второй таймер с кварцем на 32768) и возник глюк:
секунды могут иногда отображаться через 1 (..32..34..) и получается так что может появиться 61 секунда smile
Частота 4 МГц, пробывал увеличивать частоту, отключать эффект тот-же
Где напортачил?

Code
#include <mega8.h>

// Alphanumeric LCD Module functions
#asm
    .equ __lcd_port=0x18  
   #endasm  

#include <delay.h>       
#include <stdio.h>

  unsigned int sek;     
  unsigned int min;     
  unsigned int hour;            

interrupt [TIM2_COMP] void timer2_comp_isr(void) // таймер на частоту  1 Гц
{
         
        sek++;            // прибавляем секунду
        TCNT2=0;
}

void main(void)
{

ASSR=0x08;
TCCR2=0x07;
TCNT2=0x00;
OCR2=(32-1);// (для 32 тактов OCR2=31), совпадает с частотой 1 Гц

#asm("sei")

while (1)//далее цикл описаный автором
 
HiSERДата: Четверг, 07.01.2010, 10:01 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Это весь код?
 
Vladimir-19Дата: Четверг, 07.01.2010, 14:55 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Offline
Нет код естественно не весь.
В этом всё и дело!

В цикл while (1) вогнал помимо секунд опрос и отображение датчиков DS1820 !!!...
Только на их опрос тратится ~750 ms.
Здесь и возникает задержка. Интересно есть ли возможность уменьшить её.

Данный вопрос можно закрывать.

Есть еще вопрос.
Как реализовать внутренний будильник на биппер (скажем пьезо)... предпочтительнее использовать таймер но вот как это сделать, есть ли у кого наработки.

 
HiSERДата: Вторник, 12.01.2010, 06:28 | Сообщение # 4
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Посмотри мою реализацию http://my-avr.at.ua/publ/ds1822_7seg_na_atmega8_update/1-1-0-33

Добавлено (12.01.2010, 06:28)
---------------------------------------------

Code

#define SPEAK PORTB.2

void delay_us2(word delay) {
int i;
for (i=0;i<delay;i++) delay_us(40);
}

void beep(word freq, word delay) {
word i,t,c;
t=20000/freq/2;
c=freq/(1000/delay);
for (i=0;i<c;i++) {
SPEAK=1;
delay_us2(t);
SPEAK=0;
delay_us2(t);
}
}

void beep2(word freq, word delay, byte cnt) {
byte i;
if (cnt>1) {
beep(freq,delay);
for (i=0;i<cnt-1;i++) {
delay_ms(delay);
beep(freq,delay);
}
}
}
 
Serega1Дата: Воскресенье, 01.08.2010, 20:29 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Что означает эта строчка lcd_putchar(hour/10+0x30);
я так понимаю функция выводит один символ,сначала переменная делится на десять а вот што это такое +0x30 непонятно?
 
HiSERДата: Воскресенье, 01.08.2010, 21:13 | Сообщение # 6
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Эта строчка выводит символ на LCD дисплей, в данном случае разряд десятков числа hour.
Например:
unsigned char hour=18;
hour=hour/10; //hour=1;

ansi код символов 0-9, 0x30(48)-0x39(57)
отсюда и

hour=hour+0x30;
lcd_putchar - печатать символ на дисплей.

 
Serega1Дата: Воскресенье, 01.08.2010, 22:25 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Тогда зачем к hour добавлять символ ноля эт штобы переменная hour cтала из типа int в тип char
 
HiSERДата: Понедельник, 02.08.2010, 14:59 | Сообщение # 8
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
если честно, не понял вопрос...
 
Serega1Дата: Понедельник, 02.08.2010, 18:33 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Какая разница между этим lcd_putchar(hour/10+0x30); и етим lcd_putchar(hour/10); и так и так CodeVisionAVR ошибки не выдает,0x30 это символ ноля как я понял ,так зачем к переменной hour прибавлять символ ноля?
 
HiSERДата: Понедельник, 02.08.2010, 20:08 | Сообщение # 10
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
hour/10 так ты получишь число 0-9
на LCD передается ansi символ, где отображаемое число от 0 до 9 обозначается ANSI кодом от 48 до 57, по этому и + 48.
в -> google по ANSI, ASCII
----------------------------
Еще проще пример:

unsigned char num_ansi[10];

num_ansi[0]=48;
num_ansi[1]=49;
num_ansi[2]=50;
num_ansi[3]=51;
num_ansi[4]=52;
num_ansi[5]=53;
num_ansi[6]=54;
num_ansi[7]=55;
num_ansi[8]=56;
num_ansi[9]=57;

lcd_putchar(num_ansi[hour/10]);

Сообщение отредактировал HiSER - Понедельник, 02.08.2010, 20:13
 
Serega1Дата: Вторник, 03.08.2010, 22:51 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Все понял спасибо,скажи а как ты в proteus добавил две кнопки?
 
HiSERДата: Четверг, 05.08.2010, 00:55 | Сообщение # 12
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
так же ка и все остальное, называется BUTTON.
 
Форум » Микроконтроллеры » Вопросы по статьям » Простые часы на Atmega8.
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz