;*********************************************************************************************
; Ch-DULED-10.asm					 *
; мигалка для автомобиля
; расширенная программа
;*********************************************************************************************

	list      p=12F683        ; list directive to define processor
	#include <p12F683.inc>    ; processor specific variable definitions
	errorlevel  -302          ; suppress message 302 from list file
	__CONFIG   _FCMEN_ON & _IESO_OFF & _CP_ON & _CPD_ON & _BOD_OFF & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 
;========================================
#define		IFNZ		btfss	STATUS,Z
#define		IFZ			btfsc	STATUS,Z
#define		BANK0		bcf		STATUS,RP0
#define		BANK1		bsf		STATUS,RP0
;========================================
#define		PWM1		b_GPIO,4		; 
#define		PWM2		b_GPIO,0		; 
#define		PWM3		b_GPIO,1		; 
#define		LED1		b_GPIO,5		; 
#define		IRDA_DU		GPIO,2			; 
;========================================
#define 	BeginPWM 	flag_0,0		; бит запуска изменение яркости
#define 	CR		 	flag_0,1		; цикл горения красных светодиодов
#define 	DLI		 	flag_0,2		;
#define 	REG		 	flag_0,3		;
#define 	CIKL		flag_0,4		; 

#define 	ON_OFF 		flag_01,1		; включение освещения
#define 	WHR 		flag_01,2		; цикл горения и цвет белый
#define 	AR		 	flag_01,3		; альфа режим
#define 	BR		 	flag_01,4		; бетта режим
#define 	GR		 	flag_01,5		; гамма режим
#define 	DN		 	flag_01,6		; динамика

;========================================
;bank 0
#define		BITZ_N		flag_12,1		; бит начала байта
#define		BITZ_P		flag_12,2		; бит конца байта
#define		S0			flag_12,3		; бит начала сканирования посылки
#define		S1			flag_12,4		; 
#define		S2			flag_12,5		; 
#define		S3			flag_12,6		; 

;bank 1
#define		KD			flag_13,0		; контроль ожидания синхроимпульса
#define		PBP			flag_13,1		; бит контроля повторного прерывания по большому периоду
#define		P_M_B		flag_13,2		; бит типа текущего периода 0 малый 1-большой
#define		KO			flag_13,3		; 
#define		KMPER		flag_13,4		; контроль малого периода
#define		KBPER		flag_13,5		; контроль большого периода
;========================================
#define		KOD_YES		flag_1,5		; бит данные готовы
#define		pspn		flag_1,6		; бит смены нажатия клавиши
#define		ISOP		flag_1,7		; бит индикации состояния пароля
;========================================
#define 	TABLESIZE   .128			; 
#define 	RAZRD		.126			; 
#define		DAN			.20				; функция залипания клавиши для автонабора.13 от .10
#define		SPUAN		.150				; значение скорости автонабора по умолчанию 18
;========================================
; описание портов клавиатуры
#define		VL_UP		flag_11,0		; клавиша функция слево			16
#define		VL_DN		flag_11,1		; клавиша функция справо		17
#define		CH_UP		flag_11,2		; клавиша параметр больше		32
#define		CH_DN		flag_11,3		; клавиша параметр меньше		33
#define		KL_PF		flag_11,4		; клавиша функция				38
#define		KL_TV		flag_11,5		; клавиша ручного управления	12
#define		KL_EX		flag_11,6		; клавиша быстрый выход			13
;========================================
#define		kl_no	flag_3,0			; бит удержания клавиши
;========================================
	cblock	0x020

;========================================
flag_0									; флаги управления
flag_01									;
PhaseH									;
Yrkost_BLUE								; Holds duty cycle for PWM channel 0 
Yrkost_RED	 							; Holds duty cycle for PWM channel 1
Yrkost_GREEN							; Holds duty cycle for PWM channel 2
skorost									; скорость изменния.
end_stek								;*
;========================================
Phase_BLUE								; 
Phase_RED								; 
Phase_GREEN								; 
PhaseL									; PhaseL и PhaseH проводят синусоидальное местоположение указателя
IntCount								;
;========================================
Temp									;
b_GPIO									; буфер порта
flag_3									; 
flag_11									; 
uskor									; 
uskor_1									;
 
