Добрый вечер, получил задание на курсовик. Собрать схему на МК в которой будет выводится текущее время, и производится подсчет нажатий кнопок, и так же выводится на экран, раз в сутки счетчик обнуляется.
Схема нужна самая простецкая, отдельнай микросхема часов не нужна, это курсовая, поискал в интернете ,
покурил форумы, сайты для начинающих. На одном из сайтов нашел обучающую статью по реализации часов на МК Atmel.
Там же есть проекты для CodeVisionAVR и Proteus.
Я их скачал стал доделывать под свой курсовик. Но не все понятно с кодом в CodeVisionAVR.
Там же на форуме создал тему с просьбой помочь. Но форум там какой то малопосещаемый.
Поэтому проще помощи еще и здесь.
Продублирую пост оттуда.
Объясните что нужно добавить дополнительно в код для реализации и вывода простого счетчика на экран, счетчик должен суммировать нажатия на кнопки, раз в 00.00 обнулятся.
Скачал два проекта для CodeVisionAVR и для Proteus.
В протеус изменил немного входы кнопок.
На картинке выше видно.
Дальше до каких изменений в коде я дошел самостоятельно.
buttons.h
Spoiler
buttons.c
Spoiler
Добавил соответственно новое событие в файле list_event.h
Spoiler
Добавил строчку в событийную таблицу в файле event_system.c
Spoiler
Дальше делать увеличение счетчика в этом же обработчике GUI_ChangeTime , или правильнее создать свой??
Тут я встал. Не хватает знаний. Усиленно курю третий день форумы. Нужна помощь. Могу неправильно изъясняться , новичок еще.
Ну или может тут чересчур навороченая реализация счетчика и часов, можно проще сделать, как?
Прощу помощи.
Если ссылки на другие ресурсы запрещены, то удалю. Это не реклама. Спасибо.
Раздел: Школьникам и студентам
Схема нужна самая простецкая, отдельнай микросхема часов не нужна, это курсовая, поискал в интернете ,
покурил форумы, сайты для начинающих. На одном из сайтов нашел обучающую статью по реализации часов на МК Atmel.
Там же есть проекты для CodeVisionAVR и Proteus.
Я их скачал стал доделывать под свой курсовик. Но не все понятно с кодом в CodeVisionAVR.
Там же на форуме создал тему с просьбой помочь. Но форум там какой то малопосещаемый.
Поэтому проще помощи еще и здесь.
Продублирую пост оттуда.
Цитата
Объясните что нужно добавить дополнительно в код для реализации и вывода простого счетчика на экран, счетчик должен суммировать нажатия на кнопки, раз в 00.00 обнулятся.
Скачал два проекта для 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>
//
// 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;
}
#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
#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;
}
}
}
//
// 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 , или правильнее создать свой??
Тут я встал. Не хватает знаний. Усиленно курю третий день форумы. Нужна помощь. Могу неправильно изъясняться , новичок еще.
Ну или может тут чересчур навороченая реализация счетчика и часов, можно проще сделать, как?
Прощу помощи.
Если ссылки на другие ресурсы запрещены, то удалю. Это не реклама. Спасибо.
Раздел: Школьникам и студентам