фонарик на контроллере PIC12F675

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Встал на лапы
Сообщения: 111
Зарегистрирован: Вт дек 15, 2015 18:36:20

Сообщение ivperev »

контроллер управляет сециолизированым драйвером собраным на микросхеме 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								;выход из подпрограммы

;конец программы
			END
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2367
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград

Сообщение Dmitry Dubrovenko »

И в чём вопрос?
ICQ нет, и, в ближайшее время, не будет.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 111
Зарегистрирован: Вт дек 15, 2015 18:36:20

Сообщение ivperev »

просто здесь АЦП мерит напряжение и контроллер результат измерения сравнивает. этого добится было сложновато. в основном все с этим мк делают это на встроеном компараторе здесь АЦП и математика. сам фонарик банален.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2367
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград

Сообщение Dmitry Dubrovenko »

ivperev писал(а):здесь АЦП и математика
И в чём прелесть такого решения?
Я, например, тоже стараюсь, по возможности, компаратор использовать вместо АЦП. Конечно, обычно встроенный ИОН имеет гораздо меньшую разрядность, но, часто этого бывает достаточно, а срабатывает он мгновенно.
P.S.: Когда вижу, что в программе нет ни одного обработчика прерывания. сразу как-то дальше смотреть уже не хочется.
ICQ нет, и, в ближайшее время, не будет.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «PIC»