RLBN.ru - electronics banner network
 Уроки и статьи

Урок любезно предоставлен Сергеем (micro51)
Индивидуальное дистанционное обучение программированию микроконтроллеров.
Изучение устройства и функционирования микроконтроллера, языка
программирования, среды программирования, сборка макетов и проверка
работоспособности программ на них. Программы обучения и пробные
занятия можно получить по e-mail: micro51@mail.ru

PIC

  • Урок 1  - Формирование импульсных сигналов

    Формирование импульса

     Управляющий сигнал типа «импульс» можно получить последовательной выдачей сигналов «включить» и «выключить» с промежуточным вызовом подпрограммы временной задержки. Для формирования сигналов «включено» и «выключено» используем те же команды BCF f, d и BSF f, d. Модифицируем рассмотренную на прошлом занятии программу (изменения здесь и далее выделяются другим шрифтом):

     processor 16F84

    Include  <p16f84.inc>

    LED1 EQU  H’0’

         BSF  STATUS, RP0   ;установим страницу 1 памяти данных

         MOVLW    B’11111110’   ; RB<0> - на вывод,

                                ; остальные на ввод

         MOVWF    TRISB    ;запишем из регистра W в TRISB

         BСF  STATUS, RP0   ;установим страницу 0 памяти данных

    BSF  PORTB, LED1   ;включим светодиод

     CALL DELAY                      ;временная задержка

     BCF  PORTB, LED1   ;выключим светодиод

    End

                           Новым в этой программе является вызов подпрограммы временной задержки. Длительность импульса определяется временной задержкой, реализуемой подпрограммой DELAY.         Подпрограмма (процедура) -  законченная командная последовательность, которая приводится в действие командой CALL. Процедура выполняется до тех пор, пока не встретится команда RETURN. Широкое применение подпрограмм имеет большое значение при проектировании прикладных программ благодаря следующим качествам:

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

    -         каждая процедура допускает автономную отладку, что ускоряет отладку всей программы;

    -         процедуры сокращают длину прикладной программы, обеспечивая экономию программной памяти;

    -         отлаженные процедуры организуются в библиотеки 

    Напишем подпрограмму временной задержки. Для ее организации может понадобится один или несколько регистров для хранения значения задержки.

    Рассмотрим простейший случай с постоянной задержкой. Пусть нам необходима задержка в 10 мкс (при работе с тактовым генератором 4 МГц). Для организации задержки будем использовать команду NOP. Эта команда хороша тем, что не изменяет значения регистров и флагов, поэтому не нужно их контролировать. Однако здесь нужно правильно посчитать, сколько команд NOP нужно выполнить. Сначала кажется, что 10. Но на самом деле нужно учитывать, что выполнение команд CALL и RETURN будет занимать по 2 машинных цикла, а команда NOP выполняется за один цикл. Таким образом, нужно 10 - 4 = 6 команд NOP. Подпрограмма будет выглядеть следующим образом:

     DELAY:

         NOP

         NOP

         NOP

         NOP

         NOP

         NOP

    RETURN

                 Заметим, что для возврата из подпрограммы необходимо использовать оператор возврата (в данном случае – RETURN), чтобы в счетчик команд был загружен адрес команды, следующей за вызовом подпрограммы.

                 Теперь рассмотрим более сложный случай. Пусть нам необходима переменная задержка в диапазоне 10 – 200 мкс. В данном случае нам необходима память для хранения величины задержки. Обычно для этого используют один из регистров общего назначения. В 8-битном регистре можно хранить числа от 0 до 255. Таким образом, достаточно одного регистра. Выберем для этой цели регистр в первом банке с адресом 10h и назовем его DELREG. В подпрограмме задержки DELAY будем уменьшать содержимое регистра DELREG, пока он не станет равным 0. Тогда выйдем из подпрограммы. Наилучшим образом для этой цели подходит команда DECFSZ f, d. Эта команда декрементирует (уменьшает на 1) значение регистра f. Затем проверяет его значение на 0. Если оно не равно 0, то выполняется команда, следующая за DECFSZ. В противном случае следующая команда пропускается, и выполнение продолжается с команды, следующей за ней (через одну команду).

     processor 16F84

    Include  <p16f84.inc>

    LED1 EQU  H’0’

     DELREG       EQU   H’10’  ;регистр, в котором будем хранить значение

    ;задержки

         BSF  STATUS, RP0   ;установим страницу 1 памяти данных

         MOVLW    B’11111110’   ; RB<0> - на вывод,

                                ; остальные на ввод

         MOVWF    TRISB    ;запишем из регистра W в TRISB

         BСF  STATUS, RP0   ;установим страницу 0 памяти данных

    BSF  PORTB, LED1   ;включим светодиод

     

    MOVLW        D'20'  ;записываем требуемое значение задержки

    MOVWF        DELREG       ;в регистр DELREG

     CALL DELAY         ;временная задержка

    BCF  PORTB, LED1   ;выключим светодиод

    End

                            ;значение задержки

    DELAY:

          DECFSZ       DELREG, F  ;уменьшаем значение на 1

                GOTO                        DELAY          ;если не 0, то продолжаем уменьшать.

          RETURN             ;возврат, если 0

                 Для определения начала подпрограммы определена метка DELAY. В подпрограмме DELAY организован «цикл». В регистре DELREG хранится переменная цикла, с помощью оператора GOTO (который осуществляет переход по заданному адресу) и DECFSZ осуществляется проверка на окончание цикла. Начало подпрограммы служит также началом цикла.

               Аналогично команде DECFSZ действует команда INCFSZ, только она выполняет инкремент (увеличение на 1) содержимого регистра.

     Формирование периодического импульсного сигнала

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

    Аналогично формированию импульса рассмотрим случай фиксированных длительности импульса и паузы. Пусть требуется импульс длительностью 6 мкс и пауза 8 мкс. Сделаем две подпрограммы задержки DELAY6 и DELAY8.

     processor 16F84

    Include  <p16f84.inc>

    LED1 EQU  H’0’

         BSF  STATUS, RP0   ;установим страницу 1 памяти данных

         MOVLW    B’11111110’   ; RB<0> - на вывод,

                                ; остальные на ввод

         MOVWF    TRISB    ;запишем из регистра W в TRISB

         BCF  STATUS, RP0   ;установим страницу 0 памяти данных

     PULSES:

    BSF    PORTB, LED1         ;включим светодиод

    CALL DELAY6                    ;временная задержка 6 мкс

    BCF   PORTB, LED1         ;выключим светодиод

    CALL DELAY8                    ;временная задержка 8 мкс

    GOTO                        PULSES                  

     ; подпрограмма задержки 6 мкс

    DELAY6:                 

                NOP

                NOP

                RETURN                             

                 ; подпрограмма задержки 8 мкс

    DELAY8:

                NOP

                NOP

                NOP

                NOP

    RETURN                             

     End

            

                В основной программе мы организовали цикл при помощи метки PULSES и оператора GOTO.

                Создайте в MPLAB новый проект и проверьте работу данной программы на макете. Сформированный сигнал наблюдайте с помощью осциллографа.

     

    Формирование апериодического импульсного сигнала.

     Апериодический импульсный сигнал (когда его длительность и скважность меняются во времени) может быть получен аналогично периодическому сигналу или табличным способом.

                Рассмотрим табличный способ формирования сигнала. Сформируем подпрограмму A_SIGNAL_TABLE. В отличие от рассмотренных выше подпрограмм DELAY возврат из нее будем производить с помощью команды возврата RETLW k. Данная команда позволяет при возврате из подпрограммы записать в регистр W 8-битную константу k. Располагая последовательно несколько таких констант, можно получить требуемую импульсную последовательность. В качестве основы опять возьмем программу из прошлого занятия. Для того, чтобы выбрать требуемую константу, необходимо загрузить перед вызовом подпрограммы в регистр W номер константы. Регистру с адресом 11h присвоим символьное имя TBLCNT. Будем использовать его в качестве счетчика для последовательной выборки значений из таблицы. Организуем в программе 2 цикла. Первый цикл (PULSE) для выборки сигнала из таблицы. Второй (CYCLE), для того, чтобы формировать апериодический сигнал циклически (для визуального наблюдения на осциллографе).

     processor 16F84

    Include  <p16f84.inc>

    LED1 EQU  H’0’

     TBLCNT       EQU   H’11’  ;регистр, в котором будем хранить значение

    ;задержки

          BSF  STATUS, RP0   ;установим страницу 1 памяти данных

         MOVLW    B’11111110’   ; RB<0> - на вывод,

                                ; остальные на ввод

         MOVWF    TRISB    ;запишем из регистра W в TRISB

         BСF  STATUS, RP0   ;установим страницу 0 памяти данных

     CYCLE:

    ;инициализация TBLCNT – число значений в таблице - 12

                MOVLW        D’12’                         

    MOVWF        TBLCNT

    PULSE:

    ;копируем  TBLCNT в W

    MOVF                        TBLCNT, W

    DECF            TBLCNT, W             ;уменьшаем значение W на 1, чтобы выбирать

    ;значения в диапазоне 0-11 вместо 1-12

                            ;получим табличное значение в W

                CALL             A_SIGNAL_TABLE6

                            ; выводим табличное значение в порт RB

                MOVWF        PORTB

                            ;уменьшаем значение регистра TBLCNT

                DECFSZ       TBLCNT, F

                ; если не 0, то продолжаем выбирать данные из таблицы

    GOTO                        PULSE                     

                ; если 0, то повторим апериодический сигнал

    GOTO                        CYCLE

     ; подпрограмма-таблица сигнала

    A_SIGNAL_TABLE6:                  

                ADDWF         PCL, F                       ;изменяем состояние счетчика команд

                RETLW         B’11111110’            ;возврат одной из констант

                RETLW         B’11111111’

    RETLW         B’11111110’

                RETLW         B’11111110’

                RETLW         B’11111111’

                RETLW         B’11111111’

                RETLW         B’11111110’

                RETLW         B’11111110’

                RETLW         B’11111110’

                RETLW         B’11111111’

                RETLW         B’11111111’

                RETLW         B’11111111’

     End 

                Формируемый сигнал следующий: первый импульс и пауза -  3 мкс, второй – 2, третий – 1. Импульс будем формировать на выводе RB<0>, поэтому в константах меняются только младший бит. Заметьте также, что таблица задана «задом наперед».

                Создайте в MPLAB новый проект и проверьте работу данной программы на макете. Сформированный сигнал наблюдайте с помощью осциллографа.

 Скачать урок в WORD .

Hosted by uCoz