Управления


 Программирование микроконтроллеров


Download 1.56 Mb.
Pdf ko'rish
bet19/22
Sana17.07.2023
Hajmi1.56 Mb.
#1660821
TuriУчебное пособие
1   ...   14   15   16   17   18   19   20   21   22
Bog'liq
ftd

5.2. Программирование микроконтроллеров 
Программирование микроконтроллеров является в большинстве случаев 
программированием систем реального времени. В программировании для сис-
тем реального времени различаются три типа программ [6]. Четкое различие 
между этими тремя типами должно быть сделано с самого начала. В системах, 
где это разделение не было установлено, часто дело кончалось неудачей. Рас-
смотрим эти три типа программ. 
1. Прикладные программы. Это программы, которые выполняют обработку 
записей или сообщений. Они соответствуют программам обработки данных в 
обычных системах и уникальны для каждой системы. Последовательности ко-


48 
манд ввода-вывода входят в них только в форме макрокоманд, передающих 
управление программе, управляющей вводом-выводом, или программе-
монитору, которая в рассматриваемых системах является частью управляющих 
программ. 
2. Управляющие программы. Эти программы координируют и распределяют 
во времени работу прикладных программ, а также выполняют служебные 
функции для них. Можно рассматривать прикладные программы как подпро-
граммы основной управляющей программы. Управляющие программы обраба-
тывают операции ввода и вывода и задают очередность сообщений и данных. 
Они должны координировать и оптимизировать функционирование ЭВМ в ус-
ловиях меняющихся нагрузок. Они обрабатывают прерывания, а также обеспе-
чивают работу при возникновении ошибок и аварийных ситуаций. 
3. Обеспечивающие программы. Принципиально работоспособная система 
состоит из прикладных и управляющих программ. Однако необходим еще тре-
тий набор программ для начального пуска системы и для поддержания ее нор-
мального функционирования. Эти программы называются обеспечивающими и 
включают средства отладки программ, программы генерации данных, средства 
моделирования оконечных устройств, диагностику и т.д. 
Прикладные программы подобны рабочим и механизмам на заводе, тогда 
как управляющие программы можно сравнить с административно-
управленческим персоналом, руководством и мастерами. Обеспечивающие же 
программы подобны группе, выполняющей профилактические работы, помо-
гающей устанавливать новый механизм и поддерживать машины в рабочем со-
стоянии. 
Различными организациями используются различные термины для опреде-
ления этих программ. Прикладные программы называются «операционными 
программами», «процессорами», «обычными процессорами» и т.д. Управляю-
щие программы называются «супервайзером», «диспетчером», «исполните-
лем», «монитором» и другими именами. Разнообразные термины используются 
также и для обеспечивающих программ. В дальнейшем будем использовать 
термины «прикладные», «управляющие» и «обеспечивающие» программы. 
Управляющие программы по возможности разрабатываются одной группой 
разработчиков и все вместе называются управляющей системой.
 
Для этого на-
бора программ должно быть написано руководство, которое программисты, ра-
ботающие над прикладными программами, обязаны изучить. В этом случае пе-
ред программистами стоит задача разработки программ не для обычной маши-
ны, а для машины, снабженной управляющей системой. В одних аспектах это 
упрощает их работу, в других ограничивает ее. Например, программисты огра-
ничены в использовании индексных регистров и оперативной памяти, но опе-
рации ввода-вывода уже запрограммированы и не требуют дополнительных за-
трат времени. 
Управляющие программы предоставляются изготовителем ЭВМ или разра-
батываются пользователем. Это достаточно сложные программы, и их разра-


