Управления
Программирование микроконтроллеров
Download 1.56 Mb. Pdf ko'rish
|
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling