Обучение : Программирование на Ассемблере для PIC


Пример 2. "Бегущий огонь" и "бегущая тень"

На тему этого примера напрашивается несколько решений создания программы.

Можно последовательно устанавливать на определенной ножке (или группе ножек) сигнал высокого уровня, выдерживать паузу, затем устанавливать сигнал низкого уровня, снова выдерживать паузу и затем устанавливать сигнал на других ножках. Весь этот процесс зацикливается, что приводит к созданию соответствующего эффекта. Команду установки сигналов низкого уровня можно исключить, чтобы в работе МК исключить случай всех потушенных светодиодов (это дело индивидуальных предпочтений). Вариантов последовательности включения светодиодов можно придумать великое множество, была бы фантазия. Рассмотрим сегмент программы (установка сигналов на порту B)

 

; установка сигналов на порту В

m1          movlw       b00000011 ; запись в аккумулятор

            movwf       PORTB       ; перенос из аккумулятора в порт

            call        Pause       ; переход на метку (с возвратом)

            movlw       b00001100 ; запись в аккумулятор

            movwf       PORTB       ; перенос из аккумулятора в порт

            call        Pause       ; переход на метку (с возвратом)

            movlw       b00110000 ; запись в аккумулятор

            movwf       PORTB       ; перенос из аккумулятора в порт

            call        Pause       ; переход на метку (с возвратом)

            movlw       b11000000 ; запись в аккумулятор

            movwf       PORTB       ; перенос из аккумулятора в порт

            call        Pause       ; переход на метку (с возвратом)

            goto        m1          ; переход на метку (зацикливание)

 

Далее прошивка скомпилированной программы, с использованием рассматриваемого сегмента:

 

:020000040000FA

:100000008316860183120330860010200C30860090

:100010001020303086001020C030860010200328C9

:1000200055308C008A308D0003308E008C0B1628E2

:0A0030008D0B16288E0B1628080011

:02400E00F13F80

:00000001FF

 

В нашей макетной плате используется семисегментный индикатор. Использование МК даёт нам неоспоримую возможность в создании оптимального рисунка печатной платы под конкретные элементы. Мы уже упоминали, что именно программу мы пишем под разрабатываемое устройство, поэтому при создании рисунка печатной платы порядок электрических соединений индикатора с МК был для нас не актуален, лишь бы это были соединения с ножками портов (в нашем случае с ножками порта B).

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

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

 

            LIST        P=PIC16F84A
            __CONFIG    H3FF1

STATUS      EQU         H0003
PORTB       EQU         H0006
TRISB       EQU         H0006
Reg_1       EQU         H000C
Reg_2       EQU         H000D
Reg_3       EQU         H000E

            org         0           ; начало программы            
; подготовительные моменты
            bsf         STATUS,5    ; переход в Банк 1
            clrf        TRISB
            bcf         STATUS,5    ; переход назад в Банк 0
            clrf        PORTB       ; очистка порта
            bsf         STATUS,0    ; установка нулевого бита в единицу

; установка сигналов на порту B
m1          rlf         PORTB,1     ; <<< сдвиг в регистре PORTB
            call        Pause       ; <<<
            goto        m1          ; <<< переход на метку (зацикливание)


;delay = 500000 machine cycles
Pause       movlw       .85
            movwf       Reg_1
            movlw       .138
            movwf       Reg_2
            movlw       .3
            movwf       Reg_3
wr          decfsz      Reg_1, F
            goto        wr
            decfsz      Reg_2, F
            goto        wr
            decfsz      Reg_3, F
            goto        wr
           
            return

            end                     ; конец программы

 

Далее прошивка

 

:020000040000FA

:1000000083168601831286010314860D08200528B5

:1000100055308C008A308D0003308E008C0B0E28FA

:0A0020008D0B0E288E0B0E28080031

:02400E00F13F80

:00000001FF

 

Как видим, текст программы намного проще и суть работы заложена в трёх строчках. Следует обратить внимание на дополнительные подготовительные моменты и на расположение метки m1.


<<< назад далее >>>

Просмотров: 42438

 








 
 
 

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