[an error occurred while processing this directive]
:)))
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Михаил Е. 05 февраля 2006 г. 00:17
В ответ на: Кнопки висят на разных портах подтянутых к питанию, кнопка нажатием соединяет порт с землей. отправлено <font color=gray>eXeC001er</font> 04 февраля 2006 г. 23:36

__flash char InputTime[] = // величина задержки для защиты от дребезга входов
{
100, 100, 100, 100, 100, 100, 100, 100,
100, 100, 100, 100, 100, 100, 100, 100,
100, 100, 100, 100, 2, 2, 100, 100
};
//***************************************************
//* Обработка входов *
//***************************************************
class Input: public Baseclass
{
public:
Input();
Input& operator [] (char n) { index = n; return *this; }
operator char () { return Char(); }
char operator ! () { if(Char()) return 0; else return 1; }
private:
void IfChange(); // фоновый режим
bool GetEvent(const Event,unsigned char x=0,void *Tag=0); // обработка событий
char *InputPtr; // указатель на входной буфер UART1
volatile char FrameOfExpansion; // принят пакет от плат расширения
unsigned long CurrentInput; // текущее состояние входов
volatile uint48 Input48; // сост. входов всех плат с учетом дребезга
char TimeInput[24]; // подсчет времени для подавления дребезга по 24 входам
volatile char step; // последовательность запросов по UART1
volatile char flag; // признак "пора посылать пакет"
char index;
char Char();
};
//************** Конструктор ************************
Input::Input()
{
flag = 0; // признак "пора передавать запрос по UART1"
step = 0;
FrameOfExpansion = 0; // признак "принят пакет по UART1"
for(char i=0;i TimeInput[i] = InputTime[i]>>1; // в среднее положение
}
//***************************************************
char Input::Char()
{
if(index<=23) // в главной плате
{
if(Input48.int48.main & (1ul< }
if(index<=31) // в плате Expansion
{
if(Input48.int48.Ex1 & (1<<(index-24))) return 1; else return 0;
}
if(index<=47) // в плате Exp16x16
{
if(Input48.int48.Ex2 & (1<<(index-32))) return 1; else return 0;
}
return 0xff;
}
//***************************************************
bool Input::GetEvent(Event n,unsigned char x,void *Ptr)
{
switch (n)
{
case Time_1s: // системные
case Time_1ms: // метки времени
// ************* Проверка входов *************
for(char i=0;i {
if(CurrentInput&(1ul< {
if(TimeInput[i] else Input48.int48.main |= 1ul< }
else // если вход = 0
{
if(TimeInput[i]) TimeInput[i]--; // не достиг времени срабатывания
else Input48.int48.main &= ~(1ul< }
}
return ContinueEvent; // конец обработки
case FrameOfUART1: // принят фрейм от индикатора
if(((char*)Ptr)[1]!=4) return ContinueEvent; // если не чтение входов, выход
if(FrameOfExpansion) return ContinueEvent; // не закончена обработка предыдущего
InputPtr = (char*)Ptr; // указатель на входной буфер UART1
FrameOfExpansion = 1; // признак - принят пакет
return StopEvent; // конец обработки
case SendUart: // запрос на получение входов по UART 1
if(flag||(x>2)) return ContinueEvent; // не закончена обработка предыдущего
flag = 1; // признак запроса
step = x; // номер(тип) запроса
return StopEvent; // конец обработки
}
return ContinueEvent; // продолжать обработку
}
//************** Фоновая обработка ******************
void Input::IfChange()
{
char *ptr; // указатель буфера UART1
if(flag) // пора посылать запрос по UART1
{
ptr = &Uart1; // установить указатель на выходной буфер UART1
switch (step) // тип пакета
{
case 0: break; // пустая операция
case 1: // чтение входов на плате расширения 1 (Expansion)
*ptr++ = 1; // № контроллера
*ptr++ = 4; // функция 4 - чтение входов
*ptr++ = 0; // начальный адрес регистров ст.
*ptr++ = 0x1c; // начальный адрес регистров мл.
*ptr++ = 0; // кол-во регистров ст.
*ptr++ = 1; // кол-во регистров мл.
SendEvent(WriteUART1,6); // передать по RS485 6 байт
step = 0;
break;
case 2: // чтение входов на плате расширения 2 (Exp16x16)
*ptr++ = 2; // № контроллера
*ptr++ = 4; // функция 4 - чтение входов
*ptr++ = 0; // начальный адрес регистров ст.
*ptr++ = 0x1c; // начальный адрес регистров мл.
*ptr++ = 0; // кол-во регистров ст.
*ptr++ = 1; // кол-во регистров мл.
SendEvent(WriteUART1,6); // передать по RS485 6 байт
step = 0;
break;
}
flag = 0;
}
if(FrameOfExpansion) // принят пакет от плат расширения
{
ptr = InputPtr; // установить указатель на принятый фрейм
switch (*ptr++) // адрес ответившего контроллера
{
case 1: // чтение входов платы расширения 1 (Expansion)
ptr++; // код операции уже проверен, игнорируем
if(*(ptr++)!=2) break; // неправильная длина, выход
ptr++; // старший байт игнорируем
Input48.int48.Ex1 = ~(*ptr++); // младший байт - состояние входов
break;
case 2: // плата расширения 2 (Exp16x16)
ptr++; // код операции уже проверен, игнорируем
if(*(ptr++)!=2) break; // неправильная длина, выход
Input48.int8[1] = ~(*ptr++); // старший байт - состояние входов
Input48.int8[2] = ~(*ptr++); // младший байт - состояние входов
break; // выход
}
FrameOfExpansion = 0;
}
CurrentInput = Spi; // взять текущее состояние входов
}
//***************** Создаем объект ******************
Input input128;
//***************************************************


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru