Матроскин Андрей писал(а):Ладно, все понятно. Вопрос по теме, выражаясь "Настиным" языком :
1 одна линия в сторону МК от кнопки (снятие/постановка)
2 одна линия в сторону МК от датчика(охрана)
3 одна линия от МК в сторону пищалки.
4 Опрос датчика
5 Неопрос датчика.
Алгоритм:
Если есть 1 , кратковременно(0,5сек) сделать 3 и 4
Если есть 1, кратковременно сделать 3 и 5
Вопрос как сделать 3 совмесно с 4 и 5 , если 4 и 5 опрашиваюстя постоянно, а 3 надо сделать один раз?
В вашем алгоритме много неопределенностей,
а именно перевожу как вас бы понял МК:
- нажимая кнопку по вашему алгоритму, МК не знает -
охраняем мы или не_охраняем (а вы это явно не оговорили);
- ну хорошо, пикнули мы и переходим к опросу датчика;
- опрашиваем датчик и дальше что; что должно стать
результатом опроса... ступор
Плюс ко всему создается впечатление, что у вас кнопка
с фиксацией или тумблер.
Мне лично понятно, что вы хотите делать - а именно озвучивать
факт нажатия кнопки. Пищание должно быть связано именно
с фактом нажатия, а не с тем как дальше будет работать программа.
Как это видется
Код: Выделить всё
Reg_1 equ h'20'
Reg_2 equ h'21'
Reg_3 equ h'22'
#define кнопка PORTB,0 ; кнопка на RB0 (на вход + подтяжка)
#define бузер PORTB,1 ; бузер на RB1 (на выход)
; бузер - buzzer - с англ зуммер (например, HCM1206)
bсf бузер ; выкл пищалку (т.к. здесь состояние неизвестное)
btfsс кнопка ; если кнопка=1, выполн след инструкция
goto $-1 ; на 1 шаг назад, т.е. перепроверить
; далее обрабатываем факт нажатия, а именно пищим
call писк ; переходим в подпрограмму пищания
; далее контролируем отжатие кнопки (если нужно)
btfss кнопка ; если кнопка=0, выполн след инструкция
goto $-1 ; на 1 шаг назад, т.е. перепроверить
; далее смотрим "состояние" (охраняем/не_охраняем)
; меняем его на противоположное
; в зависимости от "состояния" выполняем те или иные действия
; === подпрограмма пищания
писк
bsf бузер ; вкл пищалку
call пауза ; уйти в подпрограмму паузы
bсf бузер ; выкл пищалку
return ; возврат из подпрограммы (по стеку)
; === подпрограмма паузы 0,5
; Задержка 500 000 машинных циклов
; Длительность задержки 500000 микросекунд
; Частота задающего генератора 4 МГц
пауза
movlw .85
movwf Reg_1
movlw .138
movwf Reg_2
movlw .3
movwf Reg_3
decfsz Reg_1,F
goto $-1
decfsz Reg_2,F
goto $-3
decfsz Reg_3,F
goto $-5
nop
nop
return ; возврат из подпрограммы (по стеку)