Страница 1 из 1
Mega16 Часы. Концепция начала.
Добавлено: Пн фев 27, 2012 22:14:53
Roin
Здравствуйте. Я начинающий. Прошу ваших советов/подсказок. Заранее благодарен за любые мысли.
Есть тз:
- К микроконтроллеру подключен дисплей(любой) 16х2 (к каким портам - без разницы)
- К микроконтроллеру подключены 4 кнопки(влево вправо вниз вверх)(к каким портам - без разницы)
- Используя прерывание от таймера Timer2 реализовать работу часов
- На эран вывести меню вида:
>Время
Дата
При нажатиии в меню кнопки 'вниз' 'галка' перемещается ниже:
Время
>Дата
При нажатиии 'вверх' выше.
При нажатии 'Вправо' если 'галка' находится на 'Время' Вывести на экран текущее время вида ЧЧ:MM:СС
если нажать еще раз 'Вправо' -дается возможность редактировать текущее время:
под ЧЧ появляется курсор '_' и кнопками вверх-вниз можно изменять тек. значение
в данном режиме редактирования кнопкой далее происходит перемещение по редактируемым переменным и курсора по кольцу Ч->М->С->Ч->М->С..
Выходить из режима редактирования - кнопкой "Влево"
если 'галка' находится на 'Дата' Вывести тек дату ДД/ММ/ГГГГ
-//-//- редактирование аналогично
Как я планирую сделать это задание:
1. Делать решил в cvavr 2.05.0, эмуляция в протеусе.
2. Для себя решил, что для начала нужно попробовать просто вывести что то на экран. В cvavr выбрал lcd 16x2 к порту А, вывел тестовое сообщение - получилось.
3. Далее решил подключить 4 кнопки и так сказать "увидеть" их в коде. Т.е попытаться понять как работать с кнопками, например при нажатии каждой кнопки зажеч соответствующий это кнопке светодиод.
Вот сдесь затруднения. Примеры работы с одной и двумя кнопками я находил, а вот с 3 или более нет.
Как "ловить" нажатие кнопок так понимаю есть несколько вариантов, прерывания и проверка битов в цыкле маин.
Конечно хотелось бы сделать прерыванием, но я так понял что есть только 2 прерывания int0 и int1, т.е для 2х кнопок.
Вот тут прошу совета, т.к плохо представляю этот этап себе.
Когда разберусь с этим этапом думаю дальше будет двигаться легче.
Re: Mega16 Часы. Концепция начала.
Добавлено: Пн фев 27, 2012 22:23:20
c717411
проверка портов в цикле при работе с кнопками будет нормальным решением
имхо прикрутите к проекту часы реального времени, что позволит заодно изучить и I2C.
Re: Mega16 Часы. Концепция начала.
Добавлено: Вт фев 28, 2012 11:34:05
borys
Делать все это будет удобно на отладочной плате FastAVR.
Re: Mega16 Часы. Концепция начала.
Добавлено: Ср фев 29, 2012 14:31:22
Roin
Всем привет.
Сделал меню, пока без функционала.
Я пока все делаю в протеусе, и тут возникла проблема. При нажатии клавиши код отвечающий за обработку этой клавиши так понимаю выполняетса несколько раз. Т.е понимаю это есть дребезг контактов ? Я думал что этот негативный эффект будет только на реальной плате а не в протеусе.
Сейчас начинаю делать часы для субменю ">часы".
Вот код:
Код: Выделить всё
/*****************************************************
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 12,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <alcd.h>
#include <delay.h>
#define BUT_LEFT button==3
#define BUT_RIGTH button==4
#define BUT_UP button==1
#define BUT_DOWN button==2
unsigned char menu =10; /*главное меню:
>time
date
*/
unsigned char galka = 1;
/*
1 - галка перед time
2 - галка перед date
*/
unsigned char button;
unsigned char ButtonRead(void){
button = 0;
if(PINB.0==0) button = 1; //вверх
if(PINB.3==0) button = 2; //вниз
if(PINB.1==0) button = 3; //влево
if(PINB.2==0) button = 4; //вправо
return button;
}
void PrintLcd(unsigned char column, unsigned char line, char flash *str){
lcd_gotoxy(column,line);
lcd_putsf(str);
}
void main(void) {
PORTA=0x00; DDRA=0x00;
PORTB=0b00001111; //подтягивающие резисторы на первые 4 пина.
DDRB=0x00;
PORTC=0x00; DDRC=0x01; //первый пин на выход. на всякий
PORTD=0x00; DDRD=0x00;
lcd_init(16);
while (1){
ButtonRead();
switch(menu){
case 10: //главное меню
if(BUT_UP){ //жмакнули вверх. галка вверх.
lcd_clear();
PrintLcd(0,0,">time"); PrintLcd(1,1,"date");
galka = 1;
}
if(BUT_DOWN){ //жмакнули вниз. галка вниз.
lcd_clear();
PrintLcd(1,0,"time"); PrintLcd(0,1,">date");
galka = 2;
}
if(BUT_RIGTH){ //жмакнули вправо
if(galka==1){menu=20;lcd_clear();break;} //глака стояла на >time. переходим в субменю
if(galka==2){menu=30;lcd_clear();break;} //глака стояла на >date. переходим в субменю
}
if(galka==1){ PrintLcd(0,0,">time"); PrintLcd(1,1,"date");}
if(galka==2){ PrintLcd(1,0,"time"); PrintLcd(0,1,">date");}
break;
case 20: //меню "time". часы. настрока часов.
PrintLcd(0,0,"HH:MM:SS");
if(BUT_LEFT) {menu=10;lcd_clear();}
break;
case 30://меню "date". дата, настройка даты.
PrintLcd(0,0,"DD:MM:GG");
if(BUT_LEFT) {menu=10;lcd_clear();}
break;
}
}
}

