Для Меги128
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Михаил Е. 03 декабря 2004 г. 18:43
В ответ на: Ответ: отправлено Михаил Е. 03 декабря 2004 г. 18:31

GetEvent - обработка прерываний, точнее системных событий.
Переменная status - шаги.




#define Tin PINE_.bit.bit_3 // считывание из DS1820
#define DirT DDRE_.bit.bit_3 // направление
#define Tout PORTE_.bit.bit_3 // запись в DS1820
//***************************************************
//* DS1820 *
//***************************************************
class DS1820: public Baseclass
{
public:
signed char TBoard;
DS1820() { Tout = 1; DirT = 0; InputByte = WorkStatus = time = status = 0; };
private:
bool GetEvent(const Event,unsigned char x=0,void *Tag=0);
char InputByte; // принятый байт
volatile char status; // текущее состояние 1-wire
volatile char WorkStatus; // текущее состояние init
volatile char time; // отсчет времени между измерениями
void init();
void sendbyte(char);
void getbyte();
int temp; // временное хранение температуры
};
//***************** Сброс DS1820 ********************
void DS1820::init()
{
switch (WorkStatus)
{
case 0: DirT = 1; // выход
Tout = 0; // init
WorkStatus++; break;
case 1: DirT = 0; // вход
Tout = 1; // pullup
WorkStatus++; break;
case 2: WorkStatus = 0; status++; break;
}
}
//***************** Послать байт ********************
void DS1820::sendbyte(char x)
{
if(WorkStatus==0) DirT = 1; // выход
if(x&(1<<WorkStatus)) // если == 1
{
__disable_interrupt(); // запретить прерывания
Tout = 0; // выход = 0
__delay_cycles(80l); // 5 мксек. задержка
Tout = 1; // выход = 1
__enable_interrupt(); // разрешить вложенные прерывания
}
else // если == 0
{
__disable_interrupt(); // запретить прерывания
Tout = 0; // выход = 0
__delay_cycles(1440l); // 90 мксек. задержка
Tout = 1; // выход = 1
__enable_interrupt(); // разрешить вложенные прерывания
}
if(WorkStatus<7) WorkStatus++;
else
{
WorkStatus = 0; // исх. состояние
status++; // след. состояние 1-wire
DirT = 0; // вход
}
}
//***************** Принять байт ********************
void DS1820::getbyte()
{
if(!WorkStatus) InputByte = 0;
__disable_interrupt(); // запретить прерывания
DirT = 1; // выход
Tout = 0; // выход = 0
__delay_cycles(80l); // 5 мксек. задержка
Tout = 1; // выход = 1
DirT = 0; // вход
__delay_cycles(128l); // 8 мксек. задержка
if(Tin) InputByte |= 1<<WorkStatus; // принята 1
if(WorkStatus<7) WorkStatus++;
else
{
WorkStatus = 0; // исх. состояние
status++;
}
__enable_interrupt(); // разрешить вложенные прерывания
}
//***************************************************
bool DS1820::GetEvent(Event n,unsigned char,void *)
{
switch (n)
{
case Time_1s: if(time) time--;
case Time_1ms:
switch (status) // пересылки по 1-wire
{
case 0: init(); break;
case 1: time = 10; status++; // 10 сек. на измерение
case 2: sendbyte(0xcc); break; // команда Skip ROM
case 3: sendbyte(0x44); break; // команда начать измерение
case 4: getbyte(); break;
case 5: if((InputByte&1)==1) { status++; break; } // если конец преобразования
if(!time) { WorkStatus = status = 0; break; } // если истекло 10 сек., перезапуск
else status = 4; break;
case 6: init(); break;
case 7: sendbyte(0xcc); break; // команда Skip ROM
case 8: sendbyte(0xbe); break; // команда чтение регистров
case 9: getbyte(); temp = InputByte; break;
case 10: getbyte(); temp |= (InputByte<<8); break;
case 11: temp++; temp >>= 1; // округляем, отбрасываем младш. бит
TBoard = temp&0xff; WorkStatus = status = 0; break;
}
}
return ContinueEvent;
}
//***************** Создаем объект ******************
DS1820 ds1820;




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

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru