Назначение
индикатора
|
Анод
|
Код
разрешения
|
|
|
|
Десятки
часов
|
A1
|
00011111
|
|
|
|
Единицы
часов
|
A2
|
00101111
|
|
|
|
Десятки
минут
|
A3
|
00110111
|
|
|
|
Единицы
минут
|
A4
|
00111011
|
|
|
|
Десятки
секунд
|
A5
|
00111101
|
|
|
|
Единицы
секунд
|
A6
|
00111110
|
|
|
|
Примечание: старшие 2 бита используются для
управления индикаторами LH1, LH2 и в таблице равны 0.
3. Разработка программного обеспечения
Для написания и отладки программы была
использована интегрированная среда разработки IAR Embedded Workbench. В её
состав входит оптимизирующий C/C++ компилятор и все необходимые средства для
создания и отладки программ встроенных приложений на базе микроконтроллеров
семейства MSP430. Для отладки в реальном времени был также использован
отладочный комплект eZ430-F2013 [4]. Программа написана на языке С.
4. Разработка алгоритма программы
микроконтроллера
Алгоритм программы микроконтроллера состоит из
двух основных частей:
основной программы и прерывающей программы
таймера.
1. Основная программа (MAIN) осуществляет
начальную инициализацию и переводит процессор микроконтроллера в спящий режим,
при котором потребление минимально. Спящий режим прерывается запросом
прерывания от внутреннего таймера, поступающего через каждые 2 мс, подпрограмма
обслуживания которого и реализует все функции устройства.
2. Прерывающая программы таймера
(Int_Timer_A) реализует следующие функции:
· динамическая индикация (подпрограмма
Display вызывается через 2мс);
· опрос клавиатуры с защитой от
дребезга (подпрограмма KeyBScan вызывается через 2мс);
· ввод/редактирование времени таймера
(подпрограмма Servis_Key вызывается через 2мс);
· отсчет таймера (подпрограмма Timer
вызывается через 1 сек);
· выдача звукового сигнала в течение 5
секунд, при истечении времени таймера (подпрограмма Beep вызывается через 1
сек).
Р-схемы программ приведены на рис. 4.
Рис.4. Таймер на микроконтроллере MSP430.Р-схемы
1.
Семейство микроконтроллеров MSP430x2xx. Архитектура, программирование,
разработка приложений / пер. с англ. Евстифеева А.В. - М.: Додэка_XXI, 2010. -
544 с.: ил. - (Серия "Мировая электроника").
.
http://www.ti.com/lit/ds/symlink/msp430f2013.pdf
.
http://avrdevices.ru/sdvigovy-registr-74hc595/#more-478
.
http://www.ti.com/tool/ez430-f2013
микроконтроллерный таймер дисплей
программа
Приложение
Листинг программы
//-------------------------------------------------------------------
/*
Файл:
Автор: Егорова Екатерина Геннадьевна
Группа: РТЭ-11-08
Дата: 25.02.2012
Назначение: Таймер на микроконтроллере
MSP430F2013
*/
//-------------------------------------------------------------------
//-------------------- Библиотечные файлы
---------------------------
#include <msp430x20x3.h>
//------------------------- Сокращения
------------------------------
#define u_char unsigned char
#define u_int unsigned int
//----------- Константы, используемые в разных
программах -----------
#define NOT_DEFINE 0x99
#define KEY_MODE 0x01
#define KEY_UP 0x02
#define BOUNCE_TIME 20
#define TMR_2000MKS 1995
#define SW_Load 0x04
#define Power_On 0x10
#define fl_half_sec 0x01
#define blink_bit 0x02
#define REG_SHCP BIT5
#define REG_STCP BIT4
#define REG_DS BIT6
//begin
##############################################################_char hour_H; //десятки
часов
u_char hour_L; //единицы часов_char min_H;
//десятки минут_char min_L; //единицы минут_char sec_H; //десятки секунд_char
sec_L; //единицы секунд_char mode; //режим работы_char ct_2ms; //счетчик
интервала времени по 2 мс_char ct_beep; //счетчик интервала в сек. звучания
сигнала_char key; //исполнительный код кнопок_char cur_num; //номер текущей
отображаемой цифры_char cur_key; //номер текущего опроса кнопок_char prev_key;
//результат предыдущего опроса кнопок_char bounce_tmr; //счетчик для
программного исключения дребезга
u_char flags;A;_char value;_char
c;TBL_IMAGE[ ] = {
xC0, //0
xF9, //1
xA4, //2
xB0, //3
x99, //4
x92, //5
x82, //6
xF8, //7
x80, //8
0x90, //9
};
// таблица сигналов управления анодами 6 цифр
светодиодного дисплея
char TBL_COM[ ] = {
xFB, //А1
hour_H
xF7, //А2
hour_L
xEF, //А3
min_H
xDF, //А4
min_L
0xBF, //А5 sec_H
x7F //А6 sec_L
};TBL_LIGHT[ ] = {
x01, //загорается зеленый светодиод
x10 //загорается красный светодиод
};Servis_Key()
{(key)
{KEY_MODE:
{=NOT_DEFINE;++;(mode==7)
{=0;
}
};KEY_UP:
{=NOT_DEFINE;(mode==0)
{}
{_beep=0;DIR|=0x08;OUT|=0x08;(mode)
{1:
{_H=0;
}
};2:
{_L++;((hour_H>9)|((hour_H==2)&(hour_L>3)))
{_L=0;
}
};3:
{_H++;(min_H>5)
{_H=0;
}
};4:
{_L++;(min_L>9)
{_L=0;
}
};5:
{_H++;(sec_H>5)
{_H=0;
}
};6:
{_L=0;
};
}
}
};
}
}Keybscan()
{DIR &=
~0x07;=P1IN;(key&SW_Load==SW_Load)
{=TBL_LIGHT[0];
}_key=NOT_DEFINE;(key&KEY_MODE==KEY_MODE)
{_key=KEY_MODE;
}//ST1
{(key&KEY_UP==KEY_UP)
{_key=KEY_UP;
}goto ST2;
}:(bounce_tmr==BOUNCE_TIME) //ST2
{(cur_key==NOT_DEFINE)
{_tmr=0;_key=NOT_DEFINE;
}goto exitKS;
}//ST3
{(cur_key==NOT_DEFINE) //RESET_TMR
{_tmr=0;_key=NOT_DEFINE;
}//ST4
{(cur_key!=prev_key) //OTHER_KEY
{_tmr=0;_key=cur_key;
}
{_tmr++;
}(bounce_tmr==BOUNCE_TIME) //ST5
{=cur_key;
}goto exitKS;
}
}: {}
}Timer()
{(mode!=0)
{goto ExitTmr;}//Tmr1
{(sec_L!=0) {sec_L--;goto
ExitTmr;}//Tmr2
{(sec_H!=0) {sec_H--;sec_L=9;goto
ExitTmr;}//Tmr3
{(min_L+min_H+hour_L+hour_H==0)
{goto StopT;}///Tmr4
{_L=9;(min_L!=0)
{min_L--;sec_H=5;goto ExitTmr;}
{(min_H+hour_L+hour_H==0) {goto
StopT;} //Tmr5
{_H=5;(min_H!=0)
{_H--;_L=9;ExitTmr;
}
{(hour_L+hour_H==0) {goto StopT;}
//Tmr6
{_L=9;(hour_L!=0)
{_L--;_H=5;ExitTmr;
}
{(hour_H==0) {goto StopT;} //Tmr7
{_H=5;_H--;_L=9;ExitTmr;
}
}
}
}
}
}
}
}
}: //время
таймера
истекло(ct_beep==0)
{_beep=6;DIR|=0x08;OUT|=0x00;
}{}
if(SW_Load==0) //включение внешней нагрузки
{DIR|=Power_On;OUT|=0x00;
}//отключение внешней нагрузки
{DIR|=Power_On;
P1OUT|=Power_On;
}:{}
}Beep()
{(ct_beep)
{0: break;0x0FF: break; //Bp11:
{ct_beep=0x0FF; P1DIR|=0x08; P1OUT|=0x08;} break; //Bp2: ct_beep--; //Bp3
}
}init_spi(void){DIR |= 0x72; // P1
output|= USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI Master&= ~USISWRST;
// USI released for operation|=USI16B;|= USISSEL_2;OUT |=
(REG_SHCP)|(REG_STCP)|(REG_DS);;
}send_data(char data1,char data2){OUT
&= ~REG_STCP;=data1;=data2;= 16;(USICNT !=0);OUT |= REG_STCP;;
}Display()
{_num++;(cur_num>5)
{_num=0;
}(cur_num) //Dis2
{0: //Dig1
{((mode!=1)|(flags&blink_bit==blink_bit))
{A=hour_H; goto LoadDig;}
{goto ExitDspl;}
};1: //Dig2
{((mode!=2)|(flags&blink_bit==blink_bit))
{A=hour_L; goto LoadDig;}
{goto ExitDspl;}
};2: //Dig3
{((mode!=3)|(flags&blink_bit==blink_bit))
{A=min_H; goto LoadDig;}
{goto ExitDspl;}
};3: //Dig4
{((mode!=4)|(flags&blink_bit==blink_bit))
{A=min_L;goto LoadDig;}
{goto ExitDspl;}
};4: //Dig5
{((mode!=5)|(flags&blink_bit==blink_bit))
{A=sec_H;goto LoadDig;}
{goto ExitDspl;}
};5: //Dig6
{((mode!=6)|(flags&blink_bit==blink_bit))
{A=sec_L;goto LoadDig;}
{goto ExitDspl;}
};
}:
{_data(TBL_IMAGE[A],TBL_COM[cur_num]&value);
}:{}
}main(void)
{=0;_H=0;_L=0;_H=0;_L=0;_H=0;_L=0;_2ms=0;_beep=0;&=~fl_half_sec;DIR|=0x16;=
WDTPW + WDTHOLD;_spi();=NOT_DEFINE;
CCTL0 = CCIE; // разрешение прерывания от CCR0
TACTL = TASSEL_1 + MC_1 + TACLR; // тактирование
от
ACLK, upmode, clear TAP
CCR0 = TMR_2000MKS; // start timer
_BIS_SR(LPM0_bits + GIE); // разрешение
глобальных прерываний и перевод в режим пониженного энергопотребления
}
// обслуживание прерывания по таймеру Timer A0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{(); //зажигаем
очередную
цифру();
//опрос
клавиатуры_Key();_2ms++;((ct_2ms!=250)|(ct_2ms!=125))
{}//ms250
{^=blink_bit;(ct_2ms==250) //ms500
{_2ms=0;^=fl_half_sec;(flags&fl_half_sec==fl_half_sec)
{}//
{();();
}
}
}