Текст программы прошивки
Измерение температуры. (версия 1)
//*********************ПРОЕКТ УМНЫЙ САД для MSP430G2553********************//
#include "io430.h" // подключение библиотеки
#include "stdio.h" // подключение библиотеки
//*******************Переменные********************************************//
unsigned int zakhvat = 1; // переменная для захвата при задержке
unsigned int izm_temp = 0x0000; // переменная измеренной температуры
unsigned int ThTl = 0x0000; // переменная критической темп
unsigned int config_temp = 0x007F; // конфигурация датчика температуры
//*************************************************************************************************************//
// команды темп. датчика: ССh-пропуск RОМ, 44h-конвертировать темп, 4Eh-запись Th,Tl,config в ОЗУ датч.(3байта),
// BEh-чтение памяти(4бата), 48h-копирование ОЗУ в ПЗУ датч., B8h-повторная загрузка из ПЗУ в ОЗУ датч.
//*************************************************************************************************************//
//********прерывание Timer0************************************************//
#pragma vector = TIMER0_A0_VECTOR // вектор прерывания таймера ТА0
__interrupt void Timer (void) // прерывание ТА0
{
TA0CTL = TACLR; // Выключаем таймерА0
zakhvat = 0; // обнуление переменной для выхода из задержки
}
//***********************подпрограмма задержки*****************************//
//реализация самой подпрограммы занимает время около 2мкс
void delay (int time)
{
TA0CCTL0 = CCIE; // разрешение прерывания ТА0
TA0CCR0 = time; // переменная времени, мкс
TA0CTL = MC0+TASSEL1+ID0+ID1; // Включаем и конфигурируем таймерА0
while (zakhvat); // цикл для захвата контроллера
zakhvat = 1; // возврат переменной захвата
}
//***********************подпрограмма управления реле*********************//
void K1 (int SOST) // объявление подпрограммы реле К1
{
if (SOST == 1){P1OUT |= 0x0020;} // если SOST=1 реле К1 вкл
else {P1OUT &= ~0x0020;} // если же нет реле К1 выкл
}
void K23 (int SOST) // объявление подпрограммы реле К23
{
if (SOST == 1){P1OUT |= 0x0040;} // если SOST=1 реле К23 вкл
else {P1OUT &= ~0x0040;} // если же нет реле К23 выкл
}
void K4 (int SOST) // объявление подпрограммы реле К4
{
if (SOST == 1){P1OUT |= 0x0080;} // если SOST=1 реле К4 вкл
else {P1OUT &= ~0x0080;} // если же нет реле К4 выкл
}
//**************подпрограмма отправки команд в датчик*********************//
void write_TBute (int imp_sr, int data)
{
unsigned int nBit = 8; // переменная цикла отправки
unsigned int nSdvig = 0; // переменная выборки бита
//unsigned int otv_ImPR = 0; // переменная
if (imp_sr == 1) // если нужно отправить импульс сброса
{
P1DIR |= 0x0010; // порт датчика на выход
P1OUT &= ~0x0010; // ноль в порт датчика
delay(480); // задержка 480мкс
P1OUT |= 0x0010; // единица в порт датчика
P1DIR &= ~0x0010; // порт датчика на вход
delay(200); // задержка 200мкс
//if((P1IN & 0x0010) == 0x0010){otv_IPR = 1;}// если был импульс присутствия
delay(280); // задержка 280мкс
}
//if(){}
P1DIR |= 0x0010; // порт датчика на выход
while (nBit) // цикл записи команды
{
P1OUT &= ~0x0010; // ноль в порт датчика
delay(2); // задержка 2мкс
if ((data&(0x0001<<nSdvig))==(0x0001<<nSdvig)){P1OUT |= 0x0010;}// если передаем единицу то на порт датчика единица
delay(58); // задержка 58мкс
P1OUT |= 0x0010; // окончание слота записи(единица в порт датчика)
nSdvig++; // инкремент выборки бита команды
nBit--; // декремент цикла отправки команды
delay(2); // время восстановления датчика
}
P1DIR &= ~0x0010; // порт датчика на вход
}
//*************Считать регистры памяти датчика темп***********************//
void read_mem (void)
{
unsigned int nBit; // переменная цикла отправки
unsigned int nSdvig; // переменная выборки бита
write_TBute(1,0xCC); // запись команды
write_TBute(0,0xBE); // запись команды
// чтение данных (4байта)
nBit = 32; // переменная цикла приема
nSdvig = 0; // переменная выборки бита
P1DIR |= 0x0010; // порт датчика на выход
while (nBit) // цикл записи команды 0хBE
{
P1OUT &= ~0x0010; // ноль в порт датчика
delay(2); // задержка 2мкс
P1DIR &= ~0x0010; // порт датчика на вход
delay(15); // задержка 15мкс
if (nBit>=17) {izm_temp |= (((P1IN&0x10)>>4)<<nSdvig);}// опрос порта датчика
if (nBit<=16) {ThTl |= (((P1IN&0x10)>>4)<<nSdvig);}// опрос порта датчика
delay(45); // задержка 45мкс
P1OUT |= 0x0010; // единица в порт датчика
P1DIR |= 0x0010; // порт датчика на выход
nBit--; // декремент цикла приема
nSdvig++; // инкремент выборки бита
delay(2); // задержка 2мкс
}
// импульс сброса
P1OUT &= ~0x0010; // ноль в порт датчика
delay(480); // задержка 480мкс
P1OUT |= 0x0010; // единица в порт датчикa
P1DIR &= ~0x0010; // порт датчика на вход
}
//****************основная программа***************************************//
int main (void)
{
//********конфигцрация процессора******************************************//
WDTCTL = WDTPW + WDTHOLD; // остановка сторожевого таймера
BCSCTL1 = CALBC1_8MHZ; // установка тактовой частоты 8МГц
DCOCTL = CALDCO_8MHZ; // установка тактовой частоты 8МГц
__enable_interrupt(); // Включенеие прерываний
//TA1CCR0 = 0x0030; // период совпадения ТА1(шим)
TA1CTL = MC1+TASSEL1; // вкл и конфигурация ТА1(необходима дополнительная конфигурация регистров сравнения и модуля вывода)
P2DIR &= ~0x0007; // Установка пинов клавиатуры на вход
P2OUT |= 0x0007; // тип подтяжки пинов клавиатуры VCC
P2REN |= 0x0007; // Включение подтяжки пинов клавиатуры
ADC10AE0 = 0x000F; // включаем А0-3 в Р1.0-1.3
P1OUT &= ~0x00E0; // обнуление пинов реле
P1DIR |= 0x00E0; // установка пинов реле на выход
P2SEL |= 0x0008; // установка на Р2.3 таймера ТА1
P2DIR |= 0x0008; // модуль совпадения ТА1 на Р2.3
P1OUT |= 0x0010; // пин 1Wire на плюс (предустановка)
P1DIR &= ~0x0010; // пин 1Wire на вход (на пине подтяжка на +) (предустановка)(FFEF)
//****************основной цикл********************************************//
while (1)
{
}
}
//*************************************************************************//
|