49 
ботка для большой системы требует большого количества времени и опытных 
программистов. Они тесно связаны с техническими средствами. Более того, они 
должны быть четко определены до начала детальной проработки прикладных
программ. Поэтому предоставление этих программ пользователю дает ему зна-
чительные преимущества. Часто, однако, бывает необходимым «подогнать» их 
к определенным приложениям. Стандартизация управляющих программ для 
сложных систем реального времени затруднительна, и только часть из них мо-
жет быть составлена в виде стандартных блоков. 
У заказчика также может возникнуть необходимость в модификации управ-
ляющих программ. Если его система работает успешно, он, по всей вероятно-
сти, будет стремиться к расширению ее, если нет, то он пожелает изменить ее 
функционирование, что означает изменение в управляющих программах. 
Поэтому можно посоветовать, чтобы в группе программистов пользователя 
кто-либо полностью разобрался в том, как эти программы построены и закоди-
рованы. 
Различные виды прерываний находят широкое применение в системах ре-
ального времени. Например, прибытие нового сообщения от оператора удален-
ного оконечного устройства может прервать ту работу, которую ЭВМ выполня-
ет в этот момент, с тем, чтобы записать это сообщение в оперативную память. 
Конец поиска на устройстве внешнего ЗУ с произвольной выборкой вызывает 
прерывание, чтобы процессор мог начать чтение обнаруженной записи; и когда 
чтение заканчивается, опять возможно прерывание, чтобы процессору было из-
вестно, что запись можно использовать при обработке, а также что другая инст-
рукция может быть дана этому устройству, если есть очередь. Прерываться мо-
гут как управляющие, так и прикладные программы. Когда прерывание проис-
ходит, оно обслуживается программой высокого приоритета, которая обычно 
входит в управляющую систему. 
Когда причина прерывания обработана, управление обычно передается в 
точку, в которой прерывание произошло. Но возможны и случаи, когда в опре-
деленных обстоятельствах управление в эту точку не возвращается. Для того 
чтобы ЭВМ могла возобновить работу, которая выполнялась до момента воз-
никновения прерывания, программа более высокого приоритета должна сохра-
нить точные условия, которые существовали в тот момент. Если эта программа 
изменяет какие-либо условия, она должна сделать это так, чтобы прерванная 
программа продолжала выполняться, как будто прерывания не было. 
На рис. 5.6 показано взаимоотношение различных программ в типичной 
системе реального времени. 


50 
Рис. 5.6. Взаимосвязь между программами 
Сердцем системы является небольшая программа, называемая основным 
или главным планировщиком.
 
По окончании работы прикладных или управ-
ляющих программ управление возвращается к основному планировщику, и эта 
программа принимает решение о том, какая работа должна выполняться сле-
дующей. Обращение ко всем программам системы, за исключением программ 
обработки прерываний, производится через основной планировщик, и все они 
возвращают управление ему же. Эта программа является основой системы. Она 
определяет последовательность выполнения работ, и, если нужно, то распреде-
ляет работу между другими программами. 
Прикладные программы, фактически выполняющие обработку данных в 
системе реального времени, не имеют прямого контакта с внешним миром. Они 
получают данные от управляющих программ, обрабатывают данные и возвра-
щают их управляющим программам. Тем не менее, они могут составлять наи-
большую часть всех программ. В некоторых системах прикладные программы 
насчитывают в десять раз больше команд, чем управляющие программы. 
Основной планировщик может передавать управление некоторым програм-
мам управляющей системы. Эти программы могут составляться таким же обра-
зом, как и прикладные программы, т.е. согласно тем же правилам. Это могут 


51 
быть программы для обработки ошибок, для генерации адресов внешних запо-
минающих устройств или для подготовки сообщений для оператора. По суще-
ству, эти три функции могут рассматриваться как функции прикладных про-
грамм. Это область, в которой различие между этими программами становится 
нечетким, и обычно в разных системах эти программы классифицируются по-
разному. 
В качестве примера управляющей программы можно рассмотреть програм-
му управления нагревом печи по заданной траектории. В данной программе 
управляющий микроконтроллер (ATMega16) по программе, представляющей 
кусочно-линейный график температуры в зависимости от времени, вырабаты-
вает сигнал включения ТЭН, а также в конце работы вырабатывает сигнал го-
товности (выдается на включение зуммера). В данной задаче можно задавать 
несколько программ нагрева, задавать их параметры (конечную температуру 
участка и длительность участка), запускать в работу требуемую программу. 
Управляется программа с кнопок «Программа», «+/Изменение», «–», 
«Старт/Стоп». Параметры программ, их номера, а также параметры процесса 
(температура и время) выводятся на жидкокристаллический индикатор. 
Рассмотрим основную часть программы (это по сути основной планиров-
щик). Программа написана на языке программирования С: 
/* основная программа */ 
void main(void) 

/* задание параметров и значений регистров микроконтроллера */ 
. . . 
/* цикл работы программы */ 
for (;;) 

/* показываем номер программы */ 
. . . 
/* ждем нажатия клавиш */ 
/* сами клавиши обрабатываются в программе */ 
/* обработки прерываний от таймера 2 с частотой 488 Гц */ 
for (;;) 

if (kn1) /* кнопка Программа */ 

kn1=0; 
num_prog++; // смена номера программы 
if (num_prog>=PROG_MAX) num_prog=0; // смотрим ограничения 
break; 

if (kn2) /* кнопка Изменение */ 


52 

kn2=0; 
edit_prog(num_prog); // меняем данные программы 
break; 

if (kn4) /* кнопка Старт */ 

kn4=0; 
start_job(num_prog); // запуск рабочего режима 
break; 




В качестве других бесприоритетных программ можно выделить: 
1. управляющую программу ввода данных с АЦП, к которому подключен 
датчик температуры с токовым (4-20мА) выходом: 
unsigned int adc_in(unsigned char channel) 

unsigned char i; 
unsigned int j; 
ADMUX=0xc0|channel; 
j=0; 
for (i=0; i<4; i++) 

ADCSRA|=0x10; /* сброс готовности АЦП */ 
ADCSRA|=0x40; /* запуск АЦП */ 
while ((ADCSRA&0x10)==0) ; /* ждем готовности АЦП */ 
j+=ADC; 

return j; 

2. Прикладную программу вычисления текущей температуры нагрева: 
/* определение текущей температуры (датчик 0...300 градусов) */ 
unsigned int read_temp(void) 

unsigned int i; 
i=adc_in(4); 
if (i<767) return 0; 
return (300L*(i-767))/3069; 



53 
3. Набор прикладных программ вывода информации на индикатор: 
/* вывод курсора в заданную позицию */ 
void curs_set(unsigned char x, unsigned char y) 

. . . 

/* вывод текстового сообщения на индикатор */ 
void out_flash(unsigned char x, unsigned char y, unsigned char flash *mem) 

. . . 