timer_led								; таймер светодиода индикации приема ик-сигнала
b_zad_ind
;========================================
flag_1									; 
flag_12									; 
flag_13                    				; 
synh_bayt								; синхро байт
data_bayt,data_baytp					; байт данных
klav_naj								; переменная формирования длительности нажатия клавиши
chetch_polbit							; счетсик загружаемых полу байт
reg_ik									; приемный порт ИК порта
cicl									; цикл работы
;========================================
;================================
ciklpov
;================================
	endc
	cblock	0x70
w_temp					; variable used for context saving
status_temp				; variable used for context saving
pclath_temp				; variable used for context saving

	endc


;******************************************************************************
;
; Код начинает выполняться отсюда 	
; Это будет помещенный компоновщиком в местоположении памяти bet'n 0 и 4

;STARTUP	CODE 0x0000	
			ORG     0x000             	; processor reset vector
  	goto	Main

	nop
	nop
	nop
;============================================================================================
Interrupt 			;Interrupt Vector
			ORG     0x004             	; interrupt vector location
			movwf	w_temp				; save off current W register contents
			movf	STATUS,w			; move status register into W register
			movwf	status_temp			; save off contents of STATUS register
			
			call	preryvanie			; 
;ISR RestoreData
			movf	status_temp,w		;отыщите копию регистра STATUS
			movwf	STATUS				;восстановите pre-isr содержание регистра STATUS
			swapf	w_temp,f			; 
			swapf	w_temp,w			; restore pre-isr W register contents
		  retfie						; return from interrupt
;============================================================================================
;============================================================================================

;============================================================================================


;Главный раздел кода начинает выполняться отсюда
;============================================================================================
Main
;			call    0x3FF             	; калибровка внутреннего генератора (34E4) 
			bsf     STATUS,RP0        	; set file register bank to 1 
			movlw	b'00110001'			; частота 8 мГц, внутренний генератор
			movwf   OSCCON            	; update register with factory cal value 
			movlw	b'00000000'			; подстройка частоты +/-0 
			movwf   OSCTUNE				;
;======================================== настройка АЦП
			clrf	ANSEL 				; все входы цифровые
;======================================== 
			bcf     STATUS,RP0        	; set file register bank to 0
;======================================== 
			movlw	0x07	 			; отключение компараторов
			movwf	CMCON0	 			;
;======================================== настройка порта
			clrf	GPIO	 			;
			bsf		STATUS,RP0	 		; выбрать банк 1			
			movlw 	b'00000000' 		; настройка порта
			movwf	TRISIO 				;
;======================================== 
			movlw 	b'00001111' 		; перывание по заднему фронту
			movwf	OPTION_REG			; предделитель подключен к сторожевому таймеру
;======================================== 
			movlw 	b'00000000' 		; выключить подтягивающие резисторы GP2
			movwf	WPU 				;
			movlw	b'00000000'			; нет прерываний по входам
			movwf	IOC					;	 			
			bcf		STATUS,RP0	 		; выбрать банк 0
;======================================== 
		; настройка таймера	TMP1		; 
			bcf		STATUS,RP0			; выбрать банк 0
		;	movlw	b'00010001'			; таймер включен, предделитель 8/4 мг = 1:2 - 1 000 000 гц
		;	movwf	T1CON				;
;======================================== 
; очистка памяти данных
			movlw	0x20				; 
			movwf	FSR					; 
ClfMem		clrf	INDF				; 
			incf	FSR,f				; 
			movlw	0x60				;
			subwf	FSR,w				;
			BNZ 	ClfMem				;
;======================================== 
	;Инициализация Прерываний
			movlw	b'10100000'			;Разрешите глобальный и прерывания от ТМР0 и INT0
			movwf	INTCON				;		
;============================================================================================
			bsf		LED1				; 
;
			movlw	.3					;
			movwf	cicl					;	

			bsf		DLI

;============================================================================================
; Главный цикл программы начинается здесь. Процесс сигнала PWM 
; поколение управляется прерываниями Timer0. Программный флажок
; названный 'BeginBWM' установлен в хранении и поиске информации Timer0 в начале 
; новый период PWM. Когда флажок обнаружен в основном цикл,
; измерительный потенциометр выбран, синусоидальный указатель увеличен,
; и новые значения цикла режима работы определены для трех сигналов PWM.
MainLoop
			;==============				;
			clrwdt						; сброс сторожевого таймера++++++

			;==============				;

;========================================
			decfsz	cicl				;
		goto	osnra					;

			btfsc	REG					;
		goto	osnra3					;
			bsf		REG					;
			movlw	.5					;
			movwf	cicl				;
			btfsc	DLI					;
		goto	$+.3					;
			bsf		DLI					;
		goto	$+.2					;
			bcf		DLI					;
		goto	osnra					;
osnra3		bcf		REG					;			
			movlw	.3					;
			movwf	cicl				;

osnra
			btfsc	REG					;
		goto	peremw
;========================================
			movlw	.3
			movwf	ciklpov
rop1
			movlw	.20					;
			movwf	b_zad_ind			;
			bsf		PWM1				;
			bsf		CIKL				;
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			bcf		PWM1				;				
			
			movlw	.50					;
			movwf	b_zad_ind			;
			bsf		CIKL
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			decfsz ciklpov,f			;
		goto	rop1					;

			movlw	.3					;
			movwf	ciklpov				;
rop2
			
			movlw	.20					;
			movwf	b_zad_ind			;
			bsf		PWM2				;
			bsf		CIKL
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			bcf		PWM2				;				
			
			movlw	.50					;
			movwf	b_zad_ind			;
			bsf		CIKL				;
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			decfsz ciklpov,f			;
		goto	rop2					;
		goto	MainLoop				;
;========================================
peremw
			btfsc	DLI					;
		goto	$+.3					;
			movlw	.20					;
		goto	$+.2					;
			movlw	.100				;
			movwf	b_zad_ind			;
			bsf		PWM1				;
			bsf		CIKL				;
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			bcf		PWM1				;				
			
			btfsc	DLI					;
		goto	$+.3					;
			movlw	.20					;
		goto	$+.2					;
			movlw	.100				;
			movwf	b_zad_ind			;
			bsf		PWM2				;
			bsf		CIKL
			clrwdt						; сброс сторожевого таймера++++++			
			btfsc	CIKL				;
		goto	$-.2					;
			bcf		PWM2				;				
			
		goto	MainLoop				;
;========================================


;============================================================================================
;============================================================================================


;============================================================================================
preryvanie								;

;============================================
restime
			movfw	b_GPIO				; переключение фаз на выходе порта
			movwf	GPIO				; одновременное
;============================================
			bcf  	INTCON,T0IF			;сбросить прерывание от таймера
;============================================	
		;	movlw	.150				; инициализировать таймер на длительность 150 тактов
		;	movwf	TMR0				;
;============================================
end_TMP0
;==============	программа формирования задежки индикации символов
		
		
			movf	b_zad_ind,f			; проверить время задежки вышло
			btfss	STATUS,Z			;
			decfsz	b_zad_ind,f			; 
		goto	$+.2
			bcf		CIKL
;========================================================================== 

		return							;
;============================================================================================
;============================================================================================			
				FILL(goto 0x00),0x800-$   ; заполнить все оставшееся место кодом
;============================================================================================
;============================================================================================	
	END