Re: Mega16 Часы. Концепция начала.
Добавлено: Ср фев 29, 2012 18:50:34
Roin
Подскажите пожалуйста как вывести числовую переменную в символ ?
вроде бы itoa этим занимается, но как именно не найду

Это нужно для отображения времени на лсд. или подскажите как сделать подругому, может быть есть варианты
Re: Mega16 Часы. Концепция начала.
Добавлено: Ср фев 29, 2012 21:01:41
Roin
Удалось запустить таймер2.
Теперь секунды тикаю и минуты и часы )
использовал такой формат для вывода sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
ребят подскажите как сделать курсор мигающим ?
нашел вот сдесь в таблице
http://avrlab.com/node/80 флаг отвечающий за это, а как установить этот флаг незнаю

Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 03:34:00
Roin
понял что мерцание курсора делаетса командой 00001111 но блин все перерыл непойму как в cvavr выполнить команду лсд

ребят помогите пожлста, вы меня как то не взлюбили с первого поста, прошу совета - молчание. вроде вежливо советы прошу
Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 09:07:26
pyzhman
Их хелпа:
Код: Выделить всё
void _lcd_write_data(unsigned char data)
writes the byte data to the LCD instruction register.
This function may be used for modifying the LCD configuration.
Example:
/* enables the displaying of the cursor */
_lcd_ready();
_lcd_write_data(0xe);
Взлюбили-взлюбили. Интересен сам процесс барахтанья.

Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 13:18:13
Roin
pyzhman писал(а):Их хелпа:
версия 2.05.0 незнает функции _lcd_ready(), а без нее только с _lcd_write_data(0xe); работает но несовсем так как хотелось бы, вернее совсем нетак

Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 14:10:55
Roin
о, сори, посмотрел в хелпе - там ненадо lcd_ready

/* enables the displaying of the cursor */
_lcd_write_data(0xe);
Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 15:19:17
pyzhman
Замигал?
Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 16:05:20
Roin
pyzhman писал(а):Замигал?
Да, замигал, все огонь

только вот проблема возникла. подскажите пожлста как разложить число на десятки и единицы ?
это нужно для установки времени, т.е напримре курсор стоит под MM в первой позиции. т.е сейчас прибавляем либо убавляем десятки минут. есликурсор сдвинетса вправо то прибавляем либо убавляем единицы минут.
т.е по нажатию кнопки хочу разлочить число напр 58 на переменную 5 и 8, и уже их прибавлять/убавлять каждую отдельно, а потом сложить вместе и опять будет глобальная переменнаа минуты

можно конечно просто убавлять/прибавлять все число целиком не раскладывая его, но как то некрасиво поулчаетса тыкать сто раз до нужного значения, т.к часы минуты и секунды у меня целым числом идут а не раскладываютса на десятки и остатки
Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 16:44:57
pyzhman
Не вижу смысла раскладывать. Если курсор в позиции десятков, то и прибавляем/отнимаем десятки, если в позиции единиц, то оперируем единицами.
Если уж приспичит раскладывать, то просто делим на 10. В результате будет количество десятков, в остатке единицы.
Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 19:14:50
Roin
ну вот после долгих мук получислоь сделать настройку часов. пока только в прибавление.
сейчас буду выносить лишний код в функции а то его много.
теперь осталось сделать уменьшение времени в настройке времени и занятса меню дата.
может быть есть у кого то небольшой кусочек кода работой с датой ? чтобы после тика суток расчитывал дни в месяце, месяцы и год и весокосный год, был бы благодарен

а так - смотрим. прикрепил протеус и cvavr

Re: Mega16 Часы. Концепция начала.
Добавлено: Чт мар 01, 2012 19:16:05
Roin
pyzhman писал(а):Не вижу смысла раскладывать.
да, проше было бы ввести переменные десяток и единиц, но уже написано на разложении

Re: Mega16 Часы. Концепция начала.
Добавлено: Пт мар 02, 2012 05:27:41
Roin
ну чтож, вот и закончил вроде.
смотрим оцениваем