/* вывод числа на LCM */ 
void out_int(unsigned char x, unsigned char y, unsigned char sign, unsigned int

. . . 

. . . 
4. Набор управляющих программ управления нагревом: 
/* включение ТЭНов */ 
void ten_on(void) 

. . . 

/* выключение ТЭНов */ 
void ten_off(void) 

. . . 

5. Прикладные программы изменения текущей программы нагрева: 
/* изменение уставки */ 
void setup_repl(unsigned int *param, unsigned int param_min, 
unsigned int param_max, 
unsigned char x, unsigned char y, unsigned char sign) 

unsigned int p; 
/* уставка */ 
p=*param; 
if (p
if (p>param_max) p=param_max; 
/* вывод данных */ 
out_int(x,y,sign,p); 


54 
/* изменение */ 
for (;;) 

if (kn1) { kn1=0; break; } 
if (kn2) 

kn2=0; 
if (p!=param_max) { p++; out_int(x,y,sign,p); } 

if (kn3) 

kn3=0; 
if (p!=param_min) { p--; out_int(x,y,sign,p); } 


/* выход */ 
*param=p; 

/* редактирование программы */ 
void edit_prog(unsigned char prog) 

unsigned char j; 
/* читаем данные программы */ 
. . . 
/* выводим начальные сообщения */ 
. . . 
for (j=0; j
. . . 

/* сохраняем данные программы */ 
write_program(prog); 

6. Набор прикладных программ записи программ нагрева во внутреннее 
ЭППЗУ микроконтроллера: 
/* функция чтения байт из ЭППЗУ */ 
void read_eeprom(unsigned int address, unsigned char *buffer, unsigned char 
nbyte) 

. . . 

/* функция записи байт в ЭППЗУ */ 


55 
void write_eeprom(unsigned int address, unsigned char *buffer, unsigned char 
nbyte) 

. . . 

/* чтение данных программы */ 
void read_program(unsigned char prog) 

. . . 

/* запись данных программы */ 
void write_program(unsigned char prog) 

. . . 

7. Программа выработки текущей температуры нагрева для выбранной про-
граммы: 
/* отработка программы */ 
void start_job(unsigned char prog) 

unsigned char j; 
for (;;) 

/* начальное сообщение */ 
. . . 
/* сообщение о начале процесса */ 
. . . 
/* отработка программы */ 
read_program(num_prog); /* читаем программу */ 
for (j=0; j
if ((temp_p[j]==0)||(temp_p[j]==0xffff)) break; 
_CLI(); 
// вывод данных участка 
. . . 
// вычисление данных участка 
if (j==0) temp_begin=read_temp(); else temp_begin=temp_p[j-1]; 
temp_end=temp_p[j]; 
time_uch=time_p[j]*TIME_1_MIN; 
time=time_uch; 
job=1; 
end=0; 


56 
_SEI(); 
while (!end)

if (kn4) break; 
if (kn2) { kn2=0; break; } 

if (kn4) { kn4=0; break; } 

break; 

/* выход из рабочего режима */ 
job=0; 
_CLI(); end=0; time=TIME_5_S; _SEI(); // пауза 5 секунд 
while (!end) ; 

В качестве приоритетных программ можно выделить: 
1) программу обработки прерываний от таймера 2, которая осуществляет 
прием информации о состоянии кнопок (частота прерываний 488Гц), а также 
контролирует состояние общего времени отработки участка программы нагре-
ва: 
/* программа обработки прерывания от таймера 2 */ 
#pragma vector=TIMER2_OVF_vect 
__interrupt void timer2(void) 

/* сброс сторожевого таймера */ 
. . . 
/* время участка */ 
if (time) time--; 
else end=1; 
/* кнопки */ 
i_t0=PIND; 
/* 1-я кнопка */ 
if ((i_t0&cod_kn1)!=0) . . . 
/* 2-я кнопка */ 
if ((i_t0&cod_kn2)!=0) . . . 
/* 3-я кнопка */ 
if ((i_t0&cod_kn3)!=0) . . . 
/* 4-я кнопка */ 
if ((i_t0&cod_kn4)!=0) . . . 

2) программу обработки прерываний от таймера 1, которая осуществляет 
управления нагревом (включение/выключение ТЭН): 


57 
/* программа обработки прерывания от таймера 1 */ 
#pragma vector=TIMER1_OVF_vect 
__interrupt void timer1(void) 

if (!job) { ten_off(); return; } /* не в рабочем режиме */ 
/* поддержание температуры */ 
adc_t=read_temp(); /* текущая температура */ 
/* вывод текущей температуры на индикацию */ 
out_int(2,1,3,adc_t); 
/* новая температура */ 
. . . 
temp_new=. . . 
. . . 
/* вывод новой температуры на индикацию */ 
out_int(6,1,3,temp_new); 
/* включение/выключение ТЭНов (с учетом гистерезиса) */ 
if ((adc_t+1)>temp_new) ten_off(); 
if ((adc_t+2)

Download 1.56 Mb.

Do'stlaringiz bilan baham:
1   ...   14   15   16   17   18   19   20   21   22




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling