Mega16 Часы. Концепция начала.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Mega16 Часы. Концепция начала.

Сообщение Roin »

Здравствуйте. Я начинающий. Прошу ваших советов/подсказок. Заранее благодарен за любые мысли.
Есть тз:
- К микроконтроллеру подключен дисплей(любой) 16х2 (к каким портам - без разницы)
- К микроконтроллеру подключены 4 кнопки(влево вправо вниз вверх)(к каким портам - без разницы)
- Используя прерывание от таймера Timer2 реализовать работу часов
- На эран вывести меню вида:
>Время
Дата
При нажатиии в меню кнопки 'вниз' 'галка' перемещается ниже:
Время
>Дата
При нажатиии 'вверх' выше.
При нажатии 'Вправо' если 'галка' находится на 'Время' Вывести на экран текущее время вида ЧЧ:MM:СС

если нажать еще раз 'Вправо' -дается возможность редактировать текущее время:
под ЧЧ появляется курсор '_' и кнопками вверх-вниз можно изменять тек. значение
в данном режиме редактирования кнопкой далее происходит перемещение по редактируемым переменным и курсора по кольцу Ч->М->С->Ч->М->С..
Выходить из режима редактирования - кнопкой "Влево"

если 'галка' находится на 'Дата' Вывести тек дату ДД/ММ/ГГГГ
-//-//- редактирование аналогично


Как я планирую сделать это задание:
1. Делать решил в cvavr 2.05.0, эмуляция в протеусе.
2. Для себя решил, что для начала нужно попробовать просто вывести что то на экран. В cvavr выбрал lcd 16x2 к порту А, вывел тестовое сообщение - получилось.
3. Далее решил подключить 4 кнопки и так сказать "увидеть" их в коде. Т.е попытаться понять как работать с кнопками, например при нажатии каждой кнопки зажеч соответствующий это кнопке светодиод.
Вот сдесь затруднения. Примеры работы с одной и двумя кнопками я находил, а вот с 3 или более нет.

Как "ловить" нажатие кнопок так понимаю есть несколько вариантов, прерывания и проверка битов в цыкле маин.
Конечно хотелось бы сделать прерыванием, но я так понял что есть только 2 прерывания int0 и int1, т.е для 2х кнопок.
Вот тут прошу совета, т.к плохо представляю этот этап себе.

Когда разберусь с этим этапом думаю дальше будет двигаться легче.
Реклама
c717411
Встал на лапы
Сообщения: 148
Зарегистрирован: Ср дек 29, 2010 21:19:03

Re: Mega16 Часы. Концепция начала.

Сообщение c717411 »

проверка портов в цикле при работе с кнопками будет нормальным решением
имхо прикрутите к проекту часы реального времени, что позволит заодно изучить и I2C.
Реклама
borys
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Re: Mega16 Часы. Концепция начала.

Сообщение borys »

Делать все это будет удобно на отладочной плате FastAVR.
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение 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;
      }
    }
}


Изображение
Вложения
1.rar
проект в cvavr 2.05.0
(35.1 КБ) 203 скачивания
clock.rar
проект в протеусе 7.7 sp2
(28.56 КБ) 182 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

Подскажите пожалуйста как вывести числовую переменную в символ ?
вроде бы itoa этим занимается, но как именно не найду :(
Это нужно для отображения времени на лсд. или подскажите как сделать подругому, может быть есть варианты
Реклама
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

Удалось запустить таймер2.
Теперь секунды тикаю и минуты и часы )

использовал такой формат для вывода sprintf(buffer, "%02d:%02d:%02d",hour,min,sek);

ребят подскажите как сделать курсор мигающим ?
нашел вот сдесь в таблице http://avrlab.com/node/80 флаг отвечающий за это, а как установить этот флаг незнаю :(
Реклама
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

понял что мерцание курсора делаетса командой 00001111 но блин все перерыл непойму как в cvavr выполнить команду лсд :(
ребят помогите пожлста, вы меня как то не взлюбили с первого поста, прошу совета - молчание. вроде вежливо советы прошу
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Mega16 Часы. Концепция начала.

Сообщение 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);

Взлюбили-взлюбили. Интересен сам процесс барахтанья. :)
Docendo discimus
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

pyzhman писал(а):Их хелпа:

Код: Выделить всё

_lcd_ready();
_lcd_write_data(0xe);



версия 2.05.0 незнает функции _lcd_ready(), а без нее только с _lcd_write_data(0xe); работает но несовсем так как хотелось бы, вернее совсем нетак :)
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

о, сори, посмотрел в хелпе - там ненадо lcd_ready :)
/* enables the displaying of the cursor */
_lcd_write_data(0xe);
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Mega16 Часы. Концепция начала.

Сообщение pyzhman »

Замигал?
Docendo discimus
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

pyzhman писал(а):Замигал?

Да, замигал, все огонь :)
только вот проблема возникла. подскажите пожлста как разложить число на десятки и единицы ?

это нужно для установки времени, т.е напримре курсор стоит под MM в первой позиции. т.е сейчас прибавляем либо убавляем десятки минут. есликурсор сдвинетса вправо то прибавляем либо убавляем единицы минут.

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

можно конечно просто убавлять/прибавлять все число целиком не раскладывая его, но как то некрасиво поулчаетса тыкать сто раз до нужного значения, т.к часы минуты и секунды у меня целым числом идут а не раскладываютса на десятки и остатки
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Mega16 Часы. Концепция начала.

Сообщение pyzhman »

Не вижу смысла раскладывать. Если курсор в позиции десятков, то и прибавляем/отнимаем десятки, если в позиции единиц, то оперируем единицами.
Если уж приспичит раскладывать, то просто делим на 10. В результате будет количество десятков, в остатке единицы.
Docendo discimus
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

ну вот после долгих мук получислоь сделать настройку часов. пока только в прибавление.
сейчас буду выносить лишний код в функции а то его много.

теперь осталось сделать уменьшение времени в настройке времени и занятса меню дата.
может быть есть у кого то небольшой кусочек кода работой с датой ? чтобы после тика суток расчитывал дни в месяце, месяцы и год и весокосный год, был бы благодарен :)

а так - смотрим. прикрепил протеус и 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 Часы. Концепция начала.

Сообщение Roin »

pyzhman писал(а):Не вижу смысла раскладывать.

да, проше было бы ввести переменные десяток и единиц, но уже написано на разложении :)
Roin
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн фев 27, 2012 16:29:37
Откуда: Бугульма

Re: Mega16 Часы. Концепция начала.

Сообщение Roin »

ну чтож, вот и закончил вроде.

смотрим оцениваем :)
Вложения
my.rar
(141.38 КБ) 204 скачивания
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»