Pic16f630: Семисегментный индикатор (часть 3 задержка регулируемая через программу)

Здравствуйте, продолжение предыдущих статей:
Pic16f630: Семисегментный индикатор показываем цифры по порядку
Pic16f630: Семисегментный индикатор (часть 2 добавляем кнопку)
В данной статье мы с помощью программы создадим код задержки в 0.5 секунд и впишем его в код микрочипа.

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

Задержки в программе и их расчёт
Задержка – это сегмент программы, который ничего не делает, но обеспечивающий временной простой в ходе выполнения программы на определенное время. Разберем классический пример, обеспечивающий задержку на 10 машинных циклов (10 мкс):

Reg_1       equ         H0010

;...

            movlw       .3

            movwf       Reg_1

wr   
            decfsz      Reg_1, 1

            goto        wr

1я строчка – определяем в “шапке” адрес регистра под число.

2я – записываем число 3 в аккумулятор W.

3я – копируем из аккумулятора в Reg_1.

Это были подготовительные моменты. Далее собственно сама задержка.

4я строчка – уменьшить Reg_1 на единицу и результат сохранить Reg_1.

5я строчка – переход по метке wr на четвертую строчку.

Очевидно, что 4я и 5я строчка в цикле выполнятся 2 раза. Тогда где обещанные 10 машинных циклов? Дело в том, что команды, связанные с переходами на другие команды, выполняются за 2 машинных цикла. Теперь всё сходится.

А если нам надо обеспечить задержку не в 10 мкс, а 11 мкс? Тогда достаточно в самом конце кода дописать строчку с командой NOP (пустышка), которая как и большинство команд выполняется за 1 мкс.

А как быть если нам нужна задержка для мигалки на 0,5 сек или на 1 сек? Тогда нам надо написать код, который будет занимать 500000 и, соответственно, 1000000 машинных циклов. И это очень просто. Скачиваем программу Pause_2, которая выдаёт код по заданному количеству машинных циклов.

Установил код задержки в 500000 машинных циклов, что равно 0,5 сек.

Код задержки из программы:

 
; Delay = 0.5 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.5 seconds = 500000 cycles
;delay = 500'000 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
            nop
            nop

При частоте микрочипа в 4 MHz, чтобы добиться задержки в 0.5 seconds необходимо установить 500000 cycles.

Скачать файлы asm,hex,inc:


Скачать файлы

В код ниже добавил следующие строчки:

 
 r1 equ 22
r2 equ 23
r3 equ 24

delay1000
 movlw 0x85
 bcf STATUS,RP0
 movwf r1
 movlw 0x138
 movwf r2
 movlw 0x3
 movwf r3
wr
 decfsz r1,1
 goto wr
 decfsz r2,1
 goto wr
 decfsz r3,1
 goto wr
 nop
 nop
 return

Код задержки для микрочипа с семисегментным индикатором показывающим цифры по порядку:

 
#include <P16F630.INC>
 __CONFIG (_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT)  ;Internal osc.

 c1 equ 20
 c2 equ 21
 r1 equ 22
r2 equ 23
r3 equ 24
 org 0

Start
 
 BSF   STATUS,RP0  ; select bank 1
 CLRF  TRISC       ; make PORTC pins all output
CLRF  TRISA       ; make PORTA pins all output
 BCF   STATUS,RP0  ; select bank 0
 movlw b'00000000'
 movwf  PORTC       ; set portc pins equal to 0
movlw b'00000000'
 movwf  PORTA       ; set portc pins equal to 0

loop
 movlw b'00111111'
 movwf PORTC
movlw b'00000000'
 movwf PORTA
 call delay1000
 movlw b'00100100'
 movwf PORTC
movlw b'00000000'
 movwf PORTA
 call delay1000
 movlw b'00011110'
 movwf PORTC
movlw b'00000100'
 movwf PORTA
 call delay1
call delay1
call delay1
call delay1
 goto loop

delay1
 movlw b'11111111'
 bcf STATUS,RP0
 movwf c2
lc0
 movlw b'11111111'
 movwf c1
lc1
 decfsz c1,1
 goto lc1
 decfsz c2,1
 goto lc0
 return

delay1000
 movlw 0x85
 bcf STATUS,RP0
 movwf r1
 movlw 0x138
 movwf r2
 movlw 0x3
 movwf r3
wr
 decfsz r1,1
 goto wr
 decfsz r2,1
 goto wr
 decfsz r3,1
 goto wr
 nop
 nop
 return




 end

Добавить комментарий