Mega16 Часы. Концепция начала.
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Mega16 Часы. Концепция начала.
Здравствуйте. Я начинающий. Прошу ваших советов/подсказок. Заранее благодарен за любые мысли.
Есть тз:
- К микроконтроллеру подключен дисплей(любой) 16х2 (к каким портам - без разницы)
- К микроконтроллеру подключены 4 кнопки(влево вправо вниз вверх)(к каким портам - без разницы)
- Используя прерывание от таймера Timer2 реализовать работу часов
- На эран вывести меню вида:
>Время
Дата
При нажатиии в меню кнопки 'вниз' 'галка' перемещается ниже:
Время
>Дата
При нажатиии 'вверх' выше.
При нажатии 'Вправо' если 'галка' находится на 'Время' Вывести на экран текущее время вида ЧЧ:MM:СС
если нажать еще раз 'Вправо' -дается возможность редактировать текущее время:
под ЧЧ появляется курсор '_' и кнопками вверх-вниз можно изменять тек. значение
в данном режиме редактирования кнопкой далее происходит перемещение по редактируемым переменным и курсора по кольцу Ч->М->С->Ч->М->С..
Выходить из режима редактирования - кнопкой "Влево"
если 'галка' находится на 'Дата' Вывести тек дату ДД/ММ/ГГГГ
-//-//- редактирование аналогично
Как я планирую сделать это задание:
1. Делать решил в cvavr 2.05.0, эмуляция в протеусе.
2. Для себя решил, что для начала нужно попробовать просто вывести что то на экран. В cvavr выбрал lcd 16x2 к порту А, вывел тестовое сообщение - получилось.
3. Далее решил подключить 4 кнопки и так сказать "увидеть" их в коде. Т.е попытаться понять как работать с кнопками, например при нажатии каждой кнопки зажеч соответствующий это кнопке светодиод.
Вот сдесь затруднения. Примеры работы с одной и двумя кнопками я находил, а вот с 3 или более нет.
Как "ловить" нажатие кнопок так понимаю есть несколько вариантов, прерывания и проверка битов в цыкле маин.
Конечно хотелось бы сделать прерыванием, но я так понял что есть только 2 прерывания int0 и int1, т.е для 2х кнопок.
Вот тут прошу совета, т.к плохо представляю этот этап себе.
Когда разберусь с этим этапом думаю дальше будет двигаться легче.
Есть тз:
- К микроконтроллеру подключен дисплей(любой) 16х2 (к каким портам - без разницы)
- К микроконтроллеру подключены 4 кнопки(влево вправо вниз вверх)(к каким портам - без разницы)
- Используя прерывание от таймера Timer2 реализовать работу часов
- На эран вывести меню вида:
>Время
Дата
При нажатиии в меню кнопки 'вниз' 'галка' перемещается ниже:
Время
>Дата
При нажатиии 'вверх' выше.
При нажатии 'Вправо' если 'галка' находится на 'Время' Вывести на экран текущее время вида ЧЧ:MM:СС
если нажать еще раз 'Вправо' -дается возможность редактировать текущее время:
под ЧЧ появляется курсор '_' и кнопками вверх-вниз можно изменять тек. значение
в данном режиме редактирования кнопкой далее происходит перемещение по редактируемым переменным и курсора по кольцу Ч->М->С->Ч->М->С..
Выходить из режима редактирования - кнопкой "Влево"
если 'галка' находится на 'Дата' Вывести тек дату ДД/ММ/ГГГГ
-//-//- редактирование аналогично
Как я планирую сделать это задание:
1. Делать решил в cvavr 2.05.0, эмуляция в протеусе.
2. Для себя решил, что для начала нужно попробовать просто вывести что то на экран. В cvavr выбрал lcd 16x2 к порту А, вывел тестовое сообщение - получилось.
3. Далее решил подключить 4 кнопки и так сказать "увидеть" их в коде. Т.е попытаться понять как работать с кнопками, например при нажатии каждой кнопки зажеч соответствующий это кнопке светодиод.
Вот сдесь затруднения. Примеры работы с одной и двумя кнопками я находил, а вот с 3 или более нет.
Как "ловить" нажатие кнопок так понимаю есть несколько вариантов, прерывания и проверка битов в цыкле маин.
Конечно хотелось бы сделать прерыванием, но я так понял что есть только 2 прерывания int0 и int1, т.е для 2х кнопок.
Вот тут прошу совета, т.к плохо представляю этот этап себе.
Когда разберусь с этим этапом думаю дальше будет двигаться легче.
- Реклама
Re: Mega16 Часы. Концепция начала.
проверка портов в цикле при работе с кнопками будет нормальным решением
имхо прикрутите к проекту часы реального времени, что позволит заодно изучить и I2C.
имхо прикрутите к проекту часы реального времени, что позволит заодно изучить и I2C.
-
borys
- Держит паяльник хвостом
- Сообщения: 927
- Зарегистрирован: Вт сен 07, 2010 19:27:48
- Откуда: Ташкент
Re: Mega16 Часы. Концепция начала.
Делать все это будет удобно на отладочной плате FastAVR.
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
Всем привет.
Сделал меню, пока без функционала.
Я пока все делаю в протеусе, и тут возникла проблема. При нажатии клавиши код отвечающий за обработку этой клавиши так понимаю выполняетса несколько раз. Т.е понимаю это есть дребезг контактов ? Я думал что этот негативный эффект будет только на реальной плате а не в протеусе.
Сейчас начинаю делать часы для субменю ">часы".
Вот код:

Сделал меню, пока без функционала.
Я пока все делаю в протеусе, и тут возникла проблема. При нажатии клавиши код отвечающий за обработку этой клавиши так понимаю выполняетса несколько раз. Т.е понимаю это есть дребезг контактов ? Я думал что этот негативный эффект будет только на реальной плате а не в протеусе.
Сейчас начинаю делать часы для субменю ">часы".
Вот код:
Код: Выделить всё
/*****************************************************
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;
}
}
}

-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
Подскажите пожалуйста как вывести числовую переменную в символ ?
вроде бы itoa этим занимается, но как именно не найду
Это нужно для отображения времени на лсд. или подскажите как сделать подругому, может быть есть варианты
вроде бы itoa этим занимается, но как именно не найду
Это нужно для отображения времени на лсд. или подскажите как сделать подругому, может быть есть варианты
- Реклама
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
Удалось запустить таймер2.
Теперь секунды тикаю и минуты и часы )
использовал такой формат для вывода sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
ребят подскажите как сделать курсор мигающим ?
нашел вот сдесь в таблице http://avrlab.com/node/80 флаг отвечающий за это, а как установить этот флаг незнаю
Теперь секунды тикаю и минуты и часы )
использовал такой формат для вывода sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);
ребят подскажите как сделать курсор мигающим ?
нашел вот сдесь в таблице http://avrlab.com/node/80 флаг отвечающий за это, а как установить этот флаг незнаю
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
понял что мерцание курсора делаетса командой 00001111 но блин все перерыл непойму как в cvavr выполнить команду лсд 
ребят помогите пожлста, вы меня как то не взлюбили с первого поста, прошу совета - молчание. вроде вежливо советы прошу
ребят помогите пожлста, вы меня как то не взлюбили с первого поста, прошу совета - молчание. вроде вежливо советы прошу
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Mega16 Часы. Концепция начала.
Их хелпа:
Взлюбили-взлюбили. Интересен сам процесс барахтанья.
Код: Выделить всё
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);
Взлюбили-взлюбили. Интересен сам процесс барахтанья.
Docendo discimus
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
версия 2.05.0 незнает функции _lcd_ready(), а без нее только с _lcd_write_data(0xe); работает но несовсем так как хотелось бы, вернее совсем нетак
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
о, сори, посмотрел в хелпе - там ненадо lcd_ready 
/* enables the displaying of the cursor */
_lcd_write_data(0xe);
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
pyzhman писал(а):Замигал?
Да, замигал, все огонь
только вот проблема возникла. подскажите пожлста как разложить число на десятки и единицы ?
это нужно для установки времени, т.е напримре курсор стоит под MM в первой позиции. т.е сейчас прибавляем либо убавляем десятки минут. есликурсор сдвинетса вправо то прибавляем либо убавляем единицы минут.
т.е по нажатию кнопки хочу разлочить число напр 58 на переменную 5 и 8, и уже их прибавлять/убавлять каждую отдельно, а потом сложить вместе и опять будет глобальная переменнаа минуты
можно конечно просто убавлять/прибавлять все число целиком не раскладывая его, но как то некрасиво поулчаетса тыкать сто раз до нужного значения, т.к часы минуты и секунды у меня целым числом идут а не раскладываютса на десятки и остатки
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Mega16 Часы. Концепция начала.
Не вижу смысла раскладывать. Если курсор в позиции десятков, то и прибавляем/отнимаем десятки, если в позиции единиц, то оперируем единицами.
Если уж приспичит раскладывать, то просто делим на 10. В результате будет количество десятков, в остатке единицы.
Если уж приспичит раскладывать, то просто делим на 10. В результате будет количество десятков, в остатке единицы.
Docendo discimus
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
ну вот после долгих мук получислоь сделать настройку часов. пока только в прибавление.
сейчас буду выносить лишний код в функции а то его много.
теперь осталось сделать уменьшение времени в настройке времени и занятса меню дата.
может быть есть у кого то небольшой кусочек кода работой с датой ? чтобы после тика суток расчитывал дни в месяце, месяцы и год и весокосный год, был бы благодарен
а так - смотрим. прикрепил протеус и cvavr
сейчас буду выносить лишний код в функции а то его много.
теперь осталось сделать уменьшение времени в настройке времени и занятса меню дата.
может быть есть у кого то небольшой кусочек кода работой с датой ? чтобы после тика суток расчитывал дни в месяце, месяцы и год и весокосный год, был бы благодарен
а так - смотрим. прикрепил протеус и cvavr
- Вложения
-
- my.rar
- cvavr 2.05.0 и ghjntec 7.7 sp2
- (122.46 КБ) 189 скачиваний
Последний раз редактировалось Roin Чт мар 01, 2012 19:17:06, всего редактировалось 1 раз.
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
pyzhman писал(а):Не вижу смысла раскладывать.
да, проше было бы ввести переменные десяток и единиц, но уже написано на разложении
-
Roin
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Пн фев 27, 2012 16:29:37
- Откуда: Бугульма
Re: Mega16 Часы. Концепция начала.
ну чтож, вот и закончил вроде.
смотрим оцениваем
смотрим оцениваем
- Вложения
-
- my.rar
- (141.38 КБ) 204 скачивания


