Здравствуйте, продолжение предыдущих статей:
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