logo search
HCS12 с применением языка С - royallib

Пример применения

В этом примере мы подключили в порту PORTA группу зеленых и красных светодиодов. Схема подключения показана на рис. 4.9. Мы обсудим эту схему подробно в гл.5. А сейчас лишь договоримся, что если на линии порта установлена 1, то будет гореть зеленый светодиод, если логический 0 — то красный светодиод. А если линия порта переведена в состояние ввода, т.е. она представляется для цепи светодиодов нагрузкой с высоким входным сопротивлением, то оба светодиода окажутся погашенными. На рис. 4.10 приведена блок-схема алгоритма программы, которая зажигает на 30 мс зеленым цветом светодиоды с четными номерами и одновременно красным цветом светодиоды с нечетными номерами. Следующие 30 мс светодиоды «меняются цветами», далее этот процесс продолжается до бесконечности. Ниже приведен текст программы на языке Си, который реализует этот алгоритм.

Рис. 4.9. Схема отображения состояния порта PORTA

Схема содержит 8 идентичных светодиодных индикаторов для логических выходов с тремя состояниями. Индикатор каждого разряда состоит из двух светодиодов: зеленого и красного. Если на выходе порта PORTA[i] логическая 1,то светится зеленый светодиод, если логический 0 — то красный. Если линия порта PORTA[i] настроена на ввод, то ни один из светодиодов этого разряда порта не светится.

Рис. 4.10.  Блок схема алгоритма управления светодиодами

/*----------------------------------------------------------------------*/

/* МAIN PROGRAМ: Эта программа зажигает на выходах порта PORTA          */

/* 30 мс зеленым цветом горят светодиоды на выходах порта с четными     */

/* номерами, красным цветом –светодиоды на выходах порта с нечетными    */

/* номерами. Следующие 30 мс на месте зеленых горят красные, и наоборот */

/*----------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>

/*используемые функции*/

void delay_100us(void);

void delay_30ms(void);

void main{void) {

 DDRA = 0xFF; //установить порт PORTA на вывод

 while(1) {

  PORTA = 0x55;

  delay_30ms();

  PORTA = 0xAA;

  delay_30ms();

 }

}

/*-----------------------------------------------------------------------*/

/* Функция delay_30ms формирует задержку в 30 мс, частота тактирования   */

/* межмодульных магистралей МК составляет 8 МГц                          */

/*-----------------------------------------------------------------------*/

void delay_30ms(void) {

 int i;

 for (i=0; i<=299; i++) delay_100us();

}

/*-----------------------------------------------------------------------*/

/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/

/* межмодульных магистралей МК составляет 8 МГц                          */

/*-----------------------------------------------------------------------*/

void delay_100us(void) {

 int j;

 for (j=0; j<50; j++) {

  asm("nop\n");

 }

}

/*-----------------------------------------------------------------------*/

Обратите внимание, что функция задержки на 30 мс использует вложенную функцию задержки на 100 мкс. В приведенном тексте программы для формирования задержки на 100 мкс используются 50 циклов повторения операторов функции delay_100us. Выбор числа повторений производился из предположения, что данная программа будет исполняться микроконтроллером, частота внутренней шины которого составляет 8 МГц. По результатам рассмотрения файла в формате *.lst было установлено, что команды ассемблера, соответствующие одному повторению цикла функции delay_100us , реализуются за 16 машинных циклов. При частоте шины в 8 МГц для формирования временного интервала в 100 мкс потребуется 800 машинных циклов. Поэтому число повторений цикла функции delay_100us должно составлять 800/16 = 50. Если бы эта программа исполнялась бы микроконтроллером DP256, частота внутренней шины которого составляет 25 МГц, то число циклов функции delay_100us должно было бы быть увеличено до 156.