Универсальный прибор для автомобиля
Часы, термометр, вольтметр, тахометр.





Данное устройство предназначено для контроля напряжения в бортовой сети с точностью 0.1в, измерения температуры в диапазоне от -50 до +125 градусов, измерения частоты вращения коленчатого вала от 0 до 9990 об/мин с точностью 100 об/мин в первом режиме и 10 об/мин во втором ( четырех цилиндровый двигатель), и имеет часы с питанием от встроеной литиевой батарейки. Предусмотрено изменение яркости индикатора - 10 уровней, режим корректировки часов, звуковая сигнализация при частоте вращения двигателя более 4000 об/мин, и напряжении более 14,9 вольт или менее 12 вольт.

Устройство имеет
- входы питания - от замка зажигания
- измерительный вход напряжения - к аккумулятору
- вход датчика цифрового термометра DS18b20
- вход датчика тахометра - подключается к клеме катушки зажигания , куда подходит провод от электронного коммутатора
- две кнопки управления

Питание осуществляется от бортсети автомобиля.Есть встроенная защита от переполюсовки.

Одной кнопкой осуществляется короткий выбор режимов - часы, термометр, вольтметр, тахометр.

Второй кнопкой осуществляется выбор всех режимов -часы, термометр, вольтметр, тахометр, регулировка яркости, коррекция минут, коррекция часов, тахометр с точностью 10 об/мин. При этом в режимах регулировка яркости, коррекция минут, коррекция часов - первой осуществляются изменения.

При включении зажигания прибор устанвливается в режим отображения времени, звуковая индикая отключена.

 

Схема

Кварц установить 4 МГц. Если есть проблема с вольтметром, то подключить 5 ногу процессора к +5 вольт.
На главную

Даташит на индикатор (в приборе установлен вверх ногами для удобства)
скачать
Комплект файлов: прошивка, схема, разводка, исходный текст для разных типов индикаторов
скачать
Фото(1), Фото(2), Фото(3), Фото(4), Фото(5), Фото(6),

Исходный текст программы

 
 ;**********************************************************************
;                                                                     *
;    Filename:	    AUTO_CH.asm                                       *
;    Date:          27.09.2004                                        *
;    File Version:  1.2                                               *
;                                                                     *
;    Author:        BY GARMASH G.V.                                   *
;    Company:                                                         *
;                                                                     * 
;                                                                     *
;**********************************************************************

	list		p=16f73		; list directive to define processor
	#include		; processor specific variable definitions
	
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC



;***** VARIABLE DEFINITIONS * IRQ *****

w_temp			EQU	0x20		; variable used for context saving
w_temp1			EQU	0xA0		; reserve bank1 equivalent of w_temp 
status_temp		EQU	0x21		; variable used for context saving
pclath_temp		EQU	0x22		; variable used for context saving

;********* 1 WIRE************

fCOUNTER:   	EQU 0x23   		; Счетчик только для локального пользования.
fCOUNTER2:  	EQU	0x24   		; Счетчик2.
fBIT_CNT:   	EQU	0x25		; Счетчик прочитанных битов.
fBYTE_CNT:  	EQU	0x26  		; Счетчик прочитанных байтов.
fTEMP:      	EQU	0x27  		; Временный регистр только для локального использования.
CRC:        	EQU	0x28  		; Контрольная сумма.
#define   _1WIRE    PORTA,4 ; Выход на MicroLAN.

;*****************************

FLAG			EQU	0x29		; БИТОВЫЙ РЕГИСТР ФЛАГОВ

#define   FLAG_CHANGE_LEVEL    		FLAG,0 ;
#define   FLAG_CHANGE_LEVEL_1    	FLAG,1 ;  
#define   FLAG_BEEP			   		FLAG,2 ;  
#define   FLAG_3		   	FLAG,3 ;  
#define   FLAG_4   		FLAG,4 ;  FLAG 
#define   FLAG_5    	FLAG,5 ;  FLAG 
#define   FLAG_6    	FLAG,6 ;  FLAG 
#define   FLAG_7    	FLAG,7 ;  FLAG 

;***************TEMP***************

TEMP			EQU	0x2A
TEMP1			EQU	0x2B
TEMP2			EQU	0x2C

;********** I2C *************

_i2c_byte		EQU	0x2D
_tmp			EQU	0x2E
EE_DATA			EQU	0x2F
EE_ADDR			EQU	0x30

; ***********
#define   SCL   PORTA,2 ; I2C SCL PIN 
#define   SDA   PORTA,5 ; I2C SDA PIN 

#define   TRIS_SCL   TRISA^80,2 ; I2C SCL PIN 
#define   TRIS_SDA   TRISA^80,5 ; I2C SDA PIN

;******** ЧАСЫ  I2C ************* 
       							;БИТЫ    		| 8| 4| 2| 1| 8| 4| 2| 1| 
SECONDS		EQU 0x31	;Секунды 		|CH| 10 SEC |  SECOND   |  00-59
MINUTES		EQU 0x32	;Минуты 		| 0| 10 MIN |  MINUTS   |  00-59
HOURS		EQU 0x33	;Часы 		 |12/24| -|10hr |  HOUR     |  00-23/1-12 ;BIT8 = 0-24 HOUR
DAY			EQU 0x34	;День недели 	| 0| 0| 0| 0| 0 | DAY   |  1-7	
DATE		EQU 0x35	;День месяца	| 0| 0|10DAT|    DATE   |  1-31
MONTH		EQU 0x36	;МЕСЯЦ 			| 0| 0| 0|10|   MONTH   |  1-12
YEAR		EQU 0x37	;ГОД         	| 10 YEAR   |    YEAR   |  00-99
						;				|OUT|0|0|SQWE|0|0|RS1|RS0|

;*********** BEEP **************

#define   BEEP_PIN		PORTC,0
#define   KEY1_PIN		PORTB,1
#define   KEY2_PIN		PORTB,2
#define   IN_N_PIN		PORTB,0

;*********** DISPLAY ***********
#define   SEGMENT_1		PORTB,6
#define   SEGMENT_2		PORTB,5
#define   SEGMENT_3		PORTB,4
#define   SEGMENT_4		PORTB,3
#define   SEGMENT_5		PORTB,7


#define   SEGMENT_A		PORTC,6
#define   SEGMENT_B		PORTC,7
#define   SEGMENT_C		PORTC,3
#define   SEGMENT_D		PORTC,1
#define   SEGMENT_E		PORTC,4
#define   SEGMENT_F		PORTC,2
#define   SEGMENT_G		PORTC,5
;*********** DASPLAY RAM ******

DISPLAY_S1			EQU 0x38
DISPLAY_S2			EQU 0x39
DISPLAY_S3			EQU 0x3A
DISPLAY_S4			EQU 0x3B
DISPLAY_S5			EQU 0x3C



fROM_ID0			EQU 0x3D
fROM_ID1			EQU 0x3E
fROM_ID2			EQU 0x3F
fROM_ID3			EQU 0x40
fROM_ID4			EQU 0x41
fROM_ID5			EQU 0x42
fROM_ID6			EQU 0x43
fROM_ID7			EQU 0x44

cicle 			EQU 0x45	; НОМЕР ПРОХОДА ИНДИКАТОРА

MENU_LEVEL			EQU 0x46

R0		EQU 0x47
R1		EQU 0x48
R2		EQU 0x49
R3		EQU 0x4A
R4		EQU 0x4B
R5		EQU 0x4C

LIGHT			EQU 0x4D

