Доброго времени суток!
У меня появился вопрос в изучении написания программ.
На числа в регистрах задержки прошу не смотреть, сделал для удобоотслеживания в пошаговом режиме аврстудио4. Рассматриваю на примере простенькой программы
Алгоритм программы таймера счетчика таков:
1. Инициализация портов на ввод и вывод
2. делаем опрос кнопки назовем Pincykle
3.
отслеживание нажатие кнопки
4. пропустить если нажата
5. если не нажата то вернуться к отслеживанию на метку Pincykle
б) если нажата то записываем число в регистры процедуры задержки 0.2с
в) сама процедура - задержка ( убираем дребезг контактов)
6.
делаем опрос кнопки на отжатие
7. пропустить если отпущенна
а) если нажата то вернуться к отслеживанию на метку Pincykle происходит цикл пока не отпустим
б) если отжали то что-то делаем
в) записываем число в регистры. 0.5с
г) сама процедура задержки
8. вернуться к отслеживанию на метку Pincykle
Так всеж-таки не пойму
почему нужно ставить задержку после выполнения чего либо, а не сразу после отжатия кнопки - задержка, а потом выполнения чего не будь и вернуться опять к отслеживанию!? В моем случае это увеличения счетчика и вывод его в порт. В принципе Я так понимаю не только для дребезга, не могу до конца вкурить.
; ************************************************** **********************
.device
ATmega8515 ; Используется МК ATmega8515
.nolist ; Отключенна генерация листинга
.include "m8515def.inc" ; Вложенные файлы не будут отображены в листинге
.list ; Включена генерация листинга
;************************************************* ************************
;************************************************* ************************
.def temp=r16 ;рабочая переменная
.def Razr0=r17 ;разряды задержки
.def Razr1=r18
.def Razr2=r19
.def counter=r20 ;счетчик
;************************************************* ***********************
.cseg ; Начало кодового сегмента
.org 0x0000
rjmp RESET ; Обработка сброса
.org 0x0001 ;rjmp EXT_INT0 ; внешнее прерывание IRQ0
reti
.org 0x0002 ; rjmp EXT_INT1 ; внешнее прерывание IRQ1
reti
.org 0x0003 ; rjmp TIM1_CAPT ; Обработка захвата таймера/счетчика T1
reti
.org 0x0004 ; rjmp TIM1_COMPA ; Совпадение А таймера/счетчика T1
reti
.org 0x0005 ; rjmp TIM1_COMPB ; Совпадение В таймера/счетчика T1
reti
.org 0x0006 ; rjmp TIM1_OVF ; Обработка переполнения таймера/счетчика T1
reti
.org 0x0007 ; rjmp TIM0_OVF ; Обработка переполнения таймера/счетчика T0
reti
.org 0x0008 ; rjmp SPI_STC ; Передача по SPI завершена
reti
.org 0x0009 ; rjmp USART_RXC ; USART RX прием завершен
reti
.org 0x000A ; rjmp USART_UDRE ; Регистр данных USART пуст
reti
.org 0x000B ; rjmp USART_TXC ; USART TX Передача завершена
reti
.org 0x000C ; rjmp ANA_COMP ; Обработка прерывания аналогового компаратора
reti
.org 0x000D ; rjmp EXT_INT2 ; Обработка внешнего прерывания IRQ2
reti
.org 0x000E ; rjmp TIM0_COMP ; Обработка совпадения таймера/счетчика T0
reti
.org 0x000f ; rjmp EE_RDY ; EEPROM готово
reti
.org 0x0010 ; rjmp SPM_RDY ; Store Program memory - готово
reti
;************************************************* ************************
RESET:
;инициализация стека
ldi R16,high(RAMEND)
out SPH,temp
ldi R16,low(RAMEND)
out SPL,temp
;-------------------------------------------------------------------------
ldi temp,0b00000100 ; для второго разряда порта D
out PORTD,temp ; подтягивающий резистор на всякий случай
ldi temp,0b11111111 ; порт A все контакты на выход
out DDRA,temp
clr counter ; очищаем счетчик
Pincykle: ; цикл отслеживания кнопки
sbic PinD,2 ; пропустить, если нажата
rjmp Pincykle ; вернутся обратно, если не нажата
; кнопка нажата - пауза 0,2 с, N = $027100
ldi Razr2,$00
ldi Razr1,$00
ldi Razr0,$01
rcall Delay
Pin_release: ; отслеживаем отпускание
sbis PinD,2 ; пропустить, если отпущена
rjmp Pincykle ; вернуться обратно, если нажата
inc counter ; если отпущена, увеличиваем счетчик
out PORTA, counter ; выводим счетчик в порт A
; пауза 0,5 с, N = $061A80
ldi Razr2,$00
ldi Razr1,$00
ldi Razr0,$02
rcall Delay
rjmp Pincykle ; вернуться обратно к отсеживанию
;---------------------------------------------------------------------
Delay: ; процедура задержки
subi Razr0,1
sbci Razr1,0
sbci Razr2,0
brcc Delay
ret ; возврат из процедуры