3.2 Проектирование процедур управления периферийными устройствами
Разрабатываемое устройство выполняет следующие операции:
a. Запрос текущей температуры
b. Обработка полученной информации.
#define ENABLE_BIT_DEFINITIONS
#include <tiny2313.h>
#include "ctype.h"
#include "stdlib.h"
#define PrescalerTmr0 4 // timer0 counts clk/256
// OscFrq 7342800 osc frequency in Hz
// OscPeriod 1/OscFrq * 1000000000 = 136.1878 osc Period in ns
//Tmr0ClkPeriod = OscPeriod*256 = 34864.07 Timer0 Clk Period in ns
//Tmr0_Interval = 1000000 timer0 overflow interval in ns (1ms=1000000ns)
//Tmr0_Ticks = Tmr0_Interval/Tmr0ClkPeriod = 28,68 timer0 steps for 1 ms delay
#define Tmr0_Reload 256 - 29 // timer0 Reload value for 1 ms
#define TOIE0 0
//==CircularBuffer
#define CircBufLen 32
unsigned char CircBuf[CircBufLen];
unsigned char CircBufHead = 0;
unsigned char CircBufTail = 0;
//==GlobalVariables
unsigned int Var2 = 0;
//==Declare external functions
void DisplayInit(void); // Инициализация индикатора
void SendDataToDisplay(unsigned char Data, unsigned char Mode);
//==Declare internal functionsunsigned char CircBufGet(void);
void CircBufPut (unsigned char data);
//==VirtualTimerVariables
unsigned char Tmr0Flag = 0;
unsigned char TmrCnt[2];
unsigned char TmrPreLoad[2];
unsigned char TmrFlag[2]={0,0};
//0 - timer disabled
//0x01 - timer is started and counting, not reloadable
//0x81 - counting, reloadable
//0x02 - ready, stopped
//0x83 - ready, reloaded, counting
3.3 Проектирование процедуры инициализации аппаратуры микроконтроллера
Процедура инициализации производит настройку: портов ввода/вывода, периферийных аппаратных устройств, а так же внешних устройств которые требуют инициализации.
//== Port Initialisation ===============
void Init(void)
{
DDRD = 0xf0; //PD3-PD0 as input
PORTD = 0xff; //Turn ON PullUP for PortB pins
DDRB = 0xff; //Port B pins as output
PORTB = 0x00;
}
//== Virtual Timer Initialisation ==========
void InitTimers(void)
{
#asm("cli");
TCCR0B=PrescalerTmr0;
TIMSK |= (1 << TOIE0); //Enable Timer0 Interrupt
TCNT0=Tmr0_Reload;
TmrPreLoad[0]=250;
TmrCnt[0]=250;
TmrFlag[1]=0x81;
TmrPreLoad[1]=10;
#asm("sei");
}
//=================================
char TimeDelay_us(char x) //near 1us time delay
{
char i,j,k,n;
j=1;
for (i=0;i<x;i++)
{
k=j+1;
n=k-j;
}
return n;
}
//== Circular Buffer Write =====================
void CircBufPut (unsigned char data)
{
unsigned char tmphead;
tmphead = CircBufHead + 1;
if (tmphead>=CircBufLen)
{
tmphead=0;
}
CircBuf[tmphead] = data;
CircBufHead = tmphead;
}
//== Circular Buffer Read ==========
unsigned char CircBufGet(void)
{
unsigned char tmptail;
if (CircBufHead != CircBufTail)
{
tmptail=CircBufTail+1;
if (tmptail>=CircBufLen)
{
tmptail=0;
}
CircBufTail = tmptail;
return CircBuf[tmptail];
}
else
{
return 0;
}
}
3.4 Инициализация цифрового термометра DS1620
char DS1620Init(void)
{
char Presence;
DDRD |= 0x20;
PORTD &= ~0x20;
TimeDelay_us(200);
TimeDelay_us(200);
TimeDelay_us(200);
DDRB &= ~0x10;
PORTB |= 0x10;
TimeDelay_us(20);
Presence = PIND & 0x10;
TimeDelay_us(200);
DDRD |= 0x20;
PORTD |= 0x20;
TimeDelay_us(200);
return Presence;
}
void DS1620WriteBit(char Value)
{
#asm("cli");
DDRD |= 0x20; //output 5
PORTD &= ~0x20;
TimeDelay_us(5);
if(Value!=0) //if data bit = H => output 5
{
PORTD |= 0x20;
}
TimeDelay_us(70);
PORTD |= 0x20; //output 5
TimeDelay_us(5);
#asm("sei");
}
void DS1620WriteByte(char data)
{
char loop, CurrentBit;
for (loop = 0; loop < 8; loop++) // Loop to write each bit in the byte, LS-bit first
{
CurrentBit = data & 0x01;
DS1620WriteBit(CurrentBit);
data >>= 1; // shift the data byte for the next bit
}
}
char DS1620ReadBit(void)
{
char Value;
#asm("cli");
DDRD |= 0x20; //output 5
PORTD &= ~0x20;
TimeDelay_us(5);
DDRD &= ~0x20; //input
PORTD |= 0x20;
TimeDelay_us(10);
Value = PIND & 0x20; //read bit
TimeDelay_us(55);
DDRD |= 0x20; //output 5
PORTD |= 0x20;
TimeDelay_us(5);
#asm("sei");
return Value;
}
//==
char DS1620ReadByte(void)
{
char loop, result=0, CurrentBit;
for (loop = 0; loop < 8; loop++)
{
result >>= 1; // shift the result right to get it ready for the next bit
CurrentBit = DS1620ReadBit();
if (CurrentBit != 0) // if result is one, then set MS bit
{
result |= 0x80;
}
}
return result;
}
... выхода Windows 2000 NTFS постепенно становится все более и более популярной. Основные отличия от FAT32 - неограниченный размер файлов (до 12 TBytes) и возможность управлять правами доступа к файлам и каталогам. 2. УСОВЕРШЕНСТВОВАНИЕ СИСТЕМЫ РЕГУЛИРОВКИ ТЕМПЕРАТУРЫ ЖЕСТКОГО ДИСКА Все знают, если у человека повышается температура выше 36.6 градусов, значит он заболел. То же можно сказать и о ...
... среды; · расчет разности температур; · автоотключение; · индикатор разряда батареи; · подсветка дисплея; · питание 9 В («Крона»). 2 ОБОСНОВАНИЕ СПОСОБА ПОСТРОЕНИЯ ФУНКЦИОНАЛЬНОЙ СХЕМЫ УСТРОЙСТВА Функциональная схема устройства для измерения температуры в удаленных точках приведена на рис. 2.1. Устройство для измерения температуры в удаленных точках предназначенное для ...
... значительно облегчают процесс изучения контроллеров РІС и написание для них программ. В данном курсовом проекте реализована микропроцессорная система на базе микроконтроллера для терморегулятора аквариума. Проект основывается на микроконтроллере PIC16F84А. 1. Описание объекта и функциональная спецификация Устройство отличается от известных измерителей температуры на DS1820 возможностью ...
... 5 -7м ), что связано с увеличением площади устоев. 2.3. Определение мощности и выбор электродвигателя для электро- механического привода двустворчатых ворот судоходного шлюза. Электроприводы основных механизмов судоходных гидротехнических сооружений являются ответственными элементами электрооборудования шлюзов. Несоответствие выбранного привода технологическому режиму, неполный счет факторов, ...
0 комментариев