;--------------------------------------------------------------------------
;Основные установки конфигурации микроконтроллера 16F84A
;--------------------------------------------------------------------------
DEFINE _OSC4_ _BUTTON_PAUSE 20; Кварц 4 MHz ,Убрать дребезг контактов.
OPTION_REG.7 = 0 ;Подтягивающие резисторы на Порт В
OPTION_REG.6 = 1 ;Включение по переднему фронту сигнала
Symbol INTE = INTCON.4 ; Бит разрешения прерывания по PORTB.0(INT)
Symbol INTF = INTCON.1 ; Флаг внешнего прерывания по PORTB.0(INT)
input PORTB.0 ; Вход прерывания ( Делаем нужные порты входами и выходами.)
output PORTA.0; Выход
output PORTA.1; Выход
output PORTA.2; Выход
output PORTA.3; Выход
output PORTB.3; Выход
KN VAR PORTB.0; Порт приёма инф-излучения.
SV VAR PORTA.0; Выход на лампу
LED VAR PORTA.1; Подсветка устройства
SOU VAR PORTA.3;Пищаль ( Пьезик)
J var byte ; j байтовая переменная
INTE = 1;Разрешаем прерывание по порту RB.0(INT)
PAUSE 50; Пауза 50ms
;----------------------------------------------------------------------------
; Начало основной программы.
;----------------------------------------------------------------------------
main:
enable;Разрешаем прерывание.
on interrupt goto int1;Если прерывание произошло перейти на метку int1
low sv; Свет потушен
high led;СВетодиод горит
pause 50;Пауза 50ms
goto main; Возврат в начало программы
;----------------------------------------------------------------------------
; Метка прерывания от PORTB.0
;----------------------------------------------------------------------------
DISABLE;Запрет прерываний
int1:; Метка прерывания
high sv;Свет горит
low led; Светодиод потушен
pause 40000:freqout sou,100,800;Пауза 40 сек,Генерируем на пьезик сигнал 800Hz.
low sou; Низкий уровень на PORTA.3
if kn = 1 then int1:pause 2000:if kn = 0 then tsv;Это все условия работы.
goto int1;Переход на метку int1
tsv:; Метка плавного уменьшения яркости света.
for j = 255 to 0 step -2; Плавное уменьшение яркости лампы до = 0
pwm sv,j,64; Цикл программного ШИМ.
if kn = 1 then int1 ; Условие KN1 ( Если на входе +,возращаемся на начало метки
next j ; Цикл переменной J ;( int1)
low sv ; Лампа потушена.
INTF = 0 ; Сбросим Флаг внешнего прерывания по PORTB.0(INT)
resume; Возврат на метку обработки прерывания. Этот код на ASMe вставляю в начале программы:
main:
enable;Разрешаем прерывание.
on interrupt goto int1;Если прерывание произошло перейти на метку int1
asm
movlw d'14'
movwf CCPR1L ;Установка периода 50%
movlw b'00001111'
movwf CCP1CON ;Включаем ШИМ
bsf STATUS,RP0 ;Банк 1
movlw d'27' ;Частота ШИМ примерно 36КГЦ (для TSOP1736)
movwf PR2
bcf STATUS,RP0 ;БАНК 0
clrf TMR2
movlw b'00000100' ;Включение модуля ШИМ
movwf T2CON ;и таймера TMR2, чтобы ШИМ работало
endasm
low sv; Свет потушен
high led;СВетодиод горит
pause 50;Пауза 50ms
goto main; Возврат в начало программы
Вы не смотрите что в начале написано для 16F84A, я пробовал 16А628А тоже работает(просто хотел избавиться от
внешнего генератора на 36KHz,хотел чтобы частота шла именно от этого 16F628A)