контроллер управляет сециолизированым драйвером собраным на микросхеме ZXSC400. Несколько нюансов диоды VD1-3 быстродействующие подних подобрать резистор между контактами 2 и 3 микросхемы LP2985 (ориентировочно 2Ком). Резистором R1 устанавливается напряжнние выхода с микросхемы К1156ЕН5ВП. Совместно с подбором резистором R10 устонавить ток заряда (выбрать меньше 0.5а иначе сработает защита К1156ЕН5ВП) желательно взять проволочный. В моей схеме напряжение выхода 4.2в и 1.2ом. Резистором R14 калибруем АЦП чтобы 1в = 204 в бинарном выражении.
Программа написана на асемблере
Спойлер
Код:
;программа управления светодиодным фонариком ;на контроллере 12F675 LIST P=12F675, R=DEC include "P12F675.INC" __CONFIG (_CPD_OFF&_CP_OFF&_BODEN_ON&_MCLRE_OFF&_PWRTE_ON&_WDT_ON&_INTRC_OSC_NOCLKOUT) ; cpd_ защита пам данных выкл ; cp_ защита пам програм выкл ; boden_ разр сброса по снижению питания вкл ; mclre_ gp3 как порт, -mclre подключен к vdd ; pwrte_ таймер включения питания вкл ; wdt_ сторожевой таймер вкл ; intrc_ вутренний rc, gp4 gp5 как порт errorlevel 0,-305,-302 ;******************************************************************************* ; ПЕРЕМЕННЫЕ ;******************************************************************************* cblock 20h ; Начальный адрес блока пользовательской памяти P_Err ; Счётчик периодов в цикле STATBAT ; Статус батареи ;7- 0-заряжено 1-разряжено ;6- разрешение на включение фонаря 1-можно 0-нельзя FLAGIZM ;0-флаг сравнения ; если U> UMAX, UMIN то выставляем флаг =1 ; если U< UMAX, UMIN то выставляем флаг =0 ;1-флаг нажатия кнопки ; кнопка нажималась флаг =1 ; кнопка не нажималась флаг =0 ;2- разрешение на включение фонаря 1-можно 0-нельзя ;3-флаг не нажатия кнопки ; кнопка не нажималась флаг =1 ; кнопка нажималась флаг =0
var01 ; Временный регистр var02 ; Временный регистр var03 ; Временный регистр var04 ; Временный регистр U_H ; напряжение старший разряд U_L ; напряжение младший разряд UMAX_H ; максимальное напряжение старший разряд UMAX_L ; максимальное напряжение младший разряд UMIN_H ; минимальное напряжение старший разряд UMIN_L ; минимальное напряжение младший разряд endc ;******************************************************************************* ; ПРОГРАММА ;******************************************************************************* ORG 0 ; Начало goto start ; Переход на основную программу ORG 4 ; Вектор прерывания ; далее код обработчика которого нет RETFIE ; Возврат из прерывания ;******************************************************************************* ; ИНИЦИАЛИЗАЦИЯ ;******************************************************************************* start ;******** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ******************************************************** ;*** Необходимо помнить, что калибровочные константы стираются при программировании, ********** ;****** Калибровка Генератора ***************************************************************** bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) Call 3FFh ; калибровочная константа внутреннего RC генератора в w movwf OSCCAL ; Загрузить калибровочную константу ;****** Калибровка предделителя **************************************************************** bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) clrwdt ; сброс сторожевго таймера и прдделителя bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) movlw b'11001111' ;7-1 подтягивающие резисторы выключены, ;5-0 внутренний тактовый сигнал ;3-1 предделитель WDT ;2,1,0-111 ккоэффициент 1:128 2.3сек movwf OPTION_REG ; запись управляющего слова ;****** Калибровка прерывания ****************************************************************** bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) movlw b'00000000' ;7,0 все прерывания запрещены movwf INTCON ; запись управляющего слова ;******** Установка направления работы ног ***************************************************** ;GP0 -вход аналоговый измерение напряжения аккумулятора ;GP1 -выход цыфровой управление светом фонаря 1-включено ;GP2 -выход цыфровой управление питанием контроллера 1-включено ;GP3 -вход цыфровой кнопка 1-включено ;GP4 -выход цыфровой индикация 0-зелёный 1-красный 3-е ссостояние потушить ;GP5 -выход цыфровой управление зарядом 0-включить 3-е состояние выключить clrf GPIO ; инициализация защелок (все выходы равны нулю) movlw b'00000111' ;2,1,0-111 выключить компаратор movwf CMCON ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) movlw b'00000000' ; выключить опорное напряжение movwf VRCON ; компаратор выключен movlw b'00001001' ; настройка входов/выходов (Порт направления: 1=вход 0=выход) movwf TRISIO ; запись управляющего слова clrf WPU ; подтягивающие резисторы выключены clrf IOCB ; прерывания по измненению сигнвла на входвх запрещены movlw b'01110001' ; настройка входов АЦП ;6,5,4-Х11 отдельнфй внутренний RC генератор ;3,2,1,0-0001 GP3,2,1-выход цыфровой GP0-вход аналоговый movwf ANSEL ; запись управляющего слова ;******** Управление АЦП *********************************************************************** bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) movlw b'10000001' ;7-1 правое выравнивание ;6-0 опорное напряжение от питания контроллера Vdd ;3,2-00 выбор 0-го аналогового канала, GP0-вход аналоговый ;1-0 бит статуса модуля АЦП 1-начать преобразование 0-преобразование завершено ;0-1 бит включения модуля АЦП 1-модуль включен, 0-модуль выключен и не потребляет ток movwf ADCON0 ; запись управляющего слова ;******** Начало логики работы ***************************************************************** bsf GPIO,GP2 ; включение питания контроллера 1-включено prodprov clrwdt ; сброс сторожевго таймера и прдделителя clrf FLAGIZM ; обнулить все флаги измерения Call knop1 ;подпрограмма проверка нажатия кнопки Call knop2 ;подпрограмма проверка не нажатия кнопки ;проверка вариантов запуска btfsc FLAGIZM,1 ;проверка в регистрe FLAGIZM,1 бит=0 то следующее пропустить goto provml11 ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss FLAGIZM,1 ;проверка в регистрe FLAGIZM,1 бит=1 то следующее пропустить goto provml12 ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml12 ;если FLAGIZM,1=0 btfsc FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить goto xod11 ;если бит FLAGIZM,3=0 то выполнится код внутри goto prodprov ;не корректное поведение кнопки порверить снова xod11 ; btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить goto xod12 ;если бит FLAGIZM,3=1 то выполнится код внутри goto ciklzar ; начало основного цикла заряда************** xod12 ; goto oconizm11 ; provml11 ;если FLAGIZM,1=1 btfsc FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить goto xod13 ;если бит FLAGIZM,3=0 то выполнится код внутри goto ciklfon ; начало основного цикла фонарика************ xod13 ; btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить goto xod14 ;если бит FLAGIZM,3=1 то выполнится код внутри goto ciklfon ; начало основного цикла фонарика************ пофиг всёравно включить ; goto prodprov ;не корректное поведение кнопки порверить снова xod14 ; oconizm11
;**************************************************************************************************************************************** ciklzar ; начало основного цикла заряда clrwdt ; сброс сторожевго таймера и прдделителя clrf FLAGIZM ; обнулить все флаги измерения bcf GPIO,GP2 ; выключение питания контроллера 0-включено т.к питание от зарядника ;программа включить заряд bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bcf TRISIO,GP5 ; GP5 на выход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) bcf GPIO,GP5 ;включить заряд 0-включено ;число 866 4.1в это число при котором устонавливается порог заряда батареи ;выше него выключится заряд movlw b'00000011' ;;;;; movwf UMAX_H ; максимальное напряжение старший разряд movlw b'01100010' movwf UMAX_L ; максимальное напряжение младший разряд clrwdt Call DELAY_ADC ;чтение результата преобразования АЦП Call srav_napr ;подпрограмма сравнения ;индикация результата сравнения btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить goto jamp07 ;если бит =0 то выполнится код внутри Call gp4_kr ;0-й бит =0 ;программа включить заряд bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bcf TRISIO,GP5 ; GP5 на выход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) bcf GPIO,GP5 ;включить заряд 0-включено jamp07 ; btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить goto jamp08 ;если бит =1 то выполнится код внутри Call gp4_zel ;0-й бит =1 ;программа выключить заряд bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bsf TRISIO,GP5 ; GP5 на вход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
;эта часть кода на сучай если зарядное осталоси поделюченым podzarad clrwdt ; сброс сторожевго таймера и прдделителя clrf FLAGIZM ; обнулить все флаги измерения ;число 846 4.01в это число при котором устонавливается порог заряда батареи ;ниже него включится заряд movlw b'00000011' ;;;;; movwf UMAX_H ; максимальное напряжение старший разряд movlw b'01100010' movwf UMAX_L ; максимальное напряжение младший разряд clrwdt Call DELAY_ADC ;чтение результата преобразования АЦП Call srav_napr ;подпрограмма сравнения ;результат сравнения btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить goto jamp09 ;если бит =0 то выполнится код внутри goto ciklzar ; начало основного цикла заряда************** jamp09 ; btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить goto jamp10 ;если бит =1 то выполнится код внутри ;моргнём зелёным Call pause Call gp4_0 Call pause Call gp4_zel goto podzarad jamp10 jamp08 goto ciklzar ; и переходить обратно для зацикливания ;**************************************************************************************************************************************** ciklfon ; начало основного цикла фонарика clrwdt ; сброс сторожевго таймера и прдделителя clrf FLAGIZM ; обнулить все флаги измерения Call knop2 ;подпрограмма проверка не нажатия кнопки btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить goto ciklfon ; кнопка не отпущена
ciklfonrab clrf FLAGIZM ; обнулить все флаги измерения clrwdt ; сброс сторожевго таймера и прдделителя ;программа выключить заряд bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bsf TRISIO,GP5 ; GP5 на вход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
;обьявить переменные clrf FLAGIZM ; обнулить все флаги измерения ;число 612 3в это число при котором устонавливается порог разряда батареи ;ниже него фонарик просто выключится movlw b'00000010' ;;;;; movwf UMAX_H ; максимальное напряжение старший разряд movlw b'01100110' movwf UMAX_L ; максимальное напряжение младший разряд
clrwdt Call DELAY_ADC ;чтение результата преобразования АЦП Call srav_napr ;подпрограмма сравнения bsf FLAGIZM,2 ;2-й бит в 1 разрешение на включение фонаря ;индикация результата сравнения btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить goto jamp03 ;если бит =0 то выполнится код внутри Call gp4_kr ;0-й бит =0 bcf FLAGIZM,2 ;2-й бит в 0 разрешение на выключение фонаря jamp03 ; btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить goto jamp04 ;если бит =1 то выполнится код внутри Call gp4_zel ;0-й бит =1 bsf FLAGIZM,2 ;2-й бит в 1 разрешение на включение фонаря jamp04 ; ;управление светом фонаря btfsc FLAGIZM,2 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить goto jamp05 ;если бит =0 то выполнится код внутри bcf GPIO,GP1 ;управление светом фонаря 0-выключено bcf GPIO,GP2 ; включение питания контроллера 0-выключено jamp05 ; btfss FLAGIZM,2 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить goto jamp06 ;если бит =1 то выполнится код внутри bsf GPIO,GP1 ;управление светом фонаря 1-включено jamp06 Call knop1 ;подпрограмма проверка нажатия кнопки ;команда на выключение btfsc FLAGIZM,1 ;проверка нажатия кнопки бит=0 то следующее пропустить goto log01 ;если 1-й бит =0 выполняется это условие ниже nop log01 btfss FLAGIZM,1 ;проверка нажатия кнопки бит=1 то следующее пропустить goto log02 ;если 1-й бит =1 выполняется это условие ниже bcf GPIO,GP2 ; включение питания контроллера 0-выключено, кнопка нажималась bcf FLAGIZM,1 ;1-й бит в 0 сброс флага нажатия кнопки bcf GPIO,GP1 ;управление светом фонаря 0-выключено bcf FLAGIZM,2 ;2-й бит в 0 выключение фонаря goto $-1 ;отступить на шаг назад зависнуть навсегда log02
clrwdt ; сброс сторожевго таймера и прдделителя goto ciklfonrab ; и переходить обратно для зацикливания ;**************************************************************************************************************************************** ;ПОДПРОГРАММЫ ;подпрограмма проверка нажатия кнопки knop1 clrwdt ; сброс сторожевго таймера и прдделителя movlw 0ffh ;загрузить 0ffh в регистр w movwf var03 ;загрузить регистр w в var03 loop3 movlw 0ffh ;загрузить 0ffh в регистр w movwf var04 ;загрузить регистр w в var04 loop4 btfsc GPIO,GP3 ;проверка нажатия кнопки бит=0 то следующее пропустить goto next1 ;кнопка удерживается btfss GPIO,GP3 ;проверка нажатия кнопки бит=1 то следующее пропустить goto bad1 ;проверка удержанмя провал next1 decfsz var04,1 ;уменьшить на 1 goto loop4 ;и переходить обратно пока не станет =0 decfsz var03,1 ;уменьшить на 1 goto loop3 ;и переходить обратно пока не станет =0 bsf FLAGIZM,1 ;1-й бит в 1 флаг нажатия кнопки goto endprov1 ;проверка удержанмя успешна bad1 bcf FLAGIZM,1 ;1-й бит в 0 флаг нажатия кнопки endprov1 return ;подпрограмма проверка не нажатия кнопки knop2 clrwdt ; сброс сторожевго таймера и прдделителя movlw 0ffh ;загрузить 0ffh в регистр w movwf var03 ;загрузить регистр w в var03 loop5 movlw 0ffh ;загрузить 0ffh в регистр w movwf var04 ;загрузить регистр w в var04 loop6 btfss GPIO,GP3 ;проверка нажатия кнопки бит=1 то следующее пропустить goto next2 ;кнопка не нажималась btfsc GPIO,GP3 ;проверка нажатия кнопки бит=0 то следующее пропустить goto bad2 ;проверка нажатия провал next2 decfsz var04,1 ;уменьшить на 1 goto loop6 ;и переходить обратно пока не станет =0 decfsz var03,1 ;уменьшить на 1 goto loop5 ;и переходить обратно пока не станет =0 bsf FLAGIZM,3 ;3-й бит в 1 флаг не нажатия кнопки goto endprov2 ;проверка удержанмя успешна bad2 bcf FLAGIZM,3 ;3-й бит в 0 флаг нажатия кнопки endprov2 return ;подпрограмма сравнения srav_napr ;сравним два бита clrwdt ; сброс сторожевго таймера и прдделителя ;проверка в регистра 1 в _H btfsc UMAX_H,1 ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить goto provml11_H ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_H,1 ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить goto provml12_H ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml12_H ;если UMAX_H=0 btfsc U_H,1 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить goto xod11_H ;если бит =0 то выполнится код внутри goto per0_H ;переход при условии биты равны если U_H=0 xod11_H ; btfss U_H,1 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить goto xod12_H ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_H=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod12_H ; goto oconizm11_H ; provml11_H ;если UMAX_H=1 btfsc U_H,1 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить goto xod13_H ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_H=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod13_H ; btfss U_H,1 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить goto xod14_H ;если бит =1 то выполнится код внутри goto per0_H ;переход при условии биты равны если U_H=1 xod14_H ; oconizm11_H ;проверка в регистра 0 в _H per0_H btfsc UMAX_H,0 ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить goto provml01_H ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_H,0 ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить goto provml02_H ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml02_H ;если UMAX_H=0 btfsc U_H,0 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить goto xod01_H ;если бит =0 то выполнится код внутри goto per7_L ;переход при условии биты равны если U_H=0 xod01_H ; btfss U_H,0 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить goto xod02_H ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_H=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod02_H ; goto oconizm01_H ; provml01_H ;если UMAX_H=1 btfsc U_H,0 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить goto xod03_H ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_H=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod03_H ; btfss U_H,0 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить goto xod04_H ;если бит =1 то выполнится код внутри goto per7_L ;переход при условии биты равны если U_H=1 xod04_H ; oconizm01_H ;проверка в регистра 7 в _L per7_L btfsc UMAX_L,7 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml71_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,7 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml72_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml72_L ;если UMAX_H=0 btfsc U_L,7 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod71_L ;если бит =0 то выполнится код внутри goto per6_L ;переход при условии биты равны если U_L=0 xod71_L ; btfss U_L,7 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod72_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod72_L ; goto oconizm71_L ; provml71_L ;если UMAX_L=1 btfsc U_L,7 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod73_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod73_L ; btfss U_L,7 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod74_L ;если бит =1 то выполнится код внутри goto per6_L ;переход при условии биты равны если U_L=1 xod74_L ; oconizm71_L ;проверка в регистра 6 в _L per6_L btfsc UMAX_L,6 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml61_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,6 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml62_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml62_L ;если UMAX_H=0 btfsc U_L,6 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod61_L ;если бит =0 то выполнится код внутри goto per5_L ;переход при условии биты равны если U_L=0 xod61_L ; btfss U_L,6 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod62_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod62_L ; goto oconizm61_L ; provml61_L ;если UMAX_L=1 btfsc U_L,6 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod63_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod63_L ; btfss U_L,6 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod64_L ;если бит =1 то выполнится код внутри goto per5_L ;переход при условии биты равны если U_L=1 xod64_L ; oconizm61_L ;проверка в регистра 5 в _L per5_L btfsc UMAX_L,5 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml51_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,5 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml52_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml52_L ;если UMAX_H=0 btfsc U_L,5 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod51_L ;если бит =0 то выполнится код внутри goto per4_L ;переход при условии биты равны если U_L=0 xod51_L ; btfss U_L,5 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod52_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod52_L ; goto oconizm51_L ; provml51_L ;если UMAX_L=1 btfsc U_L,5 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod53_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod53_L ; btfss U_L,5 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod54_L ;если бит =1 то выполнится код внутри goto per4_L ;переход при условии биты равны если U_L=1 xod54_L ; oconizm51_L ;проверка в регистра 4 в _L per4_L btfsc UMAX_L,4 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml41_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,4 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml42_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml42_L ;если UMAX_H=0 btfsc U_L,4 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod41_L ;если бит =0 то выполнится код внутри goto per3_L ;переход при условии биты равны если U_L=0 xod41_L ; btfss U_L,4 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod42_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod42_L ; goto oconizm41_L ; provml41_L ;если UMAX_L=1 btfsc U_L,4 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod43_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod43_L ; btfss U_L,4 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod44_L ;если бит =1 то выполнится код внутри goto per3_L ;переход при условии биты равны если U_L=1 xod44_L ; oconizm41_L ;проверка в регистра 3 в _L per3_L btfsc UMAX_L,3 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml31_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,3 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml32_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml32_L ;если UMAX_H=0 btfsc U_L,3 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod31_L ;если бит =0 то выполнится код внутри goto per2_L ;переход при условии биты равны если U_L=0 xod31_L ; btfss U_L,3 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod32_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod32_L ; goto oconizm31_L ; provml31_L ;если UMAX_L=1 btfsc U_L,3 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod33_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod33_L ; btfss U_L,3 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod34_L ;если бит =1 то выполнится код внутри goto per2_L ;переход при условии биты равны если U_L=1 xod34_L ; oconizm31_L ;проверка в регистра 2 в _L per2_L btfsc UMAX_L,2 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml21_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,2 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml22_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml22_L ;если UMAX_H=0 btfsc U_L,2 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod21_L ;если бит =0 то выполнится код внутри goto per1_L ;переход при условии биты равны если U_L=0 xod21_L ; btfss U_L,2 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod22_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod22_L ; goto oconizm21_L ; provml21_L ;если UMAX_L=1 btfsc U_L,2 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod23_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod23_L ; btfss U_L,2 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod24_L ;если бит =1 то выполнится код внутри goto per1_L ;переход при условии биты равны если U_L=1 xod24_L ; oconizm21_L ;проверка в регистра 1 в _L per1_L btfsc UMAX_L,1 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml11_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,1 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml12_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml12_L ;если UMAX_H=0 btfsc U_L,1 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod11_L ;если бит =0 то выполнится код внутри goto per0_L ;переход при условии биты равны если U_L=0 xod11_L ; btfss U_L,1 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod12_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod12_L ; goto oconizm11_L ; provml11_L ;если UMAX_L=1 btfsc U_L,1 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod13_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod13_L ; btfss U_L,1 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod14_L ;если бит =1 то выполнится код внутри goto per0_L ;переход при условии биты равны если U_L=1 xod14_L ; oconizm11_L ;проверка в регистра 0 в _L per0_L btfsc UMAX_L,0 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить goto provml01_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд btfss UMAX_L,0 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить goto provml02_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд provml02_L ;если UMAX_H=0 btfsc U_L,0 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod01_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;переход при условии биты равны xod01_L ; btfss U_L,0 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod02_L ;если бит =1 то выполнится код внутри bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod02_L ; goto oconizm01_L ; provml01_L ;если UMAX_L=1 btfsc U_L,0 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить goto xod03_L ;если бит =0 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0 goto oconizm ;запомнить результат сравнения и закончить сравнивание xod03_L ; btfss U_L,0 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить goto xod04_L ;если бит =1 то выполнится код внутри bcf FLAGIZM,0 ;0-й бит в 0 если U_L=1 goto oconizm ;переход при условии биты равны xod04_L ; oconizm01_L oconizm return
;подпрограмма ожидания результата преобразования АЦП DELAY_ADC goto $+1 ;задержка после выбора канала ацп, + два шага goto $+1 goto $+1 bsf ADCON0,GO_DONE ;разрешить преобразование АЦП (установить в 1 1-й бит регистра adcono) btfsc ADCON0,GO_DONE ;проверка окончания преобразование АЦП если GO=0 то следующее пропустить goto $-1 ;отступить на шаг назад bcf INTCON,GIE ;запретить прерывания (установить в 0 7-й бит регистра intcon) bsf STATUS, RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) movf ADRESL,W ;содержимое младшего разряда резултата АЦП в регистр w bcf STATUS, RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) bsf INTCON,GIE ;разрешить прерывания (установить в 1 7-й бит регистра intcon) movwf U_L ;загрузить регистр w в U_L (напряжение младший разряд) movf ADRESH,W ;содержимое старшего разряда резултата АЦП в регистр w movwf U_H ;загрузить регистр w в U_H (напряжение старший разряд) return ;подпрограмма индикации зажеч зелёный GP4 - 1 направление выход gp4_zel bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bcf TRISIO,GP4 ; GP4 на выход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) bcf GPIO,GP4 ; включение диода индикации 0-зелёный return ;подпрограмма индикации зажеч красный GP4 - 0 направление выход gp4_kr bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bcf TRISIO,GP4 ; GP4 на выход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) bsf GPIO,GP4 ; включение диода индикации 1-красный return ;подпрограмма индикации потушить индикацию GP4 направление вход gp4_0 bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bsf TRISIO,GP4 ; GP4 на вход bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) return
;подпорограмма паузы pause clrwdt ; сброс сторожевго таймера и прдделителя movlw 0ffh ;загрузить 0ffh в регистр w movwf var01 ;загрузить регистр w в var01 loop2 movlw 0ffh ;загрузить 0ffh в регистр w movwf var02 ;загрузить регистр w в var02 loop1 decfsz var02,1 ;уменьшить на 1 goto loop1 ;и переходить обратно пока не станет =0 decfsz var01,1 ;уменьшить на 1 goto loop2 ;и переходить обратно пока не станет =0 return ;выход из подпрограммы
просто здесь АЦП мерит напряжение и контроллер результат измерения сравнивает. этого добится было сложновато. в основном все с этим мк делают это на встроеном компараторе здесь АЦП и математика. сам фонарик банален.
И в чём прелесть такого решения? Я, например, тоже стараюсь, по возможности, компаратор использовать вместо АЦП. Конечно, обычно встроенный ИОН имеет гораздо меньшую разрядность, но, часто этого бывает достаточно, а срабатывает он мгновенно. P.S.: Когда вижу, что в программе нет ни одного обработчика прерывания. сразу как-то дальше смотреть уже не хочется.
_________________ ICQ нет, и, в ближайшее время, не будет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения