Простые часы на Atmega8.
|
|
Vladimir-19 | Дата: Среда, 06.01.2010, 12:04 | Сообщение # 1 |
 Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Привет всем!!! Отличный сайт!!! Немного переработал код для точности хода часов (использую второй таймер с кварцем на 32768) и возник глюк: секунды могут иногда отображаться через 1 (..32..34..) и получается так что может появиться 61 секунда Частота 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
Статус: Offline
| Это весь код?
|
|
| |
Vladimir-19 | Дата: Четверг, 07.01.2010, 14:55 | Сообщение # 3 |
 Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Нет код естественно не весь. В этом всё и дело! В цикл while (1) вогнал помимо секунд опрос и отображение датчиков DS1820 !!!... Только на их опрос тратится ~750 ms. Здесь и возникает задержка. Интересно есть ли возможность уменьшить её. Данный вопрос можно закрывать. Есть еще вопрос. Как реализовать внутренний будильник на биппер (скажем пьезо)... предпочтительнее использовать таймер но вот как это сделать, есть ли у кого наработки.
|
|
| |
HiSER | Дата: Вторник, 12.01.2010, 06:28 | Сообщение # 4 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Что означает эта строчка lcd_putchar(hour/10+0x30); я так понимаю функция выводит один символ,сначала переменная делится на десять а вот што это такое +0x30 непонятно?
|
|
| |
HiSER | Дата: Воскресенье, 01.08.2010, 21:13 | Сообщение # 6 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Тогда зачем к hour добавлять символ ноля эт штобы переменная hour cтала из типа int в тип char
|
|
| |
HiSER | Дата: Понедельник, 02.08.2010, 14:59 | Сообщение # 8 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| если честно, не понял вопрос...
|
|
| |
Serega1 | Дата: Понедельник, 02.08.2010, 18:33 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Какая разница между этим lcd_putchar(hour/10+0x30); и етим lcd_putchar(hour/10); и так и так CodeVisionAVR ошибки не выдает,0x30 это символ ноля как я понял ,так зачем к переменной hour прибавлять символ ноля?
|
|
| |
HiSER | Дата: Понедельник, 02.08.2010, 20:08 | Сообщение # 10 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Все понял спасибо,скажи а как ты в proteus добавил две кнопки?
|
|
| |
HiSER | Дата: Четверг, 05.08.2010, 00:55 | Сообщение # 12 |
 Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| так же ка и все остальное, называется BUTTON.
|
|
| |