; Программа работы LC-метра с использованием генераторного метода
; Контроллер ATtiny2313-10PI. Номинальная частота кварца Fo=10'000'000 Гц.
; Индикатор с общим катодом
; Вычисление емкости кондесаторов генераторным методом проводится согласно выражения
; Cx=COEFF_C*[nx*No/no*Nx-1], где
; Ro-точно известное значение опорного резистора, при котором производилась калибровка
; Co-точно известное значение опорного конденсатора, при котором производилась калибровка
; nx-целое число периодов Fo, подсчитанных счетчиком за время измерения Nx периодов колебаний генератора,
; образованного (Cx+Co)*Ro
; no-целое число периодов Fo, подсчитанных счетчиком за время измерения Nx периодов колебаний генератора,
; образованного Ro*Co при калибровке

; Вычисление индуктивности L генераторным методом проводится по выражению
; Lx=COEFF_L*[(nx*No/no*Nx)^2-1]
; где nx-целое число периодов тактовой частоты контроллера (Fo) за время измерения Nx
; no-целое число периодов Fo за время измерения No
; Nx-целое число периодов частоты генератора с подключенным измеряемым элементом за принятое время измерения
; No-целое число периодов частоты генератора с подключенным эталонным элементом за принятое время измерения

; Калибровка

; Нажать кнопку "0". После измерения и запоминания значений no, No о чем свидетельствует
; появление индикации "0.00", кнопку "0" отпустить.
; Подключить конденсатор известной величины к входам "Сx" и проверить правильность показаний.
; При калибровке канала измерения индуктивности вход "Lx" замкнуть накоротко.

; Распредение памяти RAM
; $68- память кода индикатора 100
; $69- память кода индикатора  10
; $6A- память кода индикатора   1
; $6B- память кода индикатора размерности  

; $6C- ячейка признака минусового результата
; $6E- KEY
; $6F- память включенного в данный момент индикатора

; $76...$79 память nx
; $86...$89 память Nx
;***************************************************************************
;PB0-сегмент A
;PB1-сегмент B
;PB2-сегмент C
;PB3-сегмент D
;PB4-сегмент E
;PB5-сегмент F
;PB6-сегмент G
;PB7-сегмент H

;PD2-размерность
;PD3- х1
;PD4- х10
;PD5- х100

;PD0-кнопка ">0<"
;PD1-тублер "C/L"

;PD6-вход ICP

;***************************************************************************
; 26.05.2010
; 18.02.2010

	.INCLUDE "2313def.inc"

	.def	A	=r16
	.def	B	=r17
	.def	H	=r18
	.def	L	=r19
	.def	D	=r20
	.def	E	=r21
	.def	F	=r22
	.def	G	=r23
	.def	J	=r24
	.def	K	=r25

	.equ	DCLK	=0
	.equ	DOUT	=1
	
	.equ	DIAPAZON=$7F
	.equ	RAM_PEREGRUZKA=$7E

	.equ	CATHODE	=$6F
;	.equ	ANODE	=$6F
	.equ	KEY	=$6E
	.equ	MINUS	=$6C
	
	.equ	INDR	=$6B
	.equ	IND1	=$6A
	.equ	IND10	=$69
	.equ	IND100	=$68
;************************************************
	.equ	RAM_COEFF_C	=$90
	.equ	RAM_CONST_C	=$94
	.equ	RAM_CONST_Lo	=$98
	.equ	RAM_CONST_L	=$9C

	.ESEG
	.ORG	$50
;***************************************************************************
; Предполагается, что при измерении емкости Ro=2030 Оm Co=6080 pF
;***************************************************************************
COEFF_C:
	.DB	$00,$5E,$00,$08		; Co*1000*K
E_CONST_C:
	.DB	$03,$4D,$4E,$E0		;65536*65536*No/no
					;
;***************************************************************************
; Предполагается, что при измерении индуктивности Lo=502 mkH Co=6080 pF
;***************************************************************************
COEFF_L:
	.DB	$00,$07,$ED,$72		;
E_CONST_L:
	.DB	$02,$FF,$C8,$09		;65536*65536*No/no
E_END:
;************************************************
	.CSEG

	.ORG	$00
RESET:
	RJMP	START		; On Reset
	SET			; On Interrupt 0
	RETI			; On Interrupt 1

	RJMP	CAPT		; Timer 1 capture
	RJMP	TIMER_COMP1	; Timer 1A compare
;***************************************************************************
;24.05.2010
	ADIW	XL,1
	CPI	XH,10		; время измерения ~16.8 сек
	BRCS	IZM

	SET
IZM:
	RETI
;***************************************************************************
DC_CC:
	.DB	$5F,$6F,$77,$7B
TTB_IND_CC:
	.DB	$3F,$06	; 0,1
	.DB	$5B,$4F	; 2,3
	.DB	$66,$6D	; 4,5
	.DB	$7D,$07	; 6,7
	.DB	$7F,$6F	; 8,9
;	.DB	$73,$23	; p,n
;	.DB	$72,$00	; u,погашен
;***************************************************************************
START:
	LDI	R16,LOW(RAMEND)
	OUT	SPL,R16

	LDI	R20,0b11111111
	OUT	DDRB,R20	;
	CLR	R21
	OUT	PORTB,R21
	
	OUT	DDRD,R20	;
	LDI	R20,0b01111111
	OUT	PORTD,R20
	
	LDI	R20,0b00111100
	OUT	DDRD,R20	;

	CLR	ZH	
	LDI	ZL,$60
	RCALL	CLEAR_R64
	
	CLR	R20
	STS	IND100,R20
	STS	IND10,R20
	STS	IND1,R20
	STS	INDR,R20	;погасить индикатор
;***************************************************************************
	LDI	ZL,LOW(COEFF_C)
	LDI	YL,LOW(COEFF_C+$40)
RAM_E:
	RCALL	EEREAD
	ST	Y,R0
	INC	YL
	INC	ZL
	CPI	ZL,LOW(E_END)
	BRNE	RAM_E
;***************************************************************************
SCHIT:
	CLI
	CLR	ZH

	LDI	A,$80
	OUT	ACSR,A		; OFF ANALOG COMP
	
	STS	MINUS,ZH
	STS	RAM_PEREGRUZKA,ZH
	STS	CATHODE,ZH

	LDI	R16,$23		; разрешить прерывание INT0, свидетельствующее о начале
	OUT	MCUCR,R16	; цикла индикации

	OUT	TCCR1B,ZH
	OUT	TCNT1H,ZH
	OUT	TCNT1L,ZH

	LDI	R18,HIGH(16433)
	OUT	OCR1AH,R18

	LDI	R19,LOW(16433)
	OUT	OCR1AL,R19

	LDI	R20,$40
	OUT	TIMSK,R20	; разрешение OCR1A
	OUT	GIMSK,R20	; разрешение INT0

	SER	R20		
	OUT	TIFR,R20	; сброс FLAG
	OUT	GIFR,R20

	LDI	R20,$01		; разрешение работы Т1
	OUT	TCCR1B,R20

	CLT
	SEI
WAIT_BEGIN_IND:
;	SLEEP
	BRTC	WAIT_BEGIN_IND
;***************************************************************************
; все преобразования осуществляются во время индикации размерности измерения
;***************************************************************************
	CLI
	CLT
	SBIS	PIND,0
	RJMP	CALIBROVKA
	SBIS	PIND,1
	RCALL	RESULT_Lx
	SBIC	PIND,1
	RCALL	RESULT_Cx
RES_GO:
;***************************************************************************
	LDS	R20,RAM_PEREGRUZKA
	TST	R20
	BRNE	PEREGRUZKA
;***************************************************************************
	RCALL	BAND
	LDS	R20,DIAPAZON
	CPI	R20,11
	BRCS	RES_G01
PEREGRUZKA:	
	LDI	R16,$FE		; перегрузка, зажечь сегмент A во всех индикаторах
	MOV	R17,R16
	MOV	R18,R16
	MOV	R19,R16
	RJMP	RES_GO3		; занести код перегрузки прибора
RES_G01:
	RCALL	BIN_BCD
	RCALL	CODIR
	RCALL	INDEX_DEC_POINT
RES_GO3:
	LDS	R20,MINUS
	TST	R20
	BRPL	PLUS
	CBR	R19,$80
PLUS:
	STS	IND100,R16
	STS	IND10,R17
	STS	IND1,R18
	STS	INDR,R19

	RJMP	SCHIT
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
RESULT_Lx:
	RCALL	RABOTA
