Счетчик И Часы На Atmega

16-11-2012, 11:42 От: admin Посмотрели: 1005
Добрый вечер, получил задание на курсовик. Собрать схему на МК в которой будет выводится текущее время, и производится подсчет нажатий кнопок, и так же выводится на экран, раз в сутки счетчик обнуляется.



Схема нужна самая простецкая, отдельнай микросхема часов не нужна, это курсовая, поискал в интернете ,

покурил форумы, сайты для начинающих. На одном из сайтов нашел обучающую статью по  реализации часов на МК Atmel.



Там же  есть проекты для CodeVisionAVR и Proteus.



Я их скачал стал доделывать под свой курсовик. Но не все понятно с кодом в CodeVisionAVR.

Там же на форуме создал тему с просьбой помочь. Но форум там какой то малопосещаемый.

Поэтому проще помощи еще и здесь.

Продублирую пост оттуда.







Цитата


Объясните что нужно добавить дополнительно в код для реализации и вывода простого счетчика на экран, счетчик должен суммировать нажатия на кнопки, раз в 00.00 обнулятся.

Счетчик И Часы На Atmega

Скачал два проекта для CodeVisionAVR и для Proteus.

В протеус изменил немного входы кнопок.

На картинке выше видно.

Дальше до каких изменений в коде я дошел самостоятельно.



buttons.h


Spoiler
//***************************************************************************

//

//  Author(s)...: Pashgan http://ChipEnable.Ru

//

//  Target(s)...: любой микроконтроллер

//

//  Compiler....: CodeVision

//

//  Description.: драйвер 4-ех кнопочного джойстика

//

//  Data........: 25.10.09

//

//***************************************************************************

#ifndef BUTTONS_h

#define BUTTONS_h



#include <mega8535.h>

#include "event-system.h"

#include "list_event.h"



//порт, к которому подключены кнопки

#define PORT_BUTTON  PORTB

#define PIN_BUTTON  PINB

#define DDRX_BUTTON  DDRB



//номера выводов, к которым подключены кнопки

#define DOWN  6

#define UP 5

#define ENTER  4

#define LINE1  0

#define LINE2  1

#define LINE3  2

#define LINE4  3




//сколько циклов опроса кнопка должна удерживаться

#define THRESHOLD 5

/**************************************************************************

*   Function name : BUT_Init

*   Returns :    нет

*   Parameters : нет

*   Purpose :    инициализация портов ввода/вывода

*    вызывается обычно в начале main`a

****************************************************************************/

void BUT_Init(void);



/**************************************************************************

*   Function name : BUT_Debrief

*   Returns :    нет

*   Parameters : нет

*   Purpose :    опрашивает кнопки. вызывается обычно из прерывания

*    если кнопка нажата в течении 20 прерываний,

*    ее номер записывается в буфер

****************************************************************************/

void BUT_Debrief(void);



#endif //BUTTONS_H

</CODE>




buttons.c




Spoiler
#include "buttons.h"



#define MASK_BUTTONS   ((1<<DOWN)|(1<<UP)|(1<<ENTER)|(1<<LINE1)|(1<<LINE2)|(1<<LINE3)|(1<<LINE4))

#define ClearBit(reg, bit)   (reg) &= (~(1<<(bit)))

#define SetBit(reg, bit) (reg) |= (1<<(bit))

#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0)

#define BitIsSet(reg, bit)   ((reg & (1<<(bit))) != 0)



unsigned char comp = 0;



//_______________________________________

void BUT_Init(void)

{

  DDRX_BUTTON &= ~(MASK_BUTTONS);

  PORT_BUTTON |= MASK_BUTTONS;

}



//_______________________________________

void BUT_Debrief(void)

{

unsigned char key = 0;



  //последовательный опрос выводов мк

  if (BitIsClear(PIN_BUTTON, UP))

key = EVENT_KEY_UP;

  else if (BitIsClear(PIN_BUTTON, DOWN))

key = EVENT_KEY_DOWN;

  else if (BitIsClear(PIN_BUTTON, ENTER))

key = EVENT_KEY_ENTER;

else if (BitIsClear(PIN_BUTTON, LINE1))

key = EVENT_KEY_LINE;

else if (BitIsClear(PIN_BUTTON, LINE2))

key = EVENT_KEY_LINE;

else if (BitIsClear(PIN_BUTTON, LINE3))

key = EVENT_KEY_LINE;

else if (BitIsClear(PIN_BUTTON, LINE4))

key = EVENT_KEY_LINE;


  else {

key = EVENT_NULL;

  }



  //если во временной переменной что-то есть

  if (key) {

//и если кнопка удерживается долго

//записать ее номер в буфер

if (comp == THRESHOLD) {

  comp = THRESHOLD+10;

  ES_PlaceEvent(key);

  return;

}

else{

  if (comp < (THRESHOLD+5)){ comp++;}

}



  }

  else comp=0;

}




Добавил соответственно новое событие в файле list_event.h