CNT_KEY1		EQU 0x4E
CNT_KEY2		EQU 0x4F

POWER_LEVEL_BAT		EQU 0x50
CNT_BEEP		EQU 0x51

TTEMP			EQU 0x52
DECIMAL			EQU 0x53

TEMP_CICLE1		EQU 0x54
TEMP_CICLE2		EQU 0x55

COUNT_N1		EQU 0x56
COUNT_N2		EQU 0x57
N_COUNT1		EQU 0x58
N_COUNT2		EQU 0x59

LONG_COUNT_N1		EQU 0x5A
LONG_COUNT_N2		EQU 0x5B
LONG_N_COUNT1		EQU 0x5C
LONG_N_COUNT2		EQU 0x5D

COUNT_IRQ			EQU 0x5E
LONG_COUNT_IRQ		EQU 0x5F

;   МАКРОСЫ         			
;***************
BANK0   	macro				;------------------------------------------;
				BCF	STATUS,RP1
				BCF	STATUS,RP0
			endm
;***************
BANK1   	macro				;------------------------------------------;
				BCF	STATUS,RP1
				BSF	STATUS,RP0
			endm
;***************
BANK2   	macro				;------------------------------------------;
				BSF	STATUS,RP1
				BCF	STATUS,RP0
			endm
;***************
BANK3   	macro				;------------------------------------------;
				BSF	STATUS,RP1
				BSF	STATUS,RP0
			endm
;***************



;**********************************************************************
			ORG     0x000             ; processor reset vector

			clrf    PCLATH            ; ensure page bits are cleared
  			goto    START              ; go to beginning of program
		

;**********************************************************************

			ORG     0x004             ; interrupt vector location

			movwf   w_temp            ; save off current W register contents
			movf	STATUS,w          ; move status register into W register
			bcf     STATUS,RP0        ; ensure file register bank set to 0
			movwf	status_temp       ; save off contents of STATUS register
			movf	PCLATH,w	  ; move pclath register into w register
			movwf	pclath_temp	  ; save off contents of PCLATH register

		movlw HIGH RETIRQ 	;load high 8-bit address of Table
		movwf PCLATH
; узнавания источника прерывания
		BTFSS	INTCON,INTF
   		GOTO 	IRQ_TIMER
		BCF		INTCON,INTF				
; обработка прерывания не от таймера


		INCFSZ	COUNT_N1,F
		GOTO	RETIRQ_INT


		INCF	COUNT_N2,F


RETIRQ_INT

		INCFSZ	LONG_COUNT_N1,F
		GOTO	RETIRQ


		INCF	LONG_COUNT_N2,F




		GOTO	RETIRQ

IRQ_TIMER 
; обработка прерывания таймера

		BCF	INTCON,T0IF	; RESET FLAG TIMER


		CLRF	TMR0
; СЧИТАТЬ ДО 256
		MOVLW	.22	; таймер считает +1 от загруженного значения при переполнении 
		MOVWF	TMR0		; ЗДЕСЬ МЫ 25.6MKS+2,4= 29 MKS

		INCF	COUNT_IRQ,F
		MOVLW	.20
		XORWF	COUNT_IRQ,W
		BTFSS	STATUS,Z
		GOTO	IRQ_TIMER_1


		CLRF	COUNT_IRQ  ; 0,3 SEC ON CICLE

		MOVF	COUNT_N1,W
		MOVWF	N_COUNT1
		MOVF	COUNT_N2,W
		MOVWF	N_COUNT2
		CLRF	COUNT_N1
		CLRF	COUNT_N2



IRQ_TIMER_1

		INCF	LONG_COUNT_IRQ,F
		MOVLW	.201
		XORWF	LONG_COUNT_IRQ,W
		BTFSS	STATUS,Z
		GOTO	RETIRQ


		CLRF	LONG_COUNT_IRQ ; 3 SEC ON CICLE

		MOVF	LONG_COUNT_N1,W
		MOVWF	LONG_N_COUNT1
		MOVF	LONG_COUNT_N2,W
		MOVWF	LONG_N_COUNT2
		CLRF	LONG_COUNT_N1
		CLRF	LONG_COUNT_N2

		GOTO	RETIRQ



RETIRQ
			bcf     STATUS,RP0        ; ensure file register bank set to 0
			movf	pclath_temp,w	  ; retrieve copy of PCLATH register
			movwf	PCLATH		  ; restore pre-isr PCLATH register contents
			movf    status_temp,w     ; retrieve copy of STATUS register
			movwf	STATUS            ; restore pre-isr STATUS register contents
			swapf   w_temp,f
			swapf   w_temp,w          ; restore pre-isr W register contents
			retfie                    ; return from interrupt
;**********************************************************************


;=================== LCD TABLE ==================================
; Подпрограмма вывода на семисегментный индикатор
;порт В0 -А ........ В7 - Н
;Исходные данные: В регистре W число от 0 до 7F
;Выходные данные: В регистре W код для индикатора
		movlw HIGH LCDTable	;load high 8-bit
							;address of Table
		movwf PCLATH 		;into PCLATH



LCDTable
	  ANDLW		b'00001111'	
	    				
            addwf      PCL,F        ; W + PC -> PC
;            retlw      ; AFBDGCHE = '8,'	hXX            
            retlw      b'00100000' ; 0
            retlw      b'01110110' ; 1
            retlw      b'00001100' ; 2
            retlw      b'00010100' ; 3
            retlw      b'01010010' ; 4
            retlw      b'10010000' ; 5
            retlw      b'10000000' ; 6
            retlw      b'00110110' ; 7
            retlw      b'00000000' ; 8
            retlw      b'00010000' ; 9
            retlw      b'11111110' ;  
            retlw      b'11111110' ;  
            retlw      b'11111110' ;  
            retlw      b'10001000' ; C
            retlw      b'11100100' ; u
            retlw      b'11000110' ; n
    
;**********************************************************************