RESULT_Lx_CAL:
	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив R10...R19
	
	LDI	ZL,LOW(RAM_CONST_L)

	LD	R16,Z+
	LD	R17,Z+
	LD	R18,Z+
	LD	R19,Z	; загрузить 65536*65536*No/no из RAM
	
	RCALL	RES_nox		; загрузить nx
	
	RCALL 	MULT	; результат (65536*65536*No/no)*nx

	RCALL	RES_Nx		; загрузить Nx

	RCALL	DIV	; результат [(65536*65536*No/no)*nx]/Nx

	MOV	R10,R0
	MOV	R11,R1
	MOV	R12,R2
	MOV	R13,R3
	MOV	R14,R4
	MOV	R15,R5
	MOV	R16,R6
	MOV	R17,R7
	MOV	R18,R8
	MOV	R19,R9	; повторить как множимое для получения квадрата числа nx*No*65536/no*Nx

	RCALL 	MULT	; результат {[(65536*65536*No/no)*nx]/Nx}^2
;***************************************************************************
	LDI	R20,1
	
	SUB	R1,R20
	SBC	R0,ZH	; результат {[(No/no)*(nx/Nx)]^2-1}*65536^4

	TST	R0
	BRPL	RES_Lx01
	
	LDI	R20,$80
	STS	MINUS,R20
	
	RCALL	CONV
	
RES_Lx01:
	MOV	R9,R5
	MOV	R8,R4
	MOV	R7,R3
	MOV	R6,R2
	MOV	R5,R1
	MOV	R4,R0
	CLR	R3
	CLR	R2
	CLR	R1
	CLR	R0

	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив R10...R19
	
	LDI	ZL,LOW(RAM_CONST_Lo)
;Q:
	LD	R16,Z+
	LD	R17,Z+
	LD	R18,Z+
	LD	R19,Z

	RCALL 	MULT	; результат Lo*1'000*{[(No/no)*(nx/Nx)]^2-1}

	MOV	R9,R5
	MOV	R8,R4
	MOV	R7,R3
	MOV	R6,R2
	MOV	R5,R1
	MOV	R4,R0
	CLR	R3
	CLR	R2
	CLR	R1
	CLR	R0
		; окончательный результат измерения индуктивности генераторным методом
	RET
;************************************************
RESULT_Cx:
	RCALL	RABOTA
RESULT_Cx_CAL:
	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив R10...R19
	
	LDI	ZL,LOW(RAM_CONST_C)
	LD	R16,Z+
	LD	R17,Z+
	LD	R18,Z+
	LD	R19,Z
	
	RCALL	RES_nox		; загрузить nx
	
	RCALL	MULT		; (65536*65536*No/no)*nx
	
	RCALL	RES_Nx		; загрузить Nx

	RCALL	DIV		; [(65536*65536*No/no)*nx]/Nx
;***************************************************************************
	LDI	R20,1

	SUB	R5,R20
	SBC	R4,ZH
	SBC	R3,ZH
	SBC	R2,ZH
	SBC	R1,ZH
	SBC	R0,ZH		; [(65536*65536*No/no)*(nx/Nx)]-1 0000 0000
	
	TST	R0
	BRPL	RES_Cx01
	
	LDI	R20,$80
	STS	MINUS,R20

	RCALL	CONV	
RES_Cx01:
;***************************************************************************
	LDI	ZL,$0A
	RCALL	CLEAR_R10	;  очистить начальное значение результата

	LDI	ZL,LOW(RAM_COEFF_C)
;	RJMP	Q
	
	LD	R16,Z+
	LD	R17,Z+
	LD	R18,Z+
	LD	R19,Z

	RCALL	MULT	

	MOV	R9,R5
	MOV	R8,R4
	MOV	R7,R3
	MOV	R6,R2
	MOV	R5,R1
	MOV	R4,R0
	CLR	R3
	CLR	R2
	CLR	R1
	CLR	R0
		; окончательный результат измерения емкости генераторным методом
	RET
;***************************************************************************
CALIBROVKA:
	SBIC	PIND,1
	RJMP	CALIBROVKA_C
CALIBROVKA_L:
;***************************************************************************
; полученные значения N и n принимаются за No и no
;65536*65536*No/no
;***************************************************************************
	RCALL	RABOTA
	
	LDI	R21,20
	LDI	ZL,$00
	RCALL	CLEAR0		; очистить массив R0...R19
	
	LDS	R2,$86
	LDS	R3,$87
	LDS	R4,$88
	LDS	R5,$89		; загрузить N*65536^2
	
	LDS	R16,$76
	LDS	R17,$77
	LDS	R18,$78
	LDS	R19,$79		; загрузить n
	
	RCALL	DIV

	STS	RAM_CONST_L+0,R6
	STS	RAM_CONST_L+1,R7
	STS	RAM_CONST_L+2,R8
	STS	RAM_CONST_L+3,R9

	RCALL	RESULT_Lx_CAL
;***************************************************************************
; осуществить запись полученных значений в EEPROM	
	RCALL	SAVE
	RJMP	RES_GO