Spoiler
#ifndef EVENT_LIST_H

#define EVENT_LIST_H



//коды событий

#define EVENT_NULL   0

#define EVENT_KEY_UP 1

#define EVENT_KEY_DOWN   2

#define EVENT_KEY_ENTER 3

#define EVENT_SYS_TIMER 4

#define EVENT_KEY_LINE   5





//коды состояний

#define STATE_NO_CHANGE 0

#define STATE_NORMAL 1

#define STATE_SET_HOUR   2

#define STATE_SET_MINUTE 3



#define NULL (void *)0



#endif //EVENT_LIST_H




Добавил строчку в событийную таблицу в файле event_system.c


Spoiler
//***************************************************************************

//

//  Author(s)...: Pashgan http://ChipEnable.Ru  

//

//  Target(s)...: любой микроконтроллер mega

//

//  Compiler....: CodeVision

//

//  Description.: Заготовка для событийной системы на таблицах

//

//  Data........: 26.11.10

//

//***************************************************************************

#include "event-system.h"



//кольцевой буфер

static volatile unsigned char cycleBuf[SIZE_BUF];

static volatile unsigned char tailBuf = 0;

static volatile unsigned char headBuf = 0;

static volatile unsigned char countBuf = 0;



//взять событие

unsigned char ES_GetEvent(void)

{

  unsigned char event;

  if (countBuf > 0){ //если приемный буфер не пустой  

event = cycleBuf[headBuf];   //считать из него событие

countBuf--; //уменьшить счетчик

headBuf++;   //инкрементировать индекс головы буфера  

if (headBuf == SIZE_BUF) headBuf = 0;

return event; //вернуть событие

  }

  return 0;

}



//положить событие

void ES_PlaceEvent(unsigned char event)

{

  if (countBuf < SIZE_BUF){ //если в буфере еще есть место

  cycleBuf[tailBuf] = event;    //кинуть событие в буфер

  tailBuf++;    //увеличить индекс хвоста буфера

  if (tailBuf == SIZE_BUF) tailBuf = 0;  

  countBuf++;   //увеличить счетчик

  }

}



//*****************************************************************************



volatile unsigned char currentState = 0;



__flash struct ROW_TABLE

{

unsigned char state;    //состояние

unsigned char event;    //событие

unsigned char nextState;    //следующее состояние

void (*pStateFunc)(void);   

};



void ES_Init(void)

{

  tailBuf = 0;

  headBuf = 0;

  countBuf = 0;

  currentState = STATE_NORMAL;

}



void EmptyFunc(void)

{

}



__flash struct ROW_TABLE table[] = {

//  STATE EVENT NEXT STATE   STATE_FUNC

{STATE_NORMAL,    EVENT_KEY_ENTER,    STATE_SET_HOUR, GUI_SelectHour},

{STATE_NORMAL,    EVENT_SYS_TIMER,    STATE_NO_CHANGE, GUI_ChangeTime},

   {STATE_NORMAL,    EVENT_KEY_LINE,    STATE_NO_CHANGE, GUI_ChangeTime},





{STATE_SET_HOUR, EVENT_KEY_ENTER,    STATE_SET_MINUTE,    GUI_SelectMinute},

{STATE_SET_HOUR, EVENT_KEY_UP,   STATE_NO_CHANGE, GUI_IncHour},

{STATE_SET_HOUR, EVENT_KEY_DOWN, STATE_NO_CHANGE, GUI_DecHour},



{STATE_SET_MINUTE,   EVENT_KEY_ENTER,    STATE_NORMAL,    GUI_General},

{STATE_SET_MINUTE,   EVENT_KEY_UP,   STATE_NO_CHANGE, GUI_IncMinute},

{STATE_SET_MINUTE,   EVENT_KEY_DOWN, STATE_NO_CHANGE, GUI_DecMinute},



{ 0, 0,    0,    EmptyFunc}

};





void ES_Dispatch(unsigned char currentEvent)

{

unsigned char i;



for (i=0; table[i].state; i++){

if (table[i].state == currentState && table[i].event == currentEvent){

  if (table[i].nextState != STATE_NO_CHANGE){

  currentState = table[i].nextState;

  }

  table[i].pStateFunc();

  break;

}

}

}




Дальше делать увеличение счетчика в этом же обработчике GUI_ChangeTime , или правильнее создать свой??

Тут я встал. Не хватает знаний. Усиленно курю третий день форумы. Нужна помощь. Могу неправильно изъясняться , новичок еще.



Ну или может тут чересчур навороченая реализация счетчика и часов, можно проще сделать, как?

Прощу помощи.



Если ссылки на другие ресурсы запрещены, то удалю. Это не реклама. Спасибо.
Раздел: Школьникам и студентам

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Счетчик И Часы На Atmega все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба

Добавление комментария

Ваше имя:*
E-Mail:*
Текст:
Вопрос:
Решите уравнения x+2x=789
Ответ:*
Введите два слова, показанных на изображении:



Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031