Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

1. Прикладные программы. Это программы, которые выполняют обработку записей или сообщений. Они соответствуют программам обработки данных в обычных системах и уникальны для каждой системы. Последовательности команд ввода-вывода входят в них только в форме макрокоманд, передающих управление программе, управляющей вводом-выводом, или программе-монитору, которая в рассматриваемых системах является частью управляющих программ.

2. Управляющие программы. Эти программы координируют и распределяют во времени работу прикладных программ, а также выполняют служебные функции для них. Можно рассматривать прикладные программы как подпрограммы основной управляющей программы. Управляющие программы обрабатывают операции ввода и вывода и задают очередность сообщений и данных. Они должны координировать и оптимизировать функционирование ЭВМ в условиях меняющихся нагрузок. Они обрабатывают прерывания, а также обеспечивают работу при возникновении ошибок и аварийных ситуаций.

3. Обеспечивающие программы. Принципиально работоспособная система состоит из прикладных и управляющих программ. Однако необходим еще третий набор программ для начального пуска системы и для поддержания ее нормального функционирования. Эти программы называются обеспечивающими и включают средства отладки программ, программы генерации данных, средства моделирования оконечных устройств, диагностику и т.д.

Прикладные программы подобны рабочим и механизмам на заводе, тогда как управляющие программы можно сравнить с административно-управленческим персоналом, руководством и мастерами. Обеспечивающие же программы подобны группе, выполняющей профилактические работы, помогающей устанавливать новый механизм и поддерживать машины в рабочем состоянии.

Различными организациями используются различные термины для определения этих программ. Прикладные программы называются “операционными программами”, “процессорами”, “обычными процессорами” и т.д. Управляющие программы называются “супервайзером”, “диспетчером”, “исполнителем”, “монитором” и другими именами. Разнообразные термины используются также и для обеспечивающих программ. В дальнейшем будем использовать термины “прикладные”, “управляющие” и “обеспечивающие” программы.

Управляющие программы по возможности разрабатываются одной группой разработчиков и все вместе называются управляющей системой. Для этого набора программ должно быть написано руководство, которое программисты, работающие над прикладными программами, обязаны изучить. В этом случае перед программистами стоит задача разработки программ не для обычной машины, а для машины, снабженной управляющей системой. В одних аспектах это упрощает их работу, в других ограничивает ее. Например, программисты ограничены в использовании индексных регистров и оперативной памяти, но операции ввода-вывода уже запрограммированы и не требуют дополнительных затрат времени.

Управляющие программы предоставляются изготовителем ЭВМ или разрабатываются пользователем. Это достаточно сложные программы, и их разработка для большой системы требует большого количества времени и опытных программистов. Они тесно связаны с техническими средствами. Более того, они должны быть четко определены до начала детальной проработки прикладных программ. Поэтому предоставление этих программ пользователю дает ему значительные преимущества. Часто, однако, бывает необходимым “подогнать” их к определенным приложениям. Стандартизация управляющих программ для сложных систем реального времени затруднительна, и только часть из них может быть составлена в виде стандартных блоков.

У заказчика также может возникнуть необходимость в модификации управляющих программ. Если его система работает успешно, он, по всей вероятности, будет стремиться к расширению ее, если нет, то он пожелает изменить ее функционирование, что означает изменение в управляющих программах.

Поэтому можно посоветовать, чтобы в группе программистов пользователя кто-либо полностью разобрался в том, как эти программы построены и закодированы.

Различные виды прерываний находят широкое применение в системах реального времени. Например, прибытие нового сообщения от оператора удаленного оконечного устройства может прервать ту работу, которую ЭВМ выполняет в этот момент, с тем, чтобы записать это сообщение в оперативную память. Конец поиска на устройстве внешнего ЗУ с произвольной выборкой вызывает прерывание, чтобы процессор мог начать чтение обнаруженной записи; и когда чтение заканчивается, опять возможно прерывание, чтобы процессору было известно, что запись можно использовать при обработке, а также что другая инструкция может быть дана этому устройству, если есть очередь. Прерываться могут как управляющие, так и прикладные программы. Когда прерывание происходит, оно обслуживается программой высокого приоритета, которая обычно входит в управляющую систему.

Когда причина прерывания обработана, управление обычно передается в точку, в которой прерывание произошло. Но возможны и случаи, когда в определенных обстоятельствах управление в эту точку не возвращается. Для того чтобы ЭВМ могла возобновить работу, которая выполнялась до момента возникновения прерывания, программа более высокого приоритета должна сохранить точные условия, которые существовали в тот момент. Если эта программа изменяет какие-либо условия, она должна сделать это так, чтобы прерванная программа продолжала выполняться, как будто прерывания не было.

На рисунке 5.6 показано взаимоотношение различных программ в типичной системе реального времени.

Рисунок 5.6. Взаимосвязь между программами

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

Прикладные программы, фактически выполняющие обработку данных в системе реального времени, не имеют прямого контакта с внешним миром. Они получают данные от управляющих программ, обрабатывают данные и возвращают их управляющим программам. Тем не менее, они могут составлять наибольшую часть всех программ. В некоторых системах прикладные программы насчитывают в десять раз больше команд, чем управляющие программы.

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

В качестве примера управляющей программы можно рассмотреть программу управления нагревом печи по заданной траектории. В данной программе управляющий микроконтроллер (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) /* кнопка Изменение */

       {

      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;

}

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 a)

{

. . .

}

. . .

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<param_min) p=param_min;

if (p>param_max) p=param_max;

/* вывод данных */

out_int(x,y,sign,p);

/* изменение */

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<UCH_MAX; j++) /* участки программы */

{

. . .

}

/* сохраняем данные программы */

write_program(prog);

}

6. набор прикладных программ записи программ нагрева во внутреннее ЭППЗУ микроконтроллера:

/* функция чтения байт из ЭППЗУ */

void read_eeprom(unsigned int address, unsigned char *buffer, unsigned char nbyte)

{

. . .

}

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

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<UCH_MAX; 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;

    _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, которая осуществляет управления нагревом (включение/выключение ТЭН):

/* программа обработки прерывания от таймера 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)<temp_new) ten_on();

}

Библиографический список

1. Антошина, И.В. Микропроцессоры и микропроцессорные системы. Аналитический обзор. / И.В. Антошина, Ю.Т. Котов. — М.: Московский государственный университет леса, кафедра электроники и микропроцессорной техники, 2005. — 432с.

2. Боборыкин, А.В. Однокристальные микроЭВМ. / А.В. Боборыкин, Г.П. Липовецкий, Г.В. Литвинский и др.— М.: МИКАП, 1994. — 400с.

3. Вальпа, О. Микроконтроллеры и CAN-интерфейс. / О. Вальпа // Современная электроника, 2011. – №7. –С.42-49.

4. Введение в CAN 2.0B интерфейс. / ООО “Микро-Чип”, М.: 2001. – Информационный ресурс www.microchip.ru. Доступно 2.09.2013.

5. Гук, М. Интерфейсы ПК: справочник. / М. Гук. — СПб: Питер Ком, 1999. — 416с.

6. Мартин, Дж. Программирование для вычислительных систем реального времени. / Дж. Мартин. — М.: Наука, 1975. — 360с.

7. Цилькер, Б.Я. Организация ЭВМ и систем: Учебник для вузов. / Б.Я. Цилькер, С.А. Орлов. — СПб.: Питер, 2004. — 668с.: ил.

8. Евстифеев, А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel. / А.В. Евстифеев. — М.: Издательский дом “Додэка-XXI”, 2005. — 560с.

9. Информационный ресурс www.tecon.ru. Доступно 2.09.2013.

10. Королев, Н. 32-разрядные микроконтроллеры ATMEL на базе ядра ARM7. / Н. Королев. // Компоненты и технологии, №6, 2006.

11. Королев, Н. 32-разрядные микроконтроллеры ATMEL на базе ядра ARM9. / Н. Королев. // Современная электроника, №4, 2007.

12. Петров, И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного программирования. / И.В. Петров. — М.: СОЛОН-Пресс, 2004. — 256с.

13. Хвощ, С.Т. Промышленные сети на базе стандарта MIL-STD-1553B. / С.Т. Хвощ, Х.Х Амаду. // СТА, №1, 1999. — с.42-45.

14. Siemens. Simatic. Программируемый контроллер S7-300. Данные CPU, CPU 31xC и CPU 31x. Справочное руководство.



Оглавление

1. Структура управляющих устройств на базе микропроцессоров.. 3

2. Структура ЭВМ в управляющих микропроцессорных устройствах.. 7

3. Интерфейсы микропроцессорных устройств.. 11

3.1. Параллельные интерфейсы.. 11

3.2. Последовательные интерфейсы.. 12

3.2.1. Способы последовательной передачи. 12

3.2.2. Реализации асинхронного интерфейса. 14

3.2.3. Реализации синхронного интерфейса. 15

3.2.4. Реализации изохронного интерфейса. 19

3.2.5. CAN-интерфейс. 20

3.2.6. Протокол Манчестер-2. 24

3.2.7. Протокол высокого уровня MODBUS. 29

3.3. Особенности использования шин. 32

4. Выбор управляющей ЭВМ... 34

4.1. Промышленные ЭВМ... 35

4.2. Промышленные контроллеры.. 36

4.3. Микроконтроллеры.. 38

5. Программирование управляющих микропроцессорных устройств.. 42

5.1. Программирование промышленных контроллеров. 42

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

Библиографический список. 57

 


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 329; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.093 с.)
Главная | Случайная страница | Обратная связь