;***************************************************************************
CALIBROVKA_C:
;65536*65536*No/no
	RCALL	RABOTA

	LDI	R21,20
	LDI	ZL,$00
	RCALL	CLEAR0		; очистить массив R0...R19

	LDS	R2,$86
	LDS	R3,$87
	LDS	R4,$88
	LDS	R5,$89		; загрузить N*65536^2
	
	LDS	R16,$76
	LDS	R17,$77
	LDS	R18,$78
	LDS	R19,$79		; ; nx

	RCALL	DIV
	
	STS	RAM_CONST_C+0,R6
	STS	RAM_CONST_C+1,R7
	STS	RAM_CONST_C+2,R8
	STS	RAM_CONST_C+3,R9

	RCALL	RESULT_Cx_CAL
; осуществить запись полученных значений в EEPROM	
	RCALL	SAVE
	RJMP	RES_GO
;***************************************************************************
INDEX_DEC_POINT:
	MOV	R20,R19		; запомнить младший десятичный разряд
	LDS	R21,DIAPAZON
	CPI	R21,1
	BRNE	IDP2
	SBR	R16,$80		; x.xx
	LDI	R19,$73		; x.xxpF
	RJMP	IDP_OUT
IDP2:
	CPI	R21,2
	BRNE	IDP3
	SBR	R17,$80		; xx.x
	LDI	R19,$73		; xx.xpF
	RJMP	IDP_OUT
IDP3:
	CPI	R21,3
	BRNE	IDP4
	LDI	R19,$73		; xxxpF
	RJMP	IDP_OUT
IDP4:
	CPI	R21,4
	BRNE	IDP5
	SBR	R16,$80		; x.xx
	LDI	R19,$23		; x.xxn
	SBIC	PIND,1
	RJMP	IDP5
	LDI	R19,$72		; x.xxuH
	RJMP	IDP_OUT
IDP5:
	CPI	R21,5
	BRNE	IDP6
	SBR	R17,$80		; xx.x
	LDI	R19,$23		; xx.xnF
	SBIC	PIND,1
	RJMP	IDP6
	LDI	R19,$72		; xx.xuH
	RJMP	IDP_OUT
IDP6:
	CPI	R21,6
	BRNE	IDP7
	LDI	R19,$23		; xxxnF
	SBIC	PIND,1
	RJMP	IDP7
	LDI	R19,$72		; xxxuH
	RJMP	IDP_OUT
IDP7:
	CPI	R21,7
	BRNE	IDP8
	SBR	R16,$80		; x.xx
	LDI	R19,$72		; x.xxuF
	SBIC	PIND,1
	RJMP	IDP8
	MOV	R19,R20
				; x.xxx(mH)
	RJMP	IDP_OUT
IDP8:
	CPI	R21,8
	BRNE	IDP9
	SBR	R17,$80		; xx.x
	LDI	R19,$72		; xx.xuF
	SBIC	PIND,1
	RJMP	IDP9
	MOV	R19,R20		; xx.xx(mH)
	RJMP	IDP_OUT
IDP9:
	CPI	R21,9
	BRNE	IDP10
	LDI	R19,$72		; xxxuF
	SBIC	PIND,1
	RJMP	IDP_OUT
	SBR	R18,$80
	MOV	R19,R20		; xxx.x(mH)
IDP10:
;	CPI	R21,10
;	BRNE	IDP_OUT
;	LDI	R19,$72		; xxxx(uF)
;	SBIC	PIND,1
;	RJMP	IDP_OUT
;	MOV	R19,R20
;	LDI	R19,$72		; xxxx(mH)
IDP_OUT:
	RET
;*************************************************
RES_Nx:
	LDI	ZL,$80

	LDI	YH,$00
	LDI	YL,$0A

	RJMP	GND_SET
;*************************************************
RES_nox:
	LDI	ZL,$70
	
	LDI	YH,$00
	LDI	YL,$00
GND_SET:
	LDI	R20,10
SET_RAM:
	LD	R21,Z+
	ST	Y+,R21
	DEC	R20
	BRNE	SET_RAM
	RET
;************************************************
SAVE:
	PUSH	R0
	PUSH	A
	LDI	ZL,LOW(COEFF_C)
	CLR	YH
	LDI	YL,LOW(RAM_COEFF_C)
E_RAM:
	RCALL	EEREAD
	LD	A,Y
	CPSE	A,R0
	RCALL	R0_A
	INC	YL
	INC	ZL
	CPI	ZL,LOW(E_END)
	BRNE	E_RAM
	POP	A
	POP	R0
	RET
R0_A:
	MOV	R0,A
;************************************************
; Запись в EEPROM
; ZH,ZL -адрес
; R0- данные
;************************************************
EEWRITE:
	SBIC	EECR,EEWE
	RJMP	EEWRITE

	OUT     EEARL,ZL
	OUT     EEDR,R0

	SBI     EECR,EEMWE
	SBI     EECR,EEWE
EEWWAIT:
	SBIC    EECR,EEWE
	RJMP    EEWWAIT

	RET
;************************************************
; Чтение из EEPROM
; ZH,ZL-адрес
; R0-данные
;************************************************
EEREAD:
	OUT     EEARL,ZL
	SBI     EECR,EERE

	IN      R0,EEDR

	RET
;************************************************
CODIR:
	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив индикатора
	
	LDI	R25,4
COD:
	RCALL	SDVIG_4
	LDI	ZL,LOW (TTB_IND_CC*2)
	ADD	ZL,R7
	LPM
	RCALL	SDVIG_8
	
	DEC	R25
	BRNE	COD
	
	RET
;************************************************
SDVIG_4:
	CLR	R7
	
	LDI	R24,4
SD1:
	LSL	R9
	ROL	R8
	ROL	R7
	
	DEC	R24
	BRNE	SD1
	
	RET
;************************************************
SDVIG_8:
	LDI	R24,8
SD9:
	ROL	R0
	ROL	R19
	ROL	R18
	ROL	R17
	ROL	R16

	DEC	R24
	BRNE	SD9
	
	RET
;************************************************
; Программа умножения 80 разрядного числа на 80 разрядное число
; Для получения корректного результата сумма разрядов множимого и множителя должна быть меньше 80 
; R0...R9-MNOGIMOE,R10...R19-MNOGITEL,R20...R29-RAB
; R0...R9-RESULT
; R20...R29-RESULT
; ZL(R30)-TEMP
;************************************************
MULT:
	CLT		; сбос флага ошибки, если это не было сделано при входе в программу
	
	LDI	ZL,80		; установить счетчик сдвигов
		
	CLR	R20
	CLR	R21
	CLR	R22
	CLR	R23
	CLR	R24
	CLR	R25
	CLR	R26
	CLR	R27
	CLR	R28
	CLR	R29		; начальное значение результата
OBRAT:
	LSR	R10
	ROR	R11
	ROR	R12
	ROR	R13
	ROR	R14
	ROR	R15
	ROR	R16
	ROR	R17
	ROR	R18
	ROR	R19		; показать значение младшего разряда множителя в С,
	BRCC	NO_SUMMIR	; С=0 пропустить суммирование
SUMMIR:
					; С=1 суммировать значение множимого с частичным результатом
	ADD	R29,R9
	ADC	R28,R8
	ADC	R27,R7
	ADC	R26,R6
	ADC	R25,R5
	ADC	R24,R4
	ADC	R23,R3
	ADC	R22,R2
	ADC	R21,R1
	ADC	R20,R0
	BRLT	ERROR_MULT	; S-флаг установлен
	BRCS	ERROR_MULT
NO_SUMMIR:
	LSL	R9
	ROL	R8
	ROL	R7
	ROL	R6
	ROL	R5
	ROL	R4
	ROL	R3
	ROL	R2
	ROL	R1
	ROL	R0		; множимое*2

	DEC	ZL
	BRNE	OBRAT

	MOV	R0,R20
	MOV	R1,R21
	MOV	R2,R22
	MOV	R3,R23
	MOV	R4,R24
	MOV	R5,R25
	MOV	R6,R26
	MOV	R7,R27
	MOV	R8,R28
	MOV	R9,R29
		
	RET
		
ERROR_MULT:
	SET
	RET
;**********************************************************************
; Программа деления 78 разрядного числа на 78 разрядное число
; R0...R9-ДЕЛИМОЕ,  R10...R19-ДЕЛИТЕЛЬ!!!!R0...R9-РЕЗУЛЬТАТ
; R20...R29-РЕЗУЛЬТАТ,ZL-TEMP, ZH-ZERO
;**********************************************************************
GDIV_ERROR:
	SET
GDIV_OUT2:
	RET
DIV:
	CLT		; сбос флага ошибки, если это небыло сделано при входе в программу
 		
	CLR	ZH	; zero-регистр

	CLR	R20
	CLR	R21
	CLR	R22
	CLR	R23
	CLR	R24
	CLR	R25
	CLR	R26
	CLR	R27
	CLR	R28
	CLR	R29	; начальное значение результата
;**********************************************************************
; проверка области допустимых значений делимого и делителя
	TST	R0
	BRMI	GDIV_ERROR	; делимое отрицательное, ERROR
		
	CP	R19,R29
	CPC	R18,R28
	CPC	R17,R27
	CPC	R16,R26
	CPC	R15,R25
	CPC	R14,R24
	CPC	R13,R23
	CPC	R12,R22
	CPC	R11,R21
	CPC	R10,R20
	BREQ	GDIV_ERROR	; YES,DELITEL=0, ERROR

	CP	R29,R9
	CPC	R28,R8
	CPC	R27,R7
	CPC	R26,R6
	CPC	R25,R5
	CPC	R24,R4
	CPC	R23,R3
	CPC	R22,R2
	CPC	R21,R1
	CPC	R20,R0
	BREQ	GDIV_OUT2	; YES,DELIMOE=0, REZULTAT=0

	CP	R9,R19
	CPC	R8,R18
	CPC	R7,R17
	CPC	R6,R16
	CPC	R5,R15
	CPC	R4,R14
	CPC	R3,R13
	CPC	R2,R12
	CPC	R1,R11
	CPC	R0,R10
	BRPL	DIV_GO1		; NO, DELITEL<DELIMOGO
	RJMP	DIV_OUT1
DIV_GO1:
	BRNE	DIV_GO
	RJMP	DIV_EQU		; делитель=делимому, результат=1
;***************************************************************************
; выравнивание порядков делителя с делимым
;***************************************************************************
DIV_GO:
	CLR	ZL		; очистить счетчик сдвигов
DIV1:
	CP	R19,R9
	CPC	R18,R8
	CPC	R17,R7
	CPC	R16,R6
	CPC	R15,R5
	CPC	R14,R4
	CPC	R13,R3
	CPC	R12,R2
	CPC	R11,R1
	CPC	R10,R0
	BRCC	DIV2		; YES,DELITEL>DELIMOGO
      		
	LSL	R19
	ROL	R18
	ROL	R17
	ROL	R16
	ROL	R15
	ROL	R14
	ROL	R13
	ROL	R12
	ROL	R11
	ROL	R10		; DELITEL*2
		
	INC	ZL
	CPI	ZL,80
	BRNE	DIV1
;***************************************************************************
; порядкок делителя найден с превышением
;***************************************************************************
DIV2:
T_DIV0:
	CLT
		
	LSL	R9
	ROL	R8
	ROL	R7
	ROL	R6
	ROL	R5
	ROL	R4
	ROL	R3
	ROL	R2
	ROL	R1
	ROL	R0		; делимое или остаток*2

	CP	R19,R9
	CPC	R18,R8
	CPC	R17,R7
	CPC	R16,R6
	CPC	R15,R5
	CPC	R14,R4
	CPC	R13,R3
	CPC	R12,R2
	CPC	R11,R1
	CPC	R10,R0		; делитель больше делимого ?
	BRCS	T_DIV20		; да,оставляем в 0 сооответствующий разряд результата
		
	SET			; нет, взвести в 1 сооответствующий разряд результата
T_DIV20:
	ROL	R29
	ROL	R28
	ROL	R27
	ROL	R26
	ROL	R25
	ROL	R24
	ROL	R23
	ROL	R22
	ROL	R21
	ROL	R20
	BRTS	T_DIV40

	SUB	R9,R19
	SBC	R8,R18
	SBC	R7,R17
	SBC	R6,R16
	SBC	R5,R15
	SBC	R4,R14
	SBC	R3,R13
	SBC	R2,R12
	SBC	R1,R11
	SBC	R0,R10
T_DIV40:
	DEC	ZL
	BRNE	T_DIV0
;***************************************************************************
; проверка остатка для округления результата
DIV_OUT:
	LSL	R9
	ROL	R8
	ROL	R7
	ROL	R6
	ROL	R5
	ROL	R4
	ROL	R3
	ROL	R2
	ROL	R1
	ROL	R0		; остаток*2 или 0.ххх*2

	CP	R9,R19
	CPC	R8,R18
	CPC	R7,R17
	CPC	R6,R16
	CPC	R5,R15
	CPC	R4,R14
	CPC	R3,R13
	CPC	R2,R12
	CPC	R1,R11
	CPC	R0,R10		; делитель больше остатка или остаток >0.5 ?
	BRCS	DIV_OUT1	; нет, остаток <0.5
				; да остаток > 0.5, добавить 1
;***************************************************************************
DIV_EQU:		
	SEC
		
	ADC	R29,ZH		
	ADC	R28,ZH		
	ADC	R27,ZH		
	ADC	R26,ZH		
	ADC	R25,ZH		
	ADC	R24,ZH		
	ADC	R23,ZH		
	ADC	R22,ZH		
	ADC	R21,ZH		
	ADC	R20,ZH		
DIV_OUT1:		
	MOV	R0,R20
	MOV	R1,R21
	MOV	R2,R22
	MOV	R3,R23
	MOV	R4,R24
	MOV	R5,R25
	MOV	R6,R26
	MOV	R7,R27
	MOV	R8,R28
	MOV	R9,R29

	CLT
	RET
;**********************************************************************
; Переделанная под себя программа преобразования от UMUP
; http://electronix.ru/forum/index.php?s=&showtopic=10934&view=findpost&p=324208
;**********************************************************************
BIN_BCD:
	CLR	R25		; BCD OUT 1'000'000'000,100'000'000
	CLR	R26		; BCD OUT 10'000'000,1'000'000
	CLR	R27		; BCD OUT 100'000,10'000
	CLR	R28		; BCD OUT 1'000,100
	CLR	R29		; BCD OUT 10,1

	LDI	R24,32
bin32bcd10:
	subi r29,-0x33	;add 0x33
	sbrs r29, 3	;if carry to bit 3
	subi r29, 3	;subtract 3
	sbrs r29, 7	;if carry to bit 7
	subi r29, 0x30	;subtract 0x30

	subi r28,-0x33      ; \n" /*add 0x33*/
	sbrs r28, 3         ; \n" /*if carry to bit 3,*/
	subi r28, 3         ; \n" /*subtract 3*/
	sbrs r28, 7         ; \n" /*if carry to bit 7,*/
	subi r28, 0x30      ; \n" /*subtract 0x30*/

	subi r27,-0x33       ;\n" /*add 0x33*/
	sbrs r27, 3          ;\n" /*if carry to bit 3,*/
	subi r27, 3          ;\n" /*subtract 3*/
	sbrs r27, 7          ;\n" /*if carry to bit 7,*/
	subi r27, 0x30       ;\n" /*subtract 0x30*/

	subi r26,-0x33       ;\n" /*add 0x33*/
	sbrs r26, 3          ;\n" /*if carry to bit 3,*/
	subi r26, 3          ;\n" /*subtract 3*/
	sbrs r26, 7          ;\n" /*if carry to bit 7,*/
	subi r26, 0x30       ;\n" /*subtract 0x30*/

	subi r25,-0x33       ;\n" /*add 0x33*/
	sbrs r25, 3          ;\n" /*if carry to bit 3,*/
	subi r25, 3          ;\n" /*subtract 3*/
	sbrs r25, 7          ;\n" /*if carry to bit 7,*/
	subi r25, 0x30       ;\n" /*subtract 0x30*/

	lsl r29
	rol r28
	rol r27
	rol r26		; \n" /*shift out buffer*/
	rol r25
   
	sbrc R6, 7	;skip if msbit of input =0*/
	ori  R29, 1        ;set lsb of output*/

	lsl R9
	rol R8
	rol R7		;shift input*/
	rol R6
   
	dec R24		;\n"
	brne bin32bcd10	;repeat for all bits*/

	MOV	R5,R25
	MOV	R6,R26
	MOV	R7,R27
	MOV	R8,R28
	MOV	R9,R29

	RET
;************************************************
CLEAR_R64:
	LDI	R21,$40
	RJMP	CLEAR0
CLEAR_R10:
	LDI	R21,10
CLEAR0:
	CLR	R20
	ST	Z+,R20
	DEC	R21
	BRNE	CLEAR0
	RET
;***************************************************************************
BAND:
	LDI	R20,$01		; начальный диапазон канала C
	SBIS	PIND,1
	LDI	R20,$04		; начальный диапазон канала L
BAND_GO:	
	STS	DIAPAZON,R20
BAND_L:
	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив R10...R19
	
	LDI	R18,$27
	LDI	R19,$0B		; порог сравнения 9'995
	
	CP	R9,R19
	CPC	R8,R18
	CPC	R7,R17
	CPC	R6,R16
	CPC	R5,R15
	CPC	R4,R14
	CPC	R3,R13
	CPC	R2,R12
	CPC	R1,R11
	CPC	R0,R10
	BRCS	BAND_OUT
	
	LDI	ZL,$0A
	RCALL	CLEAR_R10	; очистить массив R10...R19
	LDI	R19,10		; делитель 10
	RCALL	DIV

	LDS	R20,DIAPAZON	
	INC	R20
	STS	DIAPAZON,R20
	CPI	R20,11
	BRCS	BAND_L
BAND_OUT:
	RET
;************************************************
RABOTA:
	CLR	XH
	CLR	XL		; счетчик переполнений Т1=0 

	CLR	R22
	CLR	R23
	CLR	YH
	CLR	YL		; счетчик Nx=0
	
	CLR	R24		; признак начала измерения

	CLT

	LDI	R20,$C8		; OVER_T1+OCR1A+CAPT
	OUT	TIMSK,R20	; разрешение
	OUT	TIFR,R20	; сброс FLAG's OVER_T1, FLAG_ICP
	
	OUT	GIMSK,ZH	; запрет прерываний INT0,INT1

	SEI
WAIT:
;	SLEEP
	BRTC	WAIT
	CLI
W_IND:
	LDI	R20,$40		; OCR1A
	OUT	TIMSK,R20	; разрешение 
	OUT	GIMSK,R20	; разрешение INT0
	
	SER	R20
	OUT	TIFR,R20	; сброс FLAG's OVER_T1, FLAG_ICP
	OUT	GIFR,R20

	CLT
	SEI
WAIT_IND:
;	SLEEP
	BRTC	WAIT_IND	; ожидание полного цикла индикации
	CLI
	CLT
;***************************************************************************
	CPI	XH,11
	BRCS	RAB_OUT
	SER	R20		; перегрузка
	STS	RAM_PEREGRUZKA,R20
RAB_OUT:
; $70...$79-память nx
; $80...$89-память Nx
	RET
;************************************************
CONV:
	COM	R9
	COM	R8
	COM	R7
	COM	R6
	COM	R5
	COM	R4
	COM	R3
	COM	R2
	COM	R1
	COM	R0

	LDI	R20,1
	ADD	R9,R20
	ADC	R8,ZH
	ADC	R7,ZH
	ADC	R6,ZH
	ADC	R5,ZH
	ADC	R4,ZH
	ADC	R3,ZH
	ADC	R2,ZH
	ADC	R1,ZH
	ADC	R0,ZH

	RET
;************************************************
;************************************************
;************************************************
;************************************************
CAPT:
	SBRC	R24,7
	RJMP	CAPT_1
	SBR	R24,$80		; начало цикла измерения
	
	IN	R11,ICR1L
	IN	R10,ICR1H
	CLR	XH
	CLR	XL		; очистить старшее слово nx_begin
		
	RETI
CAPT_1:
	ADIW	YL,1		; Nx=Nx+1
	ADC	R23,ZH
	ADC	R22,ZH
		
	CPI	XL,50		; время измерения закончилось?
	CPC	XH,ZH
	BRCC	CAPT_2		; да
	RETI			; нет
CAPT_2:
	IN	R9,ICR1L
	IN	R8,ICR1H	; конечное значение nx

	SUB	R9,R11
	SBC	R8,R10
	SBC	XL,ZH
	SBC	XH,ZH		; nx-nx_begin
		
	STS	$76,XH
	STS	$77,XL
	STS	$78,R8
	STS	$79,R9		; nx
		
	STS	$86,R22
	STS	$87,R23
	STS	$88,YH
	STS	$89,YL		;Nx
		
	SET
	RETI
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
;***************************************************************************
TIMER_COMP1:
	SEI
	CLR	R20
	LDI	R21,$7F
	OUT	PORTB,R20	; принудительное гашение всех сегментов
	OUT	PORTD,R21	; обратной полярносью
	
	LDI	ZL,LOW(DC_CC*2)
	LDS	R20,CATHODE
	ADD	ZL,R20
	LPM

	LDI	ZL,IND100	; загрузить в ZL адрес IND100
	ADD	ZL,R20
	LD	R21,Z		; содержимое текущего регистра индикации в R21
	
	OUT	PORTD,R0
	OUT	PORTB,R21	; вывод на индикацию
	
	INC	R20
	ANDI	R20,$03		; подготовиться к индикации следующего знака
	STS	CATHODE,R20
	
	IN	R21,OCR1AL
	IN	R20,OCR1AH
	
	LDI	R18,HIGH(16433)
	LDI	R19,LOW(16433)
	
	ADD	R21,R19
	ADC	R20,R18
	
	OUT	OCR1AH,R20
	OUT	OCR1AL,R21	; вывод значения в OCR1A для следующего сравнения

	RETI
;*************************************************
;	END