;##########################################################
; Начало нашей программы
START 
		CALL	_INIT

		CLRF	EE_ADDR				; ПРОВЕРИМ ЛОЯЛЬНОСТЬ  ПОКАЗАНИЙ ЧАСОВ  ЕСЛИ ВЫКЛЮЧЕНЫ(
		CALL	DSTIME_READ_BYTE
		BTFSC	EE_DATA,7
		CALL 	INIT_TIMER				;СЕЛА БАТАРЕЯ ?  ПРОИНИЦИАЛИЗМРУЕМ

		CLRF	MENU_LEVEL






START_MAIN
		MOVLW	.252
		BTFSS	FLAG_BEEP
		MOVWF	CNT_BEEP


		BTFSC	FLAG_BEEP
		BSF		BEEP_PIN
		BTFSS	FLAG_BEEP
		BCF		BEEP_PIN


		CALL	DISPLAY_CICLE	;ОТРАБОТКА ИНДИКАТОРА


		INCFSZ	TEMP1,F
		GOTO	START_MAIN_2

; РАБОТА СО ЗВУКОМ

		INCFSZ		CNT_BEEP,F
		GOTO	START_MAIN_BEEP
		BCF    	FLAG_BEEP




START_MAIN_BEEP







; РАБОТА С КЛАВОЙ - КАЖДЫЕ 10 мс


		BTFSS	FLAG_CHANGE_LEVEL	; CMEНА РЕЖИМА БЕЗ СЕРВИСА
		GOTO	START_MAIN_1A

		INCF	MENU_LEVEL,F
		MOVLW	b'00000011'
		ANDWF	MENU_LEVEL,F
		BCF		FLAG_CHANGE_LEVEL

START_MAIN_1A

		BTFSS	FLAG_CHANGE_LEVEL_1	; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
		GOTO	START_MAIN_1

		INCF	MENU_LEVEL,F
		MOVLW	b'000000111'
		ANDWF	MENU_LEVEL,F
		BCF		FLAG_CHANGE_LEVEL_1




START_MAIN_1

		CALL	SCAN_KEY ; 10 MS


START_MAIN_2


; STANDART MODE

		MOVLW	.0
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	TIME_MODE

		MOVLW	.1
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	VOLT_MODE

		MOVLW	.2
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	TEMPERATUR_MODE

		MOVLW	.3
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	TAHOMETR_MODE


		MOVLW	.4
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	LIGHT_MODE

		MOVLW	.5
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	CHANGE_MIN_MODE

		MOVLW	.6
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	CHANGE_HOUR_MODE

		MOVLW	.7
		XORWF	MENU_LEVEL,W
		BTFSC	STATUS,Z
		CALL	LONG_TAHOMETR_MODE

;SERVICE MODE



		GOTO	START_MAIN

;**********************************************************************
;*********  ПОДПРОГРАММЫ  *********************************************
;**********************************************************************
;**********************************************************************
TAHOMETR_MODE

		INCFSZ	TEMP,F	; ИЗМЕРЯТЬ иногда
		RETURN



		MOVLW	.255
		MOVWF	DISPLAY_S1		

		MOVLW	b'11000111'
		MOVWF	DISPLAY_S4

		MOVLW	b'11110101'
		MOVWF	DISPLAY_S5

;N_COUNT1
; Деление.
; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.

		MOVF	N_COUNT1,W
		MOVWF	R2
		
		MOVLW	.10
		MOVWF	R4
		
		CLRF	R5
		CALL	div_16
		
		MOVF	R2,W
		CALL	LCDTable
		MOVWF	DISPLAY_S2

		MOVF	R0,W
		CALL	LCDTable
		MOVWF	DISPLAY_S3

;> 4000 ОБ.МИН
		MOVLW	.4
		SUBWF	R0,W
		BTFSC	STATUS,C
		BSF		FLAG_BEEP



			RETURN
;**********************************************************************
LONG_TAHOMETR_MODE



;		MOVLW	.255
;		MOVWF	DISPLAY_S1
;		MOVWF	DISPLAY_S2
;		MOVWF	DISPLAY_S3
;

		MOVLW	b'11000111'
		MOVWF	DISPLAY_S4

		MOVLW	b'01111101'
		MOVWF	DISPLAY_S5


		incfsz	TEMP2,f
;		BTFSS	STATUS,Z
		RETURN





;		BTFSS	FLAG_CHANGE_LEVEL	; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
;		RETURN
;
;		BCF		FLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ 
;LONG_N_COUNT1
;LONG_N_COUNT2
; Деление.
; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.
		MOVF	LONG_N_COUNT1,W
		MOVWF	R2

		MOVF	LONG_N_COUNT2,W
		MOVWF	R3
		
		MOVLW	.10
		MOVWF	R4
		CLRF	R5

		CALL	div_16_L
		
		MOVF	R2,W
		CALL	LCDTable
		MOVWF	DISPLAY_S1

		MOVF	R1,W
		MOVWF	R3

		MOVF	R0,W
		MOVWF	R2

		MOVLW	.10
		MOVWF	R4
		CLRF	R5
		CALL	div_16_L

		MOVF	R2,W
		CALL	LCDTable
		MOVWF	DISPLAY_S2

		MOVF	R0,W
		CALL	LCDTable
		MOVWF	DISPLAY_S3


;> 4000 ОБ.МИН
		MOVLW	.4
		SUBWF	R0,W
		BTFSC	STATUS,C
		BSF		FLAG_BEEP


			RETURN

;**********************************************************************
CHANGE_HOUR_MODE

		CALL	TIME_MODE


		MOVLW	.255
		MOVWF	DISPLAY_S1
		MOVWF	DISPLAY_S2	
		


		MOVF	TEMP1,W
		BTFSS	STATUS,Z
		RETURN

		BTFSS	FLAG_CHANGE_LEVEL	; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
		RETURN

		BCF		FLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ 

		MOVLW	.2
		MOVWF	EE_ADDR			; HOUR

		CALL	DSTIME_READ_BYTE	

		MOVF	EE_DATA,W

		ANDLW	b'00001111'  ;HOUR
		MOVWF	R0

		SWAPF	EE_DATA,W

		ANDLW	b'00001111'	; DES HOUR
		MOVWF	R2

		INCF	R0,F
		
		MOVLW	.10
		XORWF	R0,W
		
		BTFSC	STATUS,Z
		GOTO	INC_DES_HOUR


		MOVF	R2,W
		XORLW	.2
		BTFSS	STATUS,Z
		GOTO	INC_DES_HOUR_2

		MOVF	R0,W
		XORLW	.4
		BTFSC	STATUS,Z
		GOTO	INC_DES_HOUR_1



INC_DES_HOUR_2		
		SWAPF	R2,W
		IORWF	R0,W
		MOVWF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN


INC_DES_HOUR

		CLRF	R0			

		INCF	R2,F
		
		MOVLW	.3
		XORWF	R2,W
		
		BTFSC	STATUS,Z
		GOTO	INC_DES_HOUR_1
		
		SWAPF	R2,W
		IORWF	R0,W
		MOVWF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN

INC_DES_HOUR_1
		CLRF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN

;**********************************************************************


;**********************************************************************
CHANGE_MIN_MODE

		CALL	TIME_MODE


		MOVLW	.255
		MOVWF	DISPLAY_S4
		MOVWF	DISPLAY_S3	
		


		MOVF	TEMP1,W
		BTFSS	STATUS,Z
		RETURN

		BTFSS	FLAG_CHANGE_LEVEL	; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
		RETURN

		BCF		FLAG_CHANGE_LEVEL

; ДЕЙСТВИЕ 

		MOVLW	.1
		MOVWF	EE_ADDR			; MIN

		CALL	DSTIME_READ_BYTE	

		MOVF	EE_DATA,W

		ANDLW	b'00001111'  ;MIN
		MOVWF	R0

		SWAPF	EE_DATA,W

		ANDLW	b'00001111'	; DES MIN
		MOVWF	R2

		INCF	R0,F
		
		MOVLW	.10
		XORWF	R0,W
		
		BTFSC	STATUS,Z
		GOTO	INC_DES_MIN
		
		SWAPF	R2,W
		IORWF	R0,W
		MOVWF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN


INC_DES_MIN

		CLRF	R0			

		INCF	R2,F
		
		MOVLW	.6
		XORWF	R2,W
		
		BTFSC	STATUS,Z
		GOTO	INC_DES_MIN_1
		
		SWAPF	R2,W
		IORWF	R0,W
		MOVWF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN

INC_DES_MIN_1
		CLRF	EE_DATA
		CALL	DSTIME_SAVE_BYTE

		RETURN

;**********************************************************************


LIGHT_MODE

		MOVLW	.255
		MOVWF	DISPLAY_S4
		MOVWF	DISPLAY_S5	
		MOVLW	b'11101001'
		MOVWF	DISPLAY_S3

		MOVLW	b'11011111'
		MOVWF	DISPLAY_S2

		MOVLW	.5
		SUBWF	LIGHT,W
		MOVWF	R0
		RRF		R0,W

		CALL	LCDTable
		MOVWF	DISPLAY_S1



		MOVF	TEMP1,W
		BTFSS	STATUS,Z
		RETURN

		BTFSS	FLAG_CHANGE_LEVEL	; CMEНА РЕЖИМА С СЕРВИСНЫМИ РЕЖИМАМИ
		RETURN

		BCF		FLAG_CHANGE_LEVEL

		DECF	LIGHT,F   ; (5 - 50_)
		MOVF	LIGHT,W
		XORLW	.5
		MOVLW	.25
		BTFSC	STATUS,Z
		MOVWF	LIGHT

		DECF	LIGHT,F   ; (5 - 50_)
		MOVF	LIGHT,W
		XORLW	.5
		MOVLW	.25
		BTFSC	STATUS,Z
		MOVWF	LIGHT


		RETURN

;**********************************************************************

VOLT_MODE
		INCFSZ	TEMP,F	; ИЗМЕРЯТЬ иногда
		RETURN


GET_VOLUME_POWER
		BCF		ADCON0,ADON		; DISABLE ADC
		
		BCF		ADCON0,CHS0		; SELECT CHANNEL 0
		BCF		ADCON0,CHS1
		BCF		ADCON0,CHS2

		BSF		ADCON0,ADON		; ENABLE ADC
		
		CALL	DELAY_15MKS		; 16 MKS
		
		BSF		ADCON0,GO_DONE	; START DAC
WAIT_CH0_DAC
		BTFSC	ADCON0,GO_DONE
		GOTO	WAIT_CH0_DAC	
								; DAC-OK
		MOVF	ADRES,W

		MOVWF	POWER_LEVEL_BAT
								; CHANNEL 0 - END
;*****
		BCF		ADCON0,ADON		; DISABLE ADC


		MOVF	POWER_LEVEL_BAT,W
		ANDLW	b'00001111'

	movwf	R2
	movwf	R4

	RLF	R2,1
	RLF	R2,1
	RLF	R2,0

	ADDWF	R4,0
	ADDWF	R4,0	
	movwf	R2	;	DECIMAL*10			
	
	movlw	.16
	movwf	R4
; Деление.
;div_16		 ; R0 = R2 / R4
; В R2 остаток.		
	CALL	div_16
	movf	R0,W

		CALL	LCDTable
		MOVWF	DISPLAY_S2





		SWAPF	POWER_LEVEL_BAT,W
		ANDLW	b'00001111'
		MOVWF   R2		; Деление.
						;div_16		 ; R1:R0 = R3:R2 / R5:R4
						; В R3:R2 остаток.

		MOVLW	.10
		MOVWF   R4
		CALL	div_16

		MOVF	R0,W
		CALL	LCDTable
		MOVWF	DISPLAY_S4

		MOVF	R2,W
		CALL	LCDTable
		MOVWF	DISPLAY_S3


		MOVLW		b'11111101'	;	XX.Xv
		MOVWF		DISPLAY_S5


		MOVLW		b'11100101'
		MOVWF		DISPLAY_S1



;> 15 V	
		MOVLW	.5
		XORWF	R2,W
		BTFSC	STATUS,Z
		BSF		FLAG_BEEP

		MOVLW	.6
		XORWF	R2,W
		BTFSC	STATUS,Z
		BSF		FLAG_BEEP

		MOVLW	.7
		XORWF	R2,W
		BTFSC	STATUS,Z
		BSF		FLAG_BEEP

;< 10 V	
		MOVLW	.0
		XORWF	R0,W
		BTFSC	STATUS,Z
		BSF		FLAG_BEEP

;< 12 V
		MOVLW	.1
		XORWF	R2,W
		BTFSC	STATUS,Z
		BSF		FLAG_BEEP


			RETURN
;**********************************************************************
TEMPERATUR_MODE
;**********************************************************************
		MOVLW		b'11001101'	;	XX.Xc
		MOVWF		DISPLAY_S1

;	проверим на идикаторе до этого была температура

		BTFSS	DISPLAY_S5,5
		GOTO	TEMPERATUR_MODE_1
; если нет то вывести минусы

		MOVLW		b'11011111'	;	---C
		MOVWF		DISPLAY_S2
		MOVWF		DISPLAY_S3
		MOVWF		DISPLAY_S4

		CLRF		TEMP_CICLE1
		MOVLW		.128
		MOVWF		TEMP_CICLE2
		CALL		READ_TEMPERATURE_1ST



TEMPERATUR_MODE_1
		MOVLW		b'11011101'	;	
		MOVWF		DISPLAY_S5


		INCFSZ		TEMP_CICLE1,F
		RETURN	
		INCFSZ		TEMP_CICLE2,F
		RETURN

		MOVLW		.128
		MOVWF		TEMP_CICLE2

;		ПРОЧЕСТЬ ТЕМПЕРАТУРУ

		CALL		READ_TEMPERATURE_2ST

; запустить преобразованиеи 
		CALL		READ_TEMPERATURE_1ST


;ТЕПЕРЬ БУДЕМ ПОКАЗЫВАТЬ 


		BSF		DISPLAY_S5,2 ; DISABLE -


		SWAPF	fROM_ID1,0
		ANDLW	b'00001111'
		BTFSC	STATUS,Z
		GOTO 	NOTMINUS

		BCF		DISPLAY_S5,2 	; "-"

		COMF	fROM_ID0,1
		COMF	fROM_ID1,1
		
NOTMINUS		

		MOVF	fROM_ID0,0
		ANDLW	b'00001111'
		MOVWF	DECIMAL
		
		RRF	fROM_ID0,1
		RRF	fROM_ID0,1
		RRF	fROM_ID0,1
		RRF	fROM_ID0,1
		RRF	fROM_ID0,1
		RRF	TTEMP,1
		RRF	fROM_ID0,1
		RRF	TTEMP,1
		RRF	fROM_ID0,1
		RRF	TTEMP,1
		RRF	fROM_ID0,1
		RRF	TTEMP,1
		
		RRF	fROM_ID1,1
		RRF	TTEMP,1
		RRF	fROM_ID1,1
		RRF	TTEMP,1
		RRF	fROM_ID1,1
		RRF	TTEMP,1
		RRF	fROM_ID1,1
		RRF	TTEMP,1
		
; TEMPERATURA    =  TTEMP.DECIMAL

; Деление.	;div_16 ; R1:R0 = R3:R2 / R5:R4
					; В R3:R2 остаток.


	movf	TTEMP,W
	movwf	R2
	movlw	.10
	movwf	R4
		
	CALL	div_16

	movf	R0,W
		CALL	LCDTable
		MOVWF	DISPLAY_S4 ; ЦЕЛОЕ TTEMP/10

	movf	R2,W
		CALL	LCDTable
		MOVWF	DISPLAY_S3 ; ОСТАТОК TTEMP/10
	
	
		

	movf	DECIMAL,W
	movwf	R2

	RLF	R2,1
	RLF	R2,1
	RLF	R2,0

	ADDWF	DECIMAL,0
	ADDWF	DECIMAL,0	
	movwf	R2	;	DECIMAL*10			
	
	movlw	.16
	movwf	R4
		
	CALL	div_16
	movf	R0,W

		CALL	LCDTable
		MOVWF	DISPLAY_S2	;	DECIMAL*10/16		


		

			RETURN
;**********************************************************************

DELAY_15MKS

	MOVLW	.3
	GOTO	delay

			RETURN
;**********************************************************************
SCAN_KEY
		BTFSC	KEY1_PIN
		CLRF	CNT_KEY1

		BTFSC	KEY2_PIN
		CLRF	CNT_KEY2

		BTFSS	KEY1_PIN
		INCF	CNT_KEY1,F

		BTFSS	KEY2_PIN
		INCF	CNT_KEY2,F

		BTFSC	CNT_KEY1,3
		GOTO	SCAN_KEY_1

		BTFSC	CNT_KEY2,3
		GOTO	SCAN_KEY_2

		RETURN
;FLAG_CHANGE_LEVEL_1
SCAN_KEY_1
		BSF		FLAG_CHANGE_LEVEL
		CLRF	CNT_KEY1
		BSF		FLAG_BEEP

		RETURN
SCAN_KEY_2
		BSF		FLAG_CHANGE_LEVEL_1
		CLRF	CNT_KEY2
		BSF		FLAG_BEEP

		RETURN

;**********************************************************************
TIME_MODE

		MOVLW	.5
		XORWF	cicle,W
		BTFSS	STATUS,Z
		RETURN


		INCFSZ	TEMP,F
		RETURN

		MOVLW	(.255-.25)
		MOVWF	TEMP

		MOVLW	.2
		MOVWF	EE_ADDR			; HOUR

		CALL	DSTIME_READ_BYTE	

		MOVF	EE_DATA,W
		CALL	LCDTable
		MOVWF	DISPLAY_S3

		SWAPF	EE_DATA,W
		CALL	LCDTable
		MOVWF	DISPLAY_S4



		MOVLW	.1
		MOVWF	EE_ADDR			; MIN

		CALL	DSTIME_READ_BYTE	

		MOVF	EE_DATA,W
		CALL	LCDTable
		MOVWF	DISPLAY_S1

		SWAPF	EE_DATA,W
		CALL	LCDTable
		MOVWF	DISPLAY_S2




		MOVLW	.0
		MOVWF	EE_ADDR			; SEC МОРГАТЬ ТОЧКАМИ. 

		CALL	DSTIME_READ_BYTE	


		MOVLW		.255
		MOVWF		DISPLAY_S5

		BTFSS	EE_DATA,0
		RETURN
		
		BCF		DISPLAY_S5,1
		BCF		DISPLAY_S5,4

		RETURN

;**********************************************************************
;**********************************************************************

READ_TEMPERATURE_1ST
		bcf	INTCON,	GIE		; Запретить прерывания

       	call    Reset_1Wire

       	movlw   0xCC		; пропуск пзу
       	call    RW_Byte

       	movlw   0x44		; преобразование температуры
       	call    RW_Byte

		bsf	INTCON,	GIE		; Разрешить  прерывания

		RETURN
; -------------------------------

READ_TEMPERATURE_2ST
		bcf	INTCON,	GIE		; Запретить прерывания

      	call    Reset_1Wire
		
		movlw   0xCC		; пропуск пзу
       	call    RW_Byte

		CALL    Get_TEMP

		bsf	INTCON,	GIE		; Разрешить  прерывания

		RETURN
		
;**********************************************************************



_INIT
;**********************************************************************
; Участок инициализации: установка портов                             *
;**********************************************************************
		BANK0
		BCF		ADCON0,	ADON	; Disable ADC

		CLRF 	PORTA 			; Initialize PORT by
		CLRF 	PORTB 			; clearing output
		CLRF 	PORTC			; data latches

		CLRF 	TMR0

		BSF 	STATUS, RP0 	; Select Bank 1
		MOVLW 	b'00000101'		;RA0,RA1 - ANALOG INPUT,RA3-Vref
		MOVWF 	ADCON1^80 		;Other - as digital 

		MOVLW 	b'00101101' 	; Value used to initialize data direction
		MOVWF 	TRISA^80 		;  

        MOVLW   B'00000111'		; PORTB   ;
        MOVWF   TRISB^80		  	;     

        MOVLW   B'00000000'		; PORTC   ;
        MOVWF   TRISC^80		  	;     

		  	;    
;******* 20 mHz
;				 >--------------PULL UP DISABLE			
;				 |>-------------RB0 INT 0 to 1 
;				 ||>------------TMR0 CONNECT TO CLK/4
;				 |||>-----------
;				 ||||>----------PRESCALER TO TMR0
;				 |||||>--\		   Prescaler -> Timer0,  Для часов
;				 ||||||>-->-----; 1:64, rising edge
;				 |||||||>/	
	movlw      b'01000101'		
	movwf      OPTION_REG^80	
;*****************
; ПОКА ЕЩЕ БАНК 1
	BCF 	TXSTA^80,TXEN ; ПЕРЕДАЧА OFF

; 				 >--------------IRQ PSP			
;				 |>-------------IRQ AD
;				 ||>------------IRQ USART RX
;				 |||>-----------IRQ USART TX
;				 ||||>----------IRQ SPP
;				 |||||>---------IRQ CPP1
;				 ||||||>--------IRQ TMR2
;				 |||||||>-------IRQ TMR1	        
;		MOVLW  b'11110000'	;

		MOVLW  b'00000000'	;  
		MOVWF	PIE1^80		;

;				 |      >-------IRQ CCP2	        
;		MOVLW  b'11110000'	;
		MOVLW  b'00000000'	;  IRQ MODULE
		MOVWF	PIE2^80		;


	BANK0

	BSF		_1WIRE     	; ДЛЯ 1 WIRE 
	BCF 	RCSTA,SPEN	; USART OFF 

; 				 >--------------IRQ ON			
;				 |>-------------IRQ ON PEREPHERIAL
;				 ||>------------IRQ ON TMR0 
;				 |||>-----------IRQ ON RB0 INT
;				 ||||>----------OFF CHANGE PORTB
;				 |||||>---------
;				 ||||||>--------
;				 |||||||>-------	        
		MOVLW  b'10110000'	; IRQ ON
;		MOVLW  b'00000000'	; IRQ off
		MOVWF	INTCON		;
;**********************************************************************
; ЗАВЕРШЕНИЕ ИНИЦИАЛИЗАЦИИ                                            *
;**********************************************************************

		CLRF	FLAG
		CLRF	DISPLAY_S1
		CLRF	DISPLAY_S2
		CLRF	DISPLAY_S3
		CLRF	DISPLAY_S4
		CLRF	DISPLAY_S5
		
		MOVLW	.10
		MOVWF	LIGHT


		BCF		BEEP_PIN	; OFF

		RETURN

;**********************************************************************

DISPLAY_CICLE

; покажем индикатор  полностью за 5 проходов

;		MOVLW	b'00000111'; ПОТУШИМ индикатор 
;		ANDWF	PORTB,F

		MOVLW	b'11111000'; ПОТУШИМ индикатор 
		IORWF	PORTB,F



		MOVF	LIGHT,W
		XORWF	cicle,W

		BTFSC	STATUS,Z
		CLRF	cicle




; узнаем номер прохода 
		MOVF	cicle,W		; в W номер прохода
; табличное ветвление
		btfsc   STATUS,Z
		GOTO 	MCICLE1

		MOVLW	.1
		XORWF	cicle,W	
		btfsc   STATUS,Z
		GOTO 	MCICLE2


		MOVLW	.2
		XORWF	cicle,W	
		btfsc   STATUS,Z
		GOTO 	MCICLE3

		MOVLW	.3
		XORWF	cicle,W	
		btfsc   STATUS,Z
		GOTO 	MCICLE4

		MOVLW	.4
		XORWF	cicle,W	
		btfsc   STATUS,Z
		GOTO 	MCICLE5

		INCF	cicle,F	

		RETURN		
					
MCICLE1:
		INCF	cicle,F		
		MOVLW	b'00000001'
		ANDWF	PORTC,F

		MOVF    DISPLAY_S1,W
		ANDLW	b'11111110'
		IORWF	PORTC,F	

;		BSF		SEGMENT_1		; зажжем этот разряд
		BcF		SEGMENT_1		; зажжем этот разряд

		RETURN

MCICLE2:
		INCF	cicle,F		
		MOVLW	b'00000001'
		ANDWF	PORTC,F

		MOVF    DISPLAY_S2,W
		ANDLW	b'11111110'
		IORWF	PORTC,F	

;		BSF		SEGMENT_2		; зажжем этот разряд
		BcF		SEGMENT_2		; зажжем этот разряд

		
		RETURN

MCICLE3:
		INCF	cicle,F		
		MOVLW	b'00000001'
		ANDWF	PORTC,F

		MOVF    DISPLAY_S3,W
		ANDLW	b'11111110'
		IORWF	PORTC,F	

;		BSF		SEGMENT_3		; зажжем этот разряд
		BcF		SEGMENT_3		; зажжем этот разряд
	
		RETURN

MCICLE4:
		INCF	cicle,F		
		MOVLW	b'00000001'
		ANDWF	PORTC,F

		MOVF    DISPLAY_S4,W
		ANDLW	b'11111110'
		IORWF	PORTC,F	

;		BSF		SEGMENT_4		; зажжем этот разряд
		BcF		SEGMENT_4		; зажжем этот разряд
	
		RETURN

MCICLE5:
		INCF	cicle,F
		
		MOVLW	b'00000001'
		ANDWF	PORTC,F

		MOVF    DISPLAY_S5,W
		ANDLW	b'11111110'
		IORWF	PORTC,F	

;		BSF		SEGMENT_5		; зажжем этот разряд
		BcF		SEGMENT_5		; зажжем этот разряд

		RETURN		
; *********************************************************************
;Примеры использования процедур I2C
; *********************************************************************
DSTIME_READ_BYTE
 	CALL    i2c_start
	MOVLW	0xD0
    MOVWF	_i2c_byte 	;          // control байт с битом WR
    CALL	i2c_write
    MOVF 	EE_ADDR,W
    MOVWF 	_i2c_byte    ;  младший байт адреса памяти
    CALL    i2c_write;  
    CALL    i2c_start;
	MOVLW	0xD1
    MOVWF	_i2c_byte    ;// control байт с битом RD
    CALL    i2c_write
    CALL    i2c_read
    CALL    i2c_stop
    MOVF 	_i2c_byte,W
    MOVWF 	EE_DATA

		RETURN

; *********************************************************************
DSTIME_SAVE_BYTE

    CALL        i2c_start
	MOVLW	0xD0
    MOVWF	_i2c_byte;        ; //control байт с битом WR
    CALL        i2c_write
    MOVF 	EE_ADDR,W
    MOVWF 	_i2c_byte         ;// младший байт адреса памяти
    CALL        i2c_write  
    MOVF 	EE_DATA,W
    MOVWF 	_i2c_byte         ;// записываемые данные
    CALL        i2c_write              
    GOTO        i2c_stop

;		RETURN

;**********************************************************************

; *********************************************************************
;Подпрограммы для работы с шиной I2C   . 100 kHz ДЛЯ 4 мГц ; 
; *********************************************************************
;/*--------- начало примера-----------
; Требуется 2 байта ОЗУ - i2c_byte - в него помещается байт,
; который необходимо вывести на шину, в нем оказывается байт, 
; считанный с шины; tmp - счетчик, используемый в цикле. */
; *********************************************************************
;char i2c_byte; /* рабочий регистр */
;char tmp;      /* счетчик */

i2c_start
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
  		BANK0  
  		bsf 	SCL     ; SCL - 1
		NOP
		NOP		
  		bsf 	SDA     ; SDA - 1
		NOP
		NOP	
		bcf 	SDA     ; SDA - 0
		NOP
		NOP		
  		bcf 	SCL    	; SCL - 0
	RETURN 
; ***********
i2c_stop
  		BANK0 
		bcf SDA     ; SDA - 0
		NOP
		NOP		
  		bsf SCL     ; SCL - 1
		NOP
		NOP	
  		bsf SDA     ; SDA - 1
	RETURN 
; ***********
i2c_write
			movlw 	0x08
            movwf 	_tmp
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
            bcf 	TRIS_SCL          ; SCL - вывод
   			BANK0
  			bcf 	SCL               ; SCL - 0
		NOP
		NOP		
send_bit  
  			bsf 	SDA     		; SDA - 1 выводим 1 на SDA
		NOP
		NOP	
            btfss 	_i2c_byte, 7    ; бит данных - 1 ?
 			bcf 	SDA          	; нет - выводим 0 на SDA
		NOP
		NOP		
  			bsf 	SCL     		; SCL - 1
		NOP
		NOP		
            rlf 	_i2c_byte, F    ; сдвигаем влево байт данных

        	bcf 	SCL          	; SCL - 0
		NOP
		NOP			
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	send_bit        ; нет - переход
                       
         	bsf 	SDA          	; осв. SDA SDA - 1
		NOP
		NOP		
  			bsf 	SCL     		; SCL - 1, получаем ACK-бит и игнорируем его (!)
		NOP
		NOP		         
  			bcf 	SCL    			; SCL - 0 
	RETURN 
; ***********

i2c_read
            movlw 	0x08
            movwf 	_tmp
  			BANK1 
            bsf 	TRIS_SDA        ; SDA - на ввод
           	bcf 	TRIS_SCL        ; SCL - вывод
  			BANK0 
       		bcf 	SCL          	; SCL - на 0
		NOP
		NOP		

read_bit
			rlf 	_i2c_byte, F    ; сдвигаем байт влево
  			bsf 	SCL     		; SCL - 1
		NOP
		NOP		
            bsf 	_i2c_byte, 0    ; устанавливаем бит в 1 ; -NOP
		NOP
		NOP	
            btfss 	SDA        		; SDA - 1?
            bcf 	_i2c_byte, 0    ; нет - устанавливаем бит в 0

  			bcf 	SCL    			; SCL - 0
		NOP
		NOP		
            decfsz 	_tmp, F        	; конец цикла ?
            goto 	read_bit        ; нет - переход
  			BANK1 		
            bcf 	TRIS_SDA          ; SDA - вывод
   			BANK0
	RETURN 
; ***********
;**********************************************************************
INIT_TIMER
		CLRF	EE_DATA
		CALL	DSTIME_SAVE_BYTE 	;0

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;1

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;2

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;3

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;4

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;5

		INCF	EE_ADDR,F
		CALL	DSTIME_SAVE_BYTE	;6

		INCF	EE_ADDR,F
		MOVLW	b'10010000'
		MOVWF	EE_DATA
		goto	DSTIME_SAVE_BYTE	;7

		;RETURN 


;----------------------------------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@ Процедуры для работы с сетью MicroLAN со стороны ведущего.                @
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;
;********   4 MHZ   *************

;******************** MicroLAN ***************************
; Команды сетевого уровня.
READ_ROM_CMD    equ  033h ; Команда "Чтение ПЗУ"
READ_R1990_CMD  equ  00Fh ; Для DS1990A этот код используется вместо 33h.
MATCH_ROM_CMD   equ  055h ; Команда "Совпадение ПЗУ".
SKIP_ROM_CMD    equ  0CCh ; Команда "Пропуск ПЗУ".
;*********************************************************
; W=0 - 772 мкс.
delay:
        movwf   fCOUNTER
D_Loop36:
        decfsz  fCOUNTER,1
        goto    D_Loop36
        return
;-----------------------------------------------------------------------------
Reset_1Wire:   ; Сбрасываем линию на около 500 мкс.
        bcf     _1WIRE
        movlw   .166
        call    delay ; 500 мкс.
        bsf     _1WIRE
        CLRWDT   			; СБРОС СТОРОЖЕВОГО ТАЙМЕРА		
; Пропускаем импульс присутствия.
        movlw   .166
        call    delay ; 500 мкс.
        CLRWDT   			; СБРОС СТОРОЖЕВОГО ТАЙМЕРА		
        return
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_TEMP:
        clrf    CRC
; Сбрасываем все приборы на линии.
;        call    Reset_1Wire
; Выдаем команду "Чтение ".
        movlw   0xBE
        call    RW_Byte
; Читаем ПЗУ.
        movlw   0xFF
        call    RW_Byte ; byte 0.
        movwf   fROM_ID0
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 1.
        movwf   fROM_ID1
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 2.
        movwf   fROM_ID2
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 3.
        movwf   fROM_ID3
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 4.
        movwf   fROM_ID4
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 5.
        movwf   fROM_ID5
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 6.
        movwf   fROM_ID6
        call    DO_CRC
; Читаем CRC.
        movlw   0xFF
        call    RW_Byte ; byte 7 (CRC).
        movwf   fROM_ID7
        subwf   CRC,1
        return
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Возвращает:
; Если ОК, то содержимое ПЗУ в регистрах fROM_ID0:fROM_ID7.
; Если ошибка CRC - флаг C (CARRY) в регистре STATUS установлен.
Get_ROM_ID:
        clrf    CRC
; Сбрасываем все приборы на линии.
        call    Reset_1Wire
; Выдаем команду "Чтение ПЗУ".
        movlw   READ_ROM_CMD
        call    RW_Byte
; Читаем ПЗУ.
        movlw   0xFF
        call    RW_Byte ; byte 0.
        movwf   fROM_ID0
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 1.
        movwf   fROM_ID1
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 2.
        movwf   fROM_ID2
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 3.
        movwf   fROM_ID3
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 4.
        movwf   fROM_ID4
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 5.
        movwf   fROM_ID5
        call    DO_CRC
        movlw   0xFF
        call    RW_Byte ; byte 6.
        movwf   fROM_ID6
        call    DO_CRC
; Читаем CRC.
        movlw   0xFF
        call    RW_Byte ; byte 7 (CRC).
        movwf   fROM_ID7
        subwf   CRC,1
        return

;-----------------------------------------------------------------------------
; Ф-ция ввода/вывода на линию 1-Wire.
; Выводим из W и читаем в W.
RW_Byte:
        movwf   fTEMP
        movlw   d'8' ; 8 бит.
        movwf   fBIT_CNT
RBLoop:
        bcf     _1WIRE ; Обнуляем выход.
; Ждем 2 мкс.
        CLRWDT   			; СБРОС СТОРОЖЕВОГО ТАЙМЕРА		
        nop
        btfsc   fTEMP,0
        bsf     _1WIRE ; Устанавливаем выход.
        rrf     fTEMP,1
; Ждем ~12 мкс.
        movlw   3
        call    delay
        bcf     fTEMP,7 ; Принимаем в тот же TEMP, из которого передаем.
        btfsc   _1WIRE
        bsf     fTEMP,7
; Далее даем время на освобождение линии ведомым.
        movlw   d'20'
        call    delay
; Отпускаем линию.
        bsf     _1WIRE
; Чуть-чуть даем отдохнуть (для медленных эмуляторов). Для Dallas не нужно.
        movlw   d'1'      ; Впоследствии можно удалить при нормальной работе.
        call    delay
; Если 8 бит, то выходим.
        decfsz  fBIT_CNT,1
        goto    RBLoop
; Принятый байт в W.
        movf    fTEMP,0
        return
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в W.
DO_CRC: ; Размер CRC - 8 бит.
        movwf   CRC
        movlw   0x08
        movwf   fBIT_CNT
        movf    CRC,0
DoCRC_Loop:
        xorwf   CRC,0
        movwf   fTEMP
        rrf     fTEMP,0
        movf    CRC,0
        btfsc   STATUS,0
        xorlw   0x18
        movwf   fTEMP
        rrf     fTEMP,0
        movwf   CRC
        bcf     STATUS,0
        rrf     CRC,1
        movf    CRC,0
        decfsz  fBIT_CNT,1
        goto    DoCRC_Loop
        return
;-----------------------------------------------------
;*****************************************************************************
;*    ПРОЦЕДУРА ДЕЛЕНИЯ                                                      *
;*****************************************************************************
		
; Деление.
div_16_L	 ; R1:R0 = R3:R2 / R5:R4
; В R3:R2 остаток.
		        clrf    R0
		        clrf    R1
		        movf    R4,w
		        btfss   STATUS,Z
		        goto    div16_Loop_L
		        movf    R5,w
		        btfss   STATUS,Z
		        goto    div16_Loop_L
		        return
div16_Loop_L:
		; Вычитаем RR5:RR4 из RR3:RR2.
		        movf    R4,w
		        subwf   R2,f     ; F = F - W
		        btfss   STATUS,C
		        decf    R3,f   ; Перенос.
		        btfsc   R3,7
		        goto    div16_exit_L
		        movf    R5,w
		        subwf   R3,f
		        btfss   STATUS,C
		        goto    div16_exit_L
		; Увеличиваем частное на 1.
		        movlw   1
		        addwf   R0,f
		        btfsc   STATUS,C
		        incf    R1,f
		        clrwdt
		        goto    div16_Loop_L
		; Выход.
div16_exit_L:
		        movf    R4,w
		        addwf   R2,f
		;        btfss   STATUS,C
		        incf    R3,f   ; Перенос.
		        movf    R5,w
		        addwf   R3,f
		        return
;		;-----------------------------------------------------------------------------
;


;**********************************************************************

;*****************************************************************************
;*    ПРОЦЕДУРА ДЕЛЕНИЯ                                                      *
;*****************************************************************************

; Деление.
div_16		 ; R0 = R2 / R4
; В R2 остаток.
        clrf    R0
        movf    R4,w
        btfss   STATUS,Z
        goto    div16_Loop
        return
div16_Loop:
; Вычитаем RR4 из RR2.
        movf    R4,w
        subwf   R2,f     ; F = F - W
        btfss   STATUS,C
        goto    div16_exit

; Увеличиваем частное на 1.
        INCF	R0,f
        clrwdt
        goto    div16_Loop
; Выход.
div16_exit:
        movf    R4,w
        addwf   R2,f
        return
;-----------------------------------------------------------------------------



;**********************************************************************


;**********************************************************************
;*********  КОНЕЦ 1 БЛОКА *********************************************
;**********************************************************************


;**********************************************************************
			ORG     0x800 
;**********************************************************************
	NOP
	NOP
	NOP


;*********  ПОДПРОГРАММЫ  *********************************************
;**********************************************************************
;         ПОДПРОГРАММЫ                                                *
;**********************************************************************


;**********************************************************************



	END                       ; directive 'end of program'


 
  

Прошивка процессора

:020000040000FA
:040000008A014F28FA
:08000800A00003088312A1000F
:100010000A08A20000308A008B1C16288B10D60F0D
:100020001228D70ADA0F3328DB0A33280B11810193
:1000300016308100DE0A14305E06031D2628DE011C
:100040005608D8005708D900D601D701DF0AC930B1
:100050005F06031D3328DF015A08DC005B08DD0062
:10006000DA01DB013328831222088A002108830089
:10007000A00E200E090000308A000F3982072034BC
:1000800076340C34143452349034803436340034A2
:100090001034FE34FE34FE348834E434C63428226E
:1000A000B0019222AF1B0A23C601FC30291DD100EA
:1000B00029190714291D07104F22AB0F6F28D10FE4
:1000C00062282911291C6828C60A0330C605291090
:1000D000A91C6E28C60A0730C605A910E021003009
:1000E00046060319F5210130460603194B2102305B
:1000F000460603198E21033046060319902004306A
:10010000460603192B210530460603190021063047
:1001100046060319CD20073046060319A9205528A5
:10012000AA0F0800FF30B800C730BB00F530BC0094
:100130005808C9000A30CB00CC01BB2349083D2038
:10014000B90047083D20BA000430470203182915BA
:100150000800C730BB007D30BC00AC0F08005C0855
:10016000C9005D08CA000A30CB00CC019C234908B5
:100170003D20B8004808CA004708C9000A30CB0033
:10018000CC019C2349083D20B90047083D20BA0016
:1001900004304702031829150800F521FF30B80084
:1001A000B9002B08031D0800291C08002910023083
:1001B000B00092222F080F39C7002F0E0F39C90047
:1001C000C70A0A3047060319F2284908023A031DF4
:1001D000ED284708043A0319FD28490E4704AF00EB
:1001E000A2220800C701C90A033049060319FD28E5
:1001F000490E4704AF00A2220800AF01A222080066
:10020000F521FF30BB00BA002B08031D0800291C94
:10021000080029100130B00092222F080F39C700C2
:100220002F0E0F39C900C70A0A30470603191D29C6
:10023000490E4704AF00A2220800C701C90A0630D0
:10024000490603192829490E4704AF00A2220800D5
:10025000AF01A2220800FF30BB00BC00E930BA00A9
:10026000DF30B90005304D02C700470C3D20B80013
:100270002B08031D0800291C08002910CD034D0878
:10028000053A19300319CD00CD034D08053A193050
:100290000319CD000800AA0F08001F109F111F129C
:1002A0009F121F14DD211F151F1954291E08D0008D
:1002B0001F1050080F39C900CB00C90DC90D490DD9
:1002C0004B074B07C9001030CB00BB2347083D202C
:1002D000B900500E0F39C9000A30CB00BB234708C4
:1002E0003D20BB0049083D20BA00FD30BC00E53090
:1002F000B8000530490603192915063049060319C7
:100300002915073049060319291500304706031936
:10031000291501304906031929150800CD30B80008
:10032000BC1E9A29DF30B900BA00BB00D40180306E
:10033000D5001922DD30BC00D40F0800D50F08000D
:100340008030D500212219223C153E0E0F390319A9
:10035000AC293C11BD09BE093D080F39D300BD0CC5
:10036000BD0CBD0CBD0CBD0CD20CBD0CD20CBD0C1B
:10037000D20CBD0CD20CBE0CD20CBE0CD20CBE0CDE
:10038000D20CBE0CD20C5208C9000A30CB00BB23E1
:1003900047083D20BB0049083D20BA005308C9006A
:1003A000C90DC90D490D53075307C9001030CB00C3
:1003B000BB2347083D20B900080003301C2B080070
:1003C0008618CE010619CF01861CCE0A061DCF0A5B
:1003D000CE19ED29CF19F12908002914CE012915CC
:1003E0000800A914CF012915080005304506031D92
:1003F0000800AA0F0800E630AA000230B0009222DE
:100400002F083D20BA002F0E3D20BB000130B00068
:1004100092222F083D20B8002F0E3D20B900003059
:10042000B0009222FF30BC002F1C0800BC103C1210
:1004300008008B132023CC307223443072238B1797
:1004400008008B132023CC30722329238B1708003C
:10045000031383121F108501860187018101831612
:1004600005309F002D308500073086000030870062
:1004700045308100981200308C0000308D0003134D
:10048000831205169813B0308B00A901B801B90189
:10049000BA01BB01BC010A30CD0007100800F830DA
:1004A00086044D0845060319C501450803196A2A43
:1004B000013045060319722A0230450603197A2ACB
:1004C000033045060319822A0430450603198A2A97
:1004D000C50A0800C50A013087053808FE398704B7
:1004E00006130800C50A013087053908FE3987045C
:1004F00086120800C50A013087053A08FE398704CC
:1005000006120800C50A013087053B08FE3987043A
:1005100086110800C50A013087053C08FE398704AA
:1005200086130800AD22D030AD00C8223008AD00DF
:10053000C822AD22D130AD00C822EB22BE222D0848
:10054000AF000800AD22D030AD00C8223008AD00A9
:10055000C8222F08AD00C822BE2A031383168512B5
:100560000511031383120515000000008516000015
:10057000000085120000000005110800031383121B
:100580008512000000000515000000008516080017
:100590000830AE000313831685120511031383126E
:1005A000051100000000851600000000AD1F851237
:1005B00000000000051500000000AD0D0511000051
:1005C0000000AE0BD32A85160000000005150000C0
:1005D0000000051108000830AE00031383168516CD
:1005E000051103138312051100000000AD0D051560
:1005F000000000002D1400000000851E2D100511C4
:1006000000000000AE0BF62A0313831685120313B5
:1006100083120800AF01A222B00AA222B00AA222CD
:10062000B00AA222B00AA222B00AA222B00AA222D2
:10063000B00A9030AF00A22AA300A30B1D2B080024
:100640000512A6301C2305166400A6301C23640086
:100650000800A801BE307223FF307223BD00892339
:10066000FF307223BE008923FF307223BF0089232D
:10067000FF307223C0008923FF307223C100892319
:10068000FF307223C2008923FF307223C300892305
:10069000FF307223C400A8020800A80120233330D1
:1006A0007223FF307223BD008923FF307223BE0006
:1006B0008923FF307223BF008923FF307223C000DB
:1006C0008923FF307223C1008923FF307223C200C7
:1006D0008923FF307223C3008923FF307223C400B3
:1006E000A8020800A7000830A50005126400000059
:1006F00027180516A70C03301C23A713051AA717E4
:1007000014301C23051601301C23A50B752B27085C
:100710000800A8000830A50028082806A700270C14
:1007200028080318183AA700270CA8000310A80CE3
:100730002808A50B8D2B0800C701C8014B08031D15
:10074000A52B4C08031DA52B08004B08C902031C50
:10075000CA03CA1BB52B4C08CA02031CB52B0130B7
:10076000C7070318C80A6400A52B4B08C907CA0AA3
:100770004C08CA070800C7014B08031DC02B08001E
:100780004B08C902031CC72BC70A6400C02B4B08C7
:04079000C90708008D
:06100000000000000000EA
:02400E00F23F7F
:00000001FF

  

Устройство размещается в стандартном пластмассовом корпусе размерами 60*80*15 мм.

О некоторых других моих разработках можно почитать на www.picping.narod.ru.

Гармаш Геннадий.

 

Hosted by uCoz