
;CodeVisionAVR C Compiler V3.12 Advanced
;(C) Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
;http://www.hpinfotech.com

;Build configuration    : Release
;Chip type              : ATtiny2313A
;Program type           : Application
;Clock frequency        : 14,745600 MHz
;Memory model           : Tiny
;Optimize for           : Size
;(s)printf features     : int, width
;(s)scanf features      : int, width
;External RAM size      : 0
;Data Stack size        : 32 byte(s)
;Heap size              : 0 byte(s)
;Promote 'char' to 'int': Yes
;'char' is unsigned     : Yes
;8 bit enums            : Yes
;Global 'const' stored in FLASH: No
;Enhanced function parameter passing: Yes
;Enhanced core instructions: On
;Automatic register allocation for global variables: On
;Smart register allocation: On

	#define _MODEL_TINY_

	#pragma AVRPART ADMIN PART_NAME ATtiny2313A
	#pragma AVRPART MEMORY PROG_FLASH 2048
	#pragma AVRPART MEMORY EEPROM 128
	#pragma AVRPART MEMORY INT_SRAM SIZE 128
	#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

	.LISTMAC
	.EQU UDRE=0x5
	.EQU RXC=0x7
	.EQU USR=0xB
	.EQU UDR=0xC
	.EQU EERE=0x0
	.EQU EEWE=0x1
	.EQU EEMWE=0x2
	.EQU EECR=0x1C
	.EQU EEDR=0x1D
	.EQU EEARL=0x1E
	.EQU WDTCR=0x21
	.EQU WDTCSR=0x21
	.EQU MCUSR=0x34
	.EQU MCUCR=0x35
	.EQU SPL=0x3D
	.EQU SREG=0x3F
	.EQU GPIOR0=0x13
	.EQU GPIOR1=0x14
	.EQU GPIOR2=0x15

	.DEF R0X0=R0
	.DEF R0X1=R1
	.DEF R0X2=R2
	.DEF R0X3=R3
	.DEF R0X4=R4
	.DEF R0X5=R5
	.DEF R0X6=R6
	.DEF R0X7=R7
	.DEF R0X8=R8
	.DEF R0X9=R9
	.DEF R0XA=R10
	.DEF R0XB=R11
	.DEF R0XC=R12
	.DEF R0XD=R13
	.DEF R0XE=R14
	.DEF R0XF=R15
	.DEF R0X10=R16
	.DEF R0X11=R17
	.DEF R0X12=R18
	.DEF R0X13=R19
	.DEF R0X14=R20
	.DEF R0X15=R21
	.DEF R0X16=R22
	.DEF R0X17=R23
	.DEF R0X18=R24
	.DEF R0X19=R25
	.DEF R0X1A=R26
	.DEF R0X1B=R27
	.DEF R0X1C=R28
	.DEF R0X1D=R29
	.DEF R0X1E=R30
	.DEF R0X1F=R31

	.EQU __SRAM_START=0x0060
	.EQU __SRAM_END=0x00DF
	.EQU __DSTACK_SIZE=0x0020
	.EQU __HEAP_SIZE=0x0000
	.EQU __CLEAR_SRAM_SIZE=__SRAM_END-__SRAM_START+1

	.MACRO __CPD1N
	CPI  R30,LOW(@0)
	LDI  R26,HIGH(@0)
	CPC  R31,R26
	LDI  R26,BYTE3(@0)
	CPC  R22,R26
	LDI  R26,BYTE4(@0)
	CPC  R23,R26
	.ENDM

	.MACRO __CPD2N
	CPI  R26,LOW(@0)
	LDI  R30,HIGH(@0)
	CPC  R27,R30
	LDI  R30,BYTE3(@0)
	CPC  R24,R30
	LDI  R30,BYTE4(@0)
	CPC  R25,R30
	.ENDM

	.MACRO __CPWRR
	CP   R@0,R@2
	CPC  R@1,R@3
	.ENDM

	.MACRO __CPWRN
	CPI  R@0,LOW(@2)
	LDI  R30,HIGH(@2)
	CPC  R@1,R30
	.ENDM

	.MACRO __ADDB1MN
	SUBI R30,LOW(-@0-(@1))
	.ENDM

	.MACRO __ADDB2MN
	SUBI R26,LOW(-@0-(@1))
	.ENDM

	.MACRO __ADDW1MN
	SUBI R30,LOW(-@0-(@1))
	SBCI R31,HIGH(-@0-(@1))
	.ENDM

	.MACRO __ADDW2MN
	SUBI R26,LOW(-@0-(@1))
	SBCI R27,HIGH(-@0-(@1))
	.ENDM

	.MACRO __ADDW1FN
	SUBI R30,LOW(-2*@0-(@1))
	SBCI R31,HIGH(-2*@0-(@1))
	.ENDM

	.MACRO __ADDD1FN
	SUBI R30,LOW(-2*@0-(@1))
	SBCI R31,HIGH(-2*@0-(@1))
	SBCI R22,BYTE3(-2*@0-(@1))
	.ENDM

	.MACRO __ADDD1N
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	SBCI R22,BYTE3(-@0)
	SBCI R23,BYTE4(-@0)
	.ENDM

	.MACRO __ADDD2N
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	SBCI R24,BYTE3(-@0)
	SBCI R25,BYTE4(-@0)
	.ENDM

	.MACRO __SUBD1N
	SUBI R30,LOW(@0)
	SBCI R31,HIGH(@0)
	SBCI R22,BYTE3(@0)
	SBCI R23,BYTE4(@0)
	.ENDM

	.MACRO __SUBD2N
	SUBI R26,LOW(@0)
	SBCI R27,HIGH(@0)
	SBCI R24,BYTE3(@0)
	SBCI R25,BYTE4(@0)
	.ENDM

	.MACRO __ANDBMNN
	LDS  R30,@0+(@1)
	ANDI R30,LOW(@2)
	STS  @0+(@1),R30
	.ENDM

	.MACRO __ANDWMNN
	LDS  R30,@0+(@1)
	ANDI R30,LOW(@2)
	STS  @0+(@1),R30
	LDS  R30,@0+(@1)+1
	ANDI R30,HIGH(@2)
	STS  @0+(@1)+1,R30
	.ENDM

	.MACRO __ANDD1N
	ANDI R30,LOW(@0)
	ANDI R31,HIGH(@0)
	ANDI R22,BYTE3(@0)
	ANDI R23,BYTE4(@0)
	.ENDM

	.MACRO __ANDD2N
	ANDI R26,LOW(@0)
	ANDI R27,HIGH(@0)
	ANDI R24,BYTE3(@0)
	ANDI R25,BYTE4(@0)
	.ENDM

	.MACRO __ORBMNN
	LDS  R30,@0+(@1)
	ORI  R30,LOW(@2)
	STS  @0+(@1),R30
	.ENDM

	.MACRO __ORWMNN
	LDS  R30,@0+(@1)
	ORI  R30,LOW(@2)
	STS  @0+(@1),R30
	LDS  R30,@0+(@1)+1
	ORI  R30,HIGH(@2)
	STS  @0+(@1)+1,R30
	.ENDM

	.MACRO __ORD1N
	ORI  R30,LOW(@0)
	ORI  R31,HIGH(@0)
	ORI  R22,BYTE3(@0)
	ORI  R23,BYTE4(@0)
	.ENDM

	.MACRO __ORD2N
	ORI  R26,LOW(@0)
	ORI  R27,HIGH(@0)
	ORI  R24,BYTE3(@0)
	ORI  R25,BYTE4(@0)
	.ENDM

	.MACRO __DELAY_USB
	LDI  R24,LOW(@0)
__DELAY_USB_LOOP:
	DEC  R24
	BRNE __DELAY_USB_LOOP
	.ENDM

	.MACRO __DELAY_USW
	LDI  R24,LOW(@0)
	LDI  R25,HIGH(@0)
__DELAY_USW_LOOP:
	SBIW R24,1
	BRNE __DELAY_USW_LOOP
	.ENDM

	.MACRO __GETD1S
	LDD  R30,Y+@0
	LDD  R31,Y+@0+1
	LDD  R22,Y+@0+2
	LDD  R23,Y+@0+3
	.ENDM

	.MACRO __GETD2S
	LDD  R26,Y+@0
	LDD  R27,Y+@0+1
	LDD  R24,Y+@0+2
	LDD  R25,Y+@0+3
	.ENDM

	.MACRO __PUTD1S
	STD  Y+@0,R30
	STD  Y+@0+1,R31
	STD  Y+@0+2,R22
	STD  Y+@0+3,R23
	.ENDM

	.MACRO __PUTD2S
	STD  Y+@0,R26
	STD  Y+@0+1,R27
	STD  Y+@0+2,R24
	STD  Y+@0+3,R25
	.ENDM

	.MACRO __PUTDZ2
	STD  Z+@0,R26
	STD  Z+@0+1,R27
	STD  Z+@0+2,R24
	STD  Z+@0+3,R25
	.ENDM

	.MACRO __CLRD1S
	STD  Y+@0,R30
	STD  Y+@0+1,R30
	STD  Y+@0+2,R30
	STD  Y+@0+3,R30
	.ENDM

	.MACRO __POINTB1MN
	LDI  R30,LOW(@0+(@1))
	.ENDM

	.MACRO __POINTW1MN
	LDI  R30,LOW(@0+(@1))
	LDI  R31,HIGH(@0+(@1))
	.ENDM

	.MACRO __POINTD1M
	LDI  R30,LOW(@0)
	LDI  R31,HIGH(@0)
	LDI  R22,BYTE3(@0)
	LDI  R23,BYTE4(@0)
	.ENDM

	.MACRO __POINTW1FN
	LDI  R30,LOW(2*@0+(@1))
	LDI  R31,HIGH(2*@0+(@1))
	.ENDM

	.MACRO __POINTD1FN
	LDI  R30,LOW(2*@0+(@1))
	LDI  R31,HIGH(2*@0+(@1))
	LDI  R22,BYTE3(2*@0+(@1))
	LDI  R23,BYTE4(2*@0+(@1))
	.ENDM

	.MACRO __POINTB2MN
	LDI  R26,LOW(@0+(@1))
	.ENDM

	.MACRO __POINTW2MN
	LDI  R26,LOW(@0+(@1))
	LDI  R27,HIGH(@0+(@1))
	.ENDM

	.MACRO __POINTW2FN
	LDI  R26,LOW(2*@0+(@1))
	LDI  R27,HIGH(2*@0+(@1))
	.ENDM

	.MACRO __POINTD2FN
	LDI  R26,LOW(2*@0+(@1))
	LDI  R27,HIGH(2*@0+(@1))
	LDI  R24,BYTE3(2*@0+(@1))
	LDI  R25,BYTE4(2*@0+(@1))
	.ENDM

	.MACRO __POINTBRM
	LDI  R@0,LOW(@1)
	.ENDM

	.MACRO __POINTWRM
	LDI  R@0,LOW(@2)
	LDI  R@1,HIGH(@2)
	.ENDM

	.MACRO __POINTBRMN
	LDI  R@0,LOW(@1+(@2))
	.ENDM

	.MACRO __POINTWRMN
	LDI  R@0,LOW(@2+(@3))
	LDI  R@1,HIGH(@2+(@3))
	.ENDM

	.MACRO __POINTWRFN
	LDI  R@0,LOW(@2*2+(@3))
	LDI  R@1,HIGH(@2*2+(@3))
	.ENDM

	.MACRO __GETD1N
	LDI  R30,LOW(@0)
	LDI  R31,HIGH(@0)
	LDI  R22,BYTE3(@0)
	LDI  R23,BYTE4(@0)
	.ENDM

	.MACRO __GETD2N
	LDI  R26,LOW(@0)
	LDI  R27,HIGH(@0)
	LDI  R24,BYTE3(@0)
	LDI  R25,BYTE4(@0)
	.ENDM

	.MACRO __GETB1MN
	LDS  R30,@0+(@1)
	.ENDM

	.MACRO __GETB1HMN
	LDS  R31,@0+(@1)
	.ENDM

	.MACRO __GETW1MN
	LDS  R30,@0+(@1)
	LDS  R31,@0+(@1)+1
	.ENDM

	.MACRO __GETD1MN
	LDS  R30,@0+(@1)
	LDS  R31,@0+(@1)+1
	LDS  R22,@0+(@1)+2
	LDS  R23,@0+(@1)+3
	.ENDM

	.MACRO __GETBRMN
	LDS  R@0,@1+(@2)
	.ENDM

	.MACRO __GETWRMN
	LDS  R@0,@2+(@3)
	LDS  R@1,@2+(@3)+1
	.ENDM

	.MACRO __GETWRZ
	LDD  R@0,Z+@2
	LDD  R@1,Z+@2+1
	.ENDM

	.MACRO __GETD2Z
	LDD  R26,Z+@0
	LDD  R27,Z+@0+1
	LDD  R24,Z+@0+2
	LDD  R25,Z+@0+3
	.ENDM

	.MACRO __GETB2MN
	LDS  R26,@0+(@1)
	.ENDM

	.MACRO __GETW2MN
	LDS  R26,@0+(@1)
	LDS  R27,@0+(@1)+1
	.ENDM

	.MACRO __GETD2MN
	LDS  R26,@0+(@1)
	LDS  R27,@0+(@1)+1
	LDS  R24,@0+(@1)+2
	LDS  R25,@0+(@1)+3
	.ENDM

	.MACRO __PUTB1MN
	STS  @0+(@1),R30
	.ENDM

	.MACRO __PUTW1MN
	STS  @0+(@1),R30
	STS  @0+(@1)+1,R31
	.ENDM

	.MACRO __PUTD1MN
	STS  @0+(@1),R30
	STS  @0+(@1)+1,R31
	STS  @0+(@1)+2,R22
	STS  @0+(@1)+3,R23
	.ENDM

	.MACRO __PUTB1EN
	LDI  R26,LOW(@0+(@1))
	LDI  R27,HIGH(@0+(@1))
	RCALL __EEPROMWRB
	.ENDM

	.MACRO __PUTW1EN
	LDI  R26,LOW(@0+(@1))
	LDI  R27,HIGH(@0+(@1))
	RCALL __EEPROMWRW
	.ENDM

	.MACRO __PUTD1EN
	LDI  R26,LOW(@0+(@1))
	LDI  R27,HIGH(@0+(@1))
	RCALL __EEPROMWRD
	.ENDM

	.MACRO __PUTBR0MN
	STS  @0+(@1),R0
	.ENDM

	.MACRO __PUTBMRN
	STS  @0+(@1),R@2
	.ENDM

	.MACRO __PUTWMRN
	STS  @0+(@1),R@2
	STS  @0+(@1)+1,R@3
	.ENDM

	.MACRO __PUTBZR
	STD  Z+@1,R@0
	.ENDM

	.MACRO __PUTWZR
	STD  Z+@2,R@0
	STD  Z+@2+1,R@1
	.ENDM

	.MACRO __GETW1R
	MOV  R30,R@0
	MOV  R31,R@1
	.ENDM

	.MACRO __GETW2R
	MOV  R26,R@0
	MOV  R27,R@1
	.ENDM

	.MACRO __GETWRN
	LDI  R@0,LOW(@2)
	LDI  R@1,HIGH(@2)
	.ENDM

	.MACRO __PUTW1R
	MOV  R@0,R30
	MOV  R@1,R31
	.ENDM

	.MACRO __PUTW2R
	MOV  R@0,R26
	MOV  R@1,R27
	.ENDM

	.MACRO __ADDWRN
	SUBI R@0,LOW(-@2)
	SBCI R@1,HIGH(-@2)
	.ENDM

	.MACRO __ADDWRR
	ADD  R@0,R@2
	ADC  R@1,R@3
	.ENDM

	.MACRO __SUBWRN
	SUBI R@0,LOW(@2)
	SBCI R@1,HIGH(@2)
	.ENDM

	.MACRO __SUBWRR
	SUB  R@0,R@2
	SBC  R@1,R@3
	.ENDM

	.MACRO __ANDWRN
	ANDI R@0,LOW(@2)
	ANDI R@1,HIGH(@2)
	.ENDM

	.MACRO __ANDWRR
	AND  R@0,R@2
	AND  R@1,R@3
	.ENDM

	.MACRO __ORWRN
	ORI  R@0,LOW(@2)
	ORI  R@1,HIGH(@2)
	.ENDM

	.MACRO __ORWRR
	OR   R@0,R@2
	OR   R@1,R@3
	.ENDM

	.MACRO __EORWRR
	EOR  R@0,R@2
	EOR  R@1,R@3
	.ENDM

	.MACRO __GETWRS
	LDD  R@0,Y+@2
	LDD  R@1,Y+@2+1
	.ENDM

	.MACRO __PUTBSR
	STD  Y+@1,R@0
	.ENDM

	.MACRO __PUTWSR
	STD  Y+@2,R@0
	STD  Y+@2+1,R@1
	.ENDM

	.MACRO __MOVEWRR
	MOV  R@0,R@2
	MOV  R@1,R@3
	.ENDM

	.MACRO __INWR
	IN   R@0,@2
	IN   R@1,@2+1
	.ENDM

	.MACRO __OUTWR
	OUT  @2+1,R@1
	OUT  @2,R@0
	.ENDM

	.MACRO __CALL1MN
	LDS  R30,@0+(@1)
	LDS  R31,@0+(@1)+1
	ICALL
	.ENDM

	.MACRO __CALL1FN
	LDI  R30,LOW(2*@0+(@1))
	LDI  R31,HIGH(2*@0+(@1))
	RCALL __GETW1PF
	ICALL
	.ENDM

	.MACRO __CALL2EN
	PUSH R26
	PUSH R27
	LDI  R26,LOW(@0+(@1))
	LDI  R27,HIGH(@0+(@1))
	RCALL __EEPROMRDW
	POP  R27
	POP  R26
	ICALL
	.ENDM

	.MACRO __CALL2EX
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	RCALL __EEPROMRDD
	ICALL
	.ENDM

	.MACRO __GETW1STACK
	IN   R30,SPL
	IN   R31,SPH
	ADIW R30,@0+1
	LD   R0,Z+
	LD   R31,Z
	MOV  R30,R0
	.ENDM

	.MACRO __GETD1STACK
	IN   R30,SPL
	IN   R31,SPH
	ADIW R30,@0+1
	LD   R0,Z+
	LD   R1,Z+
	LD   R22,Z
	MOVW R30,R0
	.ENDM

	.MACRO __NBST
	BST  R@0,@1
	IN   R30,SREG
	LDI  R31,0x40
	EOR  R30,R31
	OUT  SREG,R30
	.ENDM


	.MACRO __PUTB1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SN
	LDD  R26,Y+@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SNS
	LDD  R26,Y+@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1RN
	MOV  R26,R@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1RN
	MOV  R26,R@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1RN
	MOV  R26,R@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1RNS
	MOV  R26,R@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1RNS
	MOV  R26,R@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1RNS
	MOV  R26,R@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1PMN
	LDS  R26,@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1PMN
	LDS  R26,@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1PMN
	LDS  R26,@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __PUTB1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	ST   X,R30
	.ENDM

	.MACRO __PUTW1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1PMNS
	LDS  R26,@0
	SUBI R26,-@1
	RCALL __PUTDP1
	.ENDM

	.MACRO __GETB1SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R30,Z
	.ENDM

	.MACRO __GETB1HSX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R31,Z
	.ENDM

	.MACRO __GETW1SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R0,Z+
	LD   R31,Z
	MOV  R30,R0
	.ENDM

	.MACRO __GETD1SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R0,Z+
	LD   R1,Z+
	LD   R22,Z+
	LD   R23,Z
	MOVW R30,R0
	.ENDM

	.MACRO __GETB2SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R26,X
	.ENDM

	.MACRO __GETW2SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	.ENDM

	.MACRO __GETD2SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R1,X+
	LD   R24,X+
	LD   R25,X
	MOVW R26,R0
	.ENDM

	.MACRO __GETBRSX
	MOVW R30,R28
	SUBI R30,LOW(-@1)
	SBCI R31,HIGH(-@1)
	LD   R@0,Z
	.ENDM

	.MACRO __GETWRSX
	MOVW R30,R28
	SUBI R30,LOW(-@2)
	SBCI R31,HIGH(-@2)
	LD   R@0,Z+
	LD   R@1,Z
	.ENDM

	.MACRO __GETBRSX2
	MOVW R26,R28
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	LD   R@0,X
	.ENDM

	.MACRO __GETWRSX2
	MOVW R26,R28
	SUBI R26,LOW(-@2)
	SBCI R27,HIGH(-@2)
	LD   R@0,X+
	LD   R@1,X
	.ENDM

	.MACRO __LSLW8SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	LD   R31,Z
	CLR  R30
	.ENDM

	.MACRO __PUTB1SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X+,R31
	ST   X+,R22
	ST   X,R23
	.ENDM

	.MACRO __CLRW1SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X,R30
	.ENDM

	.MACRO __CLRD1SX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	ST   X+,R30
	ST   X+,R30
	ST   X+,R30
	ST   X,R30
	.ENDM

	.MACRO __PUTB2SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z,R26
	.ENDM

	.MACRO __PUTW2SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z+,R26
	ST   Z,R27
	.ENDM

	.MACRO __PUTD2SX
	MOVW R30,R28
	SUBI R30,LOW(-@0)
	SBCI R31,HIGH(-@0)
	ST   Z+,R26
	ST   Z+,R27
	ST   Z+,R24
	ST   Z,R25
	.ENDM

	.MACRO __PUTBSRX
	MOVW R30,R28
	SUBI R30,LOW(-@1)
	SBCI R31,HIGH(-@1)
	ST   Z,R@0
	.ENDM

	.MACRO __PUTWSRX
	MOVW R30,R28
	SUBI R30,LOW(-@2)
	SBCI R31,HIGH(-@2)
	ST   Z+,R@0
	ST   Z,R@1
	.ENDM

	.MACRO __PUTB1SNX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X,R30
	.ENDM

	.MACRO __PUTW1SNX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X+,R30
	ST   X,R31
	.ENDM

	.MACRO __PUTD1SNX
	MOVW R26,R28
	SUBI R26,LOW(-@0)
	SBCI R27,HIGH(-@0)
	LD   R0,X+
	LD   R27,X
	MOV  R26,R0
	SUBI R26,LOW(-@1)
	SBCI R27,HIGH(-@1)
	ST   X+,R30
	ST   X+,R31
	ST   X+,R22
	ST   X,R23
	.ENDM

;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS
	.DEF _TickTimer1s=R3
	.DEF _TickTimer5s=R2
	.DEF _TickTimer10s=R5
	.DEF _TickCounter_rfTX=R4
	.DEF _TickTimer_delay=R7
	.DEF _dataGPS=R6
	.DEF _rx_wr_index=R9
	.DEF _rx_rd_index=R8
	.DEF _rx_counter=R11

;GPIOR0-GPIOR2 INITIALIZATION VALUES
	.EQU __GPIOR0_INIT=0x00
	.EQU __GPIOR1_INIT=0x00
	.EQU __GPIOR2_INIT=0x00

	.CSEG
	.ORG 0x00

;START OF CODE MARKER
__START_OF_CODE:

;INTERRUPT VECTORS
	RJMP __RESET
	RJMP 0x00
	RJMP _ext_int1_isr
	RJMP 0x00
	RJMP 0x00
	RJMP _timer1_ovf_isr
	RJMP 0x00
	RJMP _usart_rx_isr
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP _timer0_compa_isr
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00
	RJMP 0x00

_tbl10_G100:
	.DB  0x10,0x27,0xE8,0x3,0x64,0x0,0xA,0x0
	.DB  0x1,0x0
_tbl16_G100:
	.DB  0x0,0x10,0x0,0x1,0x10,0x0,0x1,0x0

;GLOBAL REGISTER VARIABLES INITIALIZATION
__REG_VARS:
	.DB  0x0,0x0,0x0,0x0

_0x0:
	.DB  0x24,0x50,0x4D,0x54,0x4B,0x33,0x31,0x34
	.DB  0x2C,0x30,0x2C,0x31,0x2C,0x30,0x2C,0x31
	.DB  0x2C,0x31,0x2C,0x35,0x2C,0x30,0x2C,0x30
	.DB  0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30
	.DB  0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30
	.DB  0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2A,0x32
	.DB  0x43,0xD,0xA,0x0,0x24,0x50,0x4D,0x54
	.DB  0x4B,0x33,0x30,0x31,0x2C,0x30,0x2A,0x32
	.DB  0x43,0xD,0xA,0x0,0x24,0x50,0x4D,0x54
	.DB  0x4B,0x38,0x36,0x39,0x2C,0x31,0x2C,0x30
	.DB  0x2A,0x33,0x34,0xD,0xA,0x0,0x24,0x50
	.DB  0x4D,0x54,0x4B,0x32,0x35,0x31,0x2C,0x31
	.DB  0x34,0x34,0x30,0x30,0x2A,0x32,0x39,0xD
	.DB  0xA,0x0,0x24,0x50,0x4D,0x54,0x4B,0x32
	.DB  0x32,0x30,0x2C,0x35,0x30,0x30,0x2A,0x32
	.DB  0x42,0xD,0xA,0x0

__GLOBAL_INI_TBL:
	.DW  0x04
	.DW  0x08
	.DW  __REG_VARS*2

_0xFFFFFFFF:
	.DW  0

#define __GLOBAL_INI_TBL_PRESENT 1

__RESET:
	CLI
	CLR  R30
	OUT  EECR,R30
	OUT  MCUCR,R30

;DISABLE WATCHDOG
	LDI  R31,0x18
	WDR
	IN   R26,MCUSR
	CBR  R26,8
	OUT  MCUSR,R26
	OUT  WDTCR,R31
	OUT  WDTCR,R30

;CLEAR R2-R14
	LDI  R24,(14-2)+1
	LDI  R26,2
__CLEAR_REG:
	ST   X+,R30
	DEC  R24
	BRNE __CLEAR_REG

;CLEAR SRAM
	LDI  R24,__CLEAR_SRAM_SIZE
	LDI  R26,__SRAM_START
__CLEAR_SRAM:
	ST   X+,R30
	DEC  R24
	BRNE __CLEAR_SRAM

;GLOBAL VARIABLES INITIALIZATION
	LDI  R30,LOW(__GLOBAL_INI_TBL*2)
	LDI  R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
	LPM  R24,Z+
	LPM  R25,Z+
	SBIW R24,0
	BREQ __GLOBAL_INI_END
	LPM  R26,Z+
	LPM  R27,Z+
	LPM  R0,Z+
	LPM  R1,Z+
	MOVW R22,R30
	MOVW R30,R0
__GLOBAL_INI_LOOP:
	LPM  R0,Z+
	ST   X+,R0
	SBIW R24,1
	BRNE __GLOBAL_INI_LOOP
	MOVW R30,R22
	RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:

;GPIOR0-GPIOR2 INITIALIZATION
	LDI  R30,__GPIOR0_INIT
	OUT  GPIOR0,R30
	;__GPIOR1_INIT = __GPIOR0_INIT
	OUT  GPIOR1,R30
	;__GPIOR2_INIT = __GPIOR0_INIT
	OUT  GPIOR2,R30

;HARDWARE STACK POINTER INITIALIZATION
	LDI  R30,LOW(__SRAM_END-__HEAP_SIZE)
	OUT  SPL,R30

;DATA STACK POINTER INITIALIZATION
	LDI  R28,LOW(__SRAM_START+__DSTACK_SIZE)

	RJMP _main

	.ESEG
	.ORG 0

	.DSEG
	.ORG 0x80

	.CSEG
;/*****************************************************
;сейчас GPS, скорость в
;ток GPS+RFM12=67mA
;ток GPS+RFM12+VT1rf=90mA
;RFM12B максимальный размер данных кадра 128 bytes max message length
;=====================================================
;This program was produced by the
;CodeWizardAVR V2.05.3 Standard & CodeWizardAVR 3.12 Advanced
;
;Project : Tiny2313
;Version : 1.0
;Date    : 22.04.2014
;Date    : 31.12.2014
;Author  : MartKot
;Company : Tornado
;Comments:
;GPS-Tiny2313-RFM12B
;SPI Register&Counter=USICLK
;USI Counter Overflow Interrupt-NO
;Universal Serial Interface initialization
;Mode: Three Wire (SPI), программное тактирование
;// Clock source: Register & Counter=USICLK / NO
;// USI Counter Overflow Interrupt: Off
;//f=490кГц, 2,04мкс, 30такт
;//f=1,05МГц, 880Kbit/sec
;f=7,1МГц 7,142Мбит/сек; 8бит скорость 2,31Мбит/сек; 16бит-скорость 1,918Мбит/сек
;=======================================
;// USART initialization
;// Communication Parameters: 8 Data, 1 Stop, No Parity
;// USART Receiver: On
;// USART Transmitter: On
;// USART Mode: Asynchronous
;// USART Baud Rate:  Kbit/sec
;
;Chip type               : ATtiny2313A
;AVR Core Clock frequency: 14,745600 MHz
;Memory model            : Tiny
;External RAM size       : 0
;Data Stack size         : 32
;Flash(Кбайт) : 2
;SRAM(Байт)   : 128
;EEPROM(Байт) : 128
;
;27.09.2014
;EEPROM usage: 0 byte(s), 0,0% of EEPROM
;Program size: 512 words (1024 bytes), 50,0% of FLASH
;*****************************************************/
;
;#include <tiny2313a.h>
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x20
	.EQU __sm_mask=0x50
	.EQU __sm_powerdown=0x10
	.EQU __sm_standby=0x40
	.SET power_ctrl_reg=mcucr
	#endif
;#include <stdio.h>
;#include <delay.h>
;#include <string.h>
;
;//==== tiny2313 INTERFACE ====//
;//#define NIRQ 2  // PORTD.2 прерывание от rfm12b
;//#define SCK PORTB.7 // SPI clock
;//#define SDI PORTB.6 // SPI RFM12B data input
;//#define SDO PORTB.5 // SPI RFM12B data output
;//#define nSEL  PORTB.4 // SPI nSEL (chip select)
;//#define NIRQ PORTD.2 //прерывание от rfm12b - low
;
;#define DCLK PINB.1 //вход прерывания от FIFO, если заполнен до указанного порога
;#define FSK PORTB.2 //выход, FIFO select 0-при включении внутреннего приемного регистра
;#define nINT PINB.3 //вход детектора действительных данных
;#define nSEL  4   // PORTB.4 SPI nSEL (chip select)
;//#define SDI PINB.5   // PORTB.5 SPI DI input (SPI RFM12B data output)
;#define SDO PORTB.6   // PORTB.6 SPI DO otput (SPI RFM12B data input)
;#define nIRQ_LOW PIND.2 //прерывание от nIRQ, ждём low флага окончания передачи
;  /* IO CONTROL */
;#define HI(x) PORTB |= (1<<(x))  //установить бит (х) в "1"
;#define LO(x) PORTB &= ~(1<<(x)) //сбросить бит (х) в "0"
;//===========================//
;
;//(14,745600 MHz)
;//#define BAUDRATE UBRRL=0x5F; //для Baud Rate: 9600bps
;#define BAUDRATE UBRRL=0x3F; //USART Baud Rate: 14400bps
;//#define BAUDRATE UBRRL=0x2F; //47 для Baud Rate: 19200bps
;//#define BAUDRATE UBRRL=0x17; //23 для Baud Rate: 38400bps
;//#define BAUDRATE UBRRL=0x0F; //USART Baud Rate: 57600bps
;//#define BAUDRATE UBRRL=0x07; // 7 Baud Rate: 115200bps
;//======!!! После инициализации GPS Baud Rate: 14400bps !!!
;
;//#define nIRQ_LOW PIND.2 //ждём PIND.2=0 флага окончания передачи
;//#define nIRQ_LOW() while(PIND&(1<<nIRQ))
;
;//////////* LED, приём-передача */////////////////////////////////////////
;//#define LED 6 //PORTD.6 RX(0)-приём, 1-передача
;//#define LED_OFF() PORTD &= ~(1<<LED)//PORTD.6=0; rfRx выкл светодиод
;//#define LED_ON() PORTD |= (1<<LED)  //PORTD.6=1; rfTx вкл светодиод
;//#define LED_OFF() PORTD.x=0 //вкл светодиод Rx (начальное значение)
;//#define LED_ON() PORTD.6=1 //вкл передача Tx, выкл светодиод Rx
;#define LED_OFF(x) PORTD.x=0 //выкл светодиод Tx, вкл Rx (начальное значение)
;#define LED_ON(x) PORTD.x=1 //вкл светодиод передача Tx, выкл светодиод Rx
;#define LEDB_OFF(x) PORTB.x=0 //выкл светодиод PORTB.x
;#define LEDB_ON(x) PORTB.x=1 //вкл светодиод PORTB.x
;//=======================================================
;//knb,k1b1...k2b4-тип unsigned char, значения до 0xFF
;#define knb 'k' //(0x6B)107-символ опознования кнопки 'k'
;#define k1b1 0x31  //первый байт -------------|
;#define k1b2 0x32    //второй байт            |-- шифр кнопки1
;#define k1b3 0x33    //третий байт            |
;#define k1b4 0x36    //четвёртый байт         |
;//   //пятый байт ----------|
;
;#define k2b1 0x32  //первый байт --------- ---|
;#define k2b2 0x35   //второй байт             |-- шифр кнопки2
;#define k2b3 0x37   //третий байт             |
;#define k2b4 0x32   //четвёртый байт          |
;//   //пятый байт            |
;//#define codeK2 108//сумма kb1+kb2+...+kb4---|
;//k2b1...k2b4 только для приёмника RX (где стоят физически)
;//=======================================================
;//#define T_delay 120 //время задержки 10минут
;//#define T_delay 30 //время задержки 2,5минут==
;//#define T_delay 6 //время задержки 35сек
;#define T_delay 1 //время задержки 10сек
;//=======================================================
;#define testTX1
;//#define testTX2
;#ifdef testTX1
;  //конфигурация профиля testTX1
; #else
;  //конфигурация профиля testTX2
;#endif
;
;//==== Declare your global variables here ====//
;bit timeout_T0;  //флаг таймера 0
;//bit flag5s_Timer = 0;  //флаг таймера 5сек
;//bit flag_init; //флаг разрешения
;bit flag_1s;  //флаг таймера 1сек
;//bit flag_2s;  //флаг таймера 1сек
;bit flag_5s;  //флаг таймера 5сек
;//bit flag_2s_10s;
;//bit flag_stop2s; //флаг остановки счётчика 2сек(1сек) в 5сек таймере
;//bit flag_start_T1; //флаг старта таймера
;bit flag_delay;    //флаг окончания задержки
;bit flag_TickCounter_rfTX=0;
;bit flag_GPS; //флаг контроля пакетов GPS
;bit flag_KN1; //флаг срабатывания кнопки 1
;bit flag_rfSend_K; //флаг передачи данных кнопки
;//unsigned char TickTimer0; //счётчик Timer0
;unsigned char TickTimer1s; //счётчик Timer1 1сек
;//unsigned char TickTimer2s; //счётчик Timer1 2сек
;unsigned char TickTimer5s; //счётчик Timer1 5сек
;unsigned char TickTimer10s;
;unsigned char TickCounter_rfTX;
;unsigned char TickTimer_delay;
;unsigned char dataGPS;
;
;//bit flag_TX;
;//bit init_GPS_error = 1;
;//char string_GPS[4]="1,2";
;
;//===============| Прототипы функций |===============//
;//void USART_Transmit(unsigned char data);
;//unsigned char USART_Receive(void);
;//inline void StartTimer0_init(void);
;//inline unsigned int timeout_T0(void);
;char getchar_Tout(void);
;void LED_Blink(unsigned char blink, unsigned int timeb); //мигаем светодиодом blink раз, с задержкой timeb
;unsigned int writeCmd(unsigned int cmd); //отправка и приём 2 байтов по SPI на RF модуль
;void rfSend_Byte(unsigned char rf_byte); //отправка 1 байта по SPI на RF модуль
;//void rfSend_ByteGPS(unsigned char rf_byteGPS);
;void rfInit();          //инициализация RF модуля
;unsigned char rfRecv(); //приём данных от RF модуля
;void FIFOReset();       //сброс буфера RF модуля
;void rfRecv_Kn(void);   //приём данных с кнопок
;void init_GPS(void);    //установка параметров GPS модуля
;void init_ATtiny(void); //инициализация ATtiny
;void rfSend_GPS(void);  //передача байта GPS по радиоканалу
;void rfSend_K(char kb); //передача кода кнопки по радиоканалу
;
;/*******
;inline void StopTimer0(void) {
;//timeout_T0=0;
;  TCCR0A=0x00; //Stop Timer0
;  TCCR0B=0x00; //Stop Timer0
;  TCNT0=0x00; //очистка счётного регистра
;  TIFR = (1 << OCF0A) | (1 << OCF0B); //clear flag  OCF0A and OCF0B
;} ******/
;
;// Timer 0 output compare A interrupt service routine
;interrupt [TIM0_COMPA] void timer0_compa_isr(void)
; 0000 00B8 {

	.CSEG
_timer0_compa_isr:
; .FSTART _timer0_compa_isr
	ST   -Y,R30
; 0000 00B9 timeout_T0=0;
	CBI  0x13,0
; 0000 00BA //StopTimer0();
; 0000 00BB TCCR0A=0x00; //Stop Timer0
	LDI  R30,LOW(0)
	OUT  0x30,R30
; 0000 00BC TCCR0B=0x00; //Stop Timer0
	OUT  0x33,R30
; 0000 00BD //TIFR = (1 << OCF0A) | (1 << OCF0B); //clear flag  OCF0A and OCF0B
; 0000 00BE }
	RJMP _0x99
; .FEND
;
;
;inline void StartTimer0_init(void) {
; 0000 00C2 timeout_T0=1;
; 0000 00C3 //StopTimer0();
; 0000 00C4 //TCCR0A=0x00; //Stop Timer0
; 0000 00C5 //TCCR0B=0x00; //Stop Timer0
; 0000 00C6 //Clock value: 230,4kHz Start Timer0
; 0000 00C7 TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
; 0000 00C8 TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
; 0000 00C9 TCNT0=0x00; //обнуление регистра счёта
; 0000 00CA OCR0A=0xE5; //Timer Period:1ms для работы (от 0,9ms до 1ms)
; 0000 00CB //OCR0A=0xFC; // Timer Period: 1,0981 ms
; 0000 00CC 
; 0000 00CD //TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
; 0000 00CE //TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);//57,6kHz 1,4063 ms
; 0000 00CF //TCNT0=0x00; //обнуление регистра счёта
; 0000 00D0 //OCR0A=0x50;// Timer Period: 1,4063 ms
; 0000 00D1 
; 0000 00D2 //OCR0A=0xCE;// Timer Period: 0,89844 ms
; 0000 00D3 //OCR0A=0xB7;// Timer Period: 0,79861 ms есть ошибки
; 0000 00D4 //OCR0A=0xA0; // Timer Period: 0,69878 ms мало, не работает
; 0000 00D5 
; 0000 00D6 TIFR = (1 << OCF0A) | (1 << OCF0B); //clear flag  OCF0A and OCF0B
; 0000 00D7 }
;
;
;//inline unsigned char timeout_T0()
;//{
;//return (TIFR&0x01); //возвращаем ненулевое значение (1) если счёт T0 закончен
;//}
;
;//inline unsigned char timeout_T0()
;//{
;//return (TIFR & (1 << OCF0A)); //return non-zero if the timer overflowed
;////return (TIFR & (1 << TOV0)); //return non-zero if the timer overflowed
;//}
;//режим CTC (сброс при совпадении) Таймер_0 будет считать
;//от 0 до числа записанного в регистр OCR0A и при достижение этого числа,
;//на следующем такте будет установлен флаг OCF0A и может быть сгенерировано
;//соответствующее прерывание. Не забывать сбрасывать счётный регистр TCNT0=0x00;
;//Таймер_0 опять начнет считать  с  нуля.
;
;
;
;// Timer1 overflow interrupt service routine
;interrupt [TIM1_OVF] void timer1_ovf_isr(void) //секундный таймер
; 0000 00EE {
_timer1_ovf_isr:
; .FSTART _timer1_ovf_isr
	ST   -Y,R26
	ST   -Y,R30
	IN   R30,SREG
	ST   -Y,R30
; 0000 00EF // Reinitialize Timer1 value 1,0sec (настройки в init_ATtiny)
; 0000 00F0 //максимально возможный период счёта 4,551сек
; 0000 00F1 TCNT1H=0x1F00 >> 8;  //1.0sec, 0.25sec
	RCALL SUBOPT_0x0
; 0000 00F2 TCNT1L=0x1F00 & 0xff;//1.0sec, 0.25sec
; 0000 00F3 //=============================
; 0000 00F4 //TCNT1H=0x3580 >> 8;  //0.9sec
; 0000 00F5 //TCNT1L=0x3580 & 0xff;
; 0000 00F6 //=============================
; 0000 00F7 //TCNT1H=0xA600 >> 8;  //0.1sec
; 0000 00F8 //TCNT1L=0xA600 & 0xff;//0.1sec
; 0000 00F9 //=============================
; 0000 00FA                //секундный таймер
; 0000 00FB flag_1s ^=1;   //переодическое переключение 1сек
	LDI  R26,0
	SBIC 0x13,1
	LDI  R26,1
	LDI  R30,LOW(1)
	EOR  R30,R26
	BRNE _0x8
	CBI  0x13,1
	RJMP _0x9
_0x8:
	SBI  0x13,1
_0x9:
; 0000 00FC  if (flag_rfSend_K) { //если данные кнопки отосланы, защита от повторов
	SBIS 0x13,7
	RJMP _0xA
; 0000 00FD  //тогда разрешаем int1  flag_KN1 &&
; 0000 00FE  flag_rfSend_K=0;
	CBI  0x13,7
; 0000 00FF  GIMSK=0x80; //разрешить прерывания int1, разрешение работы кнопки К1
	LDI  R30,LOW(128)
	OUT  0x3B,R30
; 0000 0100  };
_0xA:
; 0000 0101 
; 0000 0102 PORTB.0=0; //выкл.выход B.0 через 1сек
	CBI  0x18,0
; 0000 0103 //PORTD.4=0; //выкл. через 1сек
; 0000 0104 
; 0000 0105  if (PIND.4==1) { //если включен выход D.4
	SBIS 0x10,4
	RJMP _0xF
; 0000 0106  TickTimer1s++;
	INC  R3
; 0000 0107    if (TickTimer1s == 5){
	LDI  R30,LOW(5)
	CP   R30,R3
	BRNE _0x10
; 0000 0108      PORTD.4=0; //выкл.выход D.4 через 5сек, независимо от перемычки
	CBI  0x12,4
; 0000 0109      TickTimer1s = 0; //обнуляем через 5сек
	CLR  R3
; 0000 010A    };
_0x10:
; 0000 010B  };
_0xF:
; 0000 010C 
; 0000 010D //PORTD.4^=1; //для теста, пикаем с периодом 1сек
; 0000 010E  if (PIND.5==1) //перемычка "Контакт Подъёма", можно GPS вкл. в режим постоянной передачи.
	SBIS 0x10,5
	RJMP _0x13
; 0000 010F  {
; 0000 0110     PORTD.4=0;     //выкл.выход D.4 зв. излучатель, воспламенитель.
	CBI  0x12,4
; 0000 0111     TickTimer5s++;
	INC  R2
; 0000 0112     if (TickTimer5s == 5)  { //период 5сек
	LDI  R30,LOW(5)
	CP   R30,R2
	BRNE _0x16
; 0000 0113        //flag5s_Timer^= 1; //переодическое переключение
; 0000 0114        flag_5s ^= 1;  //флаг таймера 5сек
	LDI  R26,0
	SBIC 0x13,2
	LDI  R26,1
	LDI  R30,LOW(1)
	EOR  R30,R26
	BRNE _0x17
	CBI  0x13,2
	RJMP _0x18
_0x17:
	SBI  0x13,2
_0x18:
; 0000 0115        //PORTD.4=0;   //выкл.выход D.4 на зв. излучатель и воспламенитель
; 0000 0116        //PORTD.4^=1;  //пикаем с периодом 5сек
; 0000 0117        //PORTB.0=0;   //выкл.выход B.0 при размыкании перемычки, через 5сек
; 0000 0118        TickTimer5s = 0; //обнуляем через 5сек
	CLR  R2
; 0000 0119        if (TickTimer_delay<=T_delay) { //формирование задержки 120=10минут
	LDI  R30,LOW(1)
	CP   R30,R7
	BRLO _0x19
; 0000 011A           if (TickTimer_delay == T_delay) //максимальная задержка 254=21минут
	CP   R30,R7
	BRNE _0x1A
; 0000 011B              flag_delay=1;
	SBI  0x13,3
; 0000 011C        TickTimer_delay++; //если TickTimer_delay=121 (T_delay=120), сюда больше не заходим
_0x1A:
	INC  R7
; 0000 011D        };
_0x19:
; 0000 011E     };
_0x16:
; 0000 011F  };
_0x13:
; 0000 0120 
; 0000 0121 //формирование 8-10сек пауз TX             //в одной пачке от 3 до 7 пакетов
; 0000 0122  if (flag_delay && flag_TickCounter_rfTX) {//если задержка кончилась и передано 5 пачек, формируем паузы
	SBIS 0x13,3
	RJMP _0x1E
	SBIC 0x13,4
	RJMP _0x1F
_0x1E:
	RJMP _0x1D
_0x1F:
; 0000 0123     TickTimer10s++;
	INC  R5
; 0000 0124     if (TickTimer10s==8) {  //5=10+2(период 12сек); 4=8+2(период 10сек); 3=6+2(период 8сек)
	LDI  R30,LOW(8)
	CP   R30,R5
	BRNE _0x20
; 0000 0125        flag_TickCounter_rfTX=0;
	CBI  0x13,4
; 0000 0126        TickCounter_rfTX = 0; //обнуляем счётчик
	CLR  R4
; 0000 0127        TickTimer10s = 0; //обнуляем через 10сек
	CLR  R5
; 0000 0128 
; 0000 0129     };
_0x20:
; 0000 012A  };
_0x1D:
; 0000 012B }
	LD   R30,Y+
	OUT  SREG,R30
	LD   R30,Y+
	LD   R26,Y+
	RETI
; .FEND
;
;//==== External Interrupt 0 ==== программа обрабобтки прерывания
;/*
;interrupt [EXT_INT0] void ext_int0_isr(void) //сейчас выключено в init_ATtiny
;{
;// Place your code here
;
;}
;*/
;
;// External Interrupt 1 service routine
;interrupt [EXT_INT1] void ext_int1_isr(void)
; 0000 0138 {
_ext_int1_isr:
; .FSTART _ext_int1_isr
	ST   -Y,R30
; 0000 0139 // код кнопки 1
; 0000 013A //rfSend_K(1); //посылаем по RF код кнопки 1
; 0000 013B flag_KN1=1; //флаг срабатывания кнопки 1
	SBI  0x13,6
; 0000 013C GIMSK=0x00;   //запретить прерывания int1
	LDI  R30,LOW(0)
	OUT  0x3B,R30
; 0000 013D //GIFR=0x00;  //для запрета передачи данных кнопки1
; 0000 013E }
_0x99:
	LD   R30,Y+
	RETI
; .FEND
;
;//работа UART с прерыванием Rx и буфером  //********************************
;#define DATA_REGISTER_EMPTY (1<<UDRE)
;#define RX_COMPLETE (1<<RXC)
;#define FRAMING_ERROR (1<<FE) //ошибка кадрирования. Т.е. мы ждали стоп бит, а пришел 0.
;#define PARITY_ERROR (1<<UPE) //не совпал контроль четности
;#define DATA_OVERRUN (1<<DOR) //переполнение буфера
;// USART Receiver buffer //8,16,24,32,40,48,56,64,72
;#define RX_BUFFER_SIZE 8 //8 или 16 размер буфера, для AT2313 не более 72 байт
;
;//char status;
;char rx_buffer[RX_BUFFER_SIZE];
;unsigned char rx_wr_index=0,rx_rd_index=0; //для буфера <=256
;unsigned char rx_counter=0; //для буфера <256
;
;// This flag is set on USART Receiver buffer overflow
;bit rx_buffer_overflow;
;
;// USART Receiver interrupt service routine ==========================
;interrupt [USART_RXC] void usart_rx_isr(void)  //Обработка прерывания окончания приема байта ISR( USART_RXC_vect )
; 0000 0153 {
_usart_rx_isr:
; .FSTART _usart_rx_isr
	ST   -Y,R30
	IN   R30,SREG
	ST   -Y,R30
; 0000 0154 char status,data;
; 0000 0155 // Получаем байт статуса и данных
; 0000 0156 status=UCSRA; //   UDRE 0x01   USART Data Register Empty
	RCALL __SAVELOCR2
;	status -> R17
;	data -> R16
	IN   R17,11
; 0000 0157 data=UDR;
	IN   R16,12
; 0000 0158   if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) // Если нет ошибки при приеме байта
	MOV  R30,R17
	ANDI R30,LOW(0x1C)
	BRNE _0x25
; 0000 0159    {
; 0000 015A    rx_buffer[rx_wr_index++]=data; //сохраняем байт в буфере
	MOV  R30,R9
	INC  R9
	SUBI R30,-LOW(_rx_buffer)
	ST   Z,R16
; 0000 015B 
; 0000 015C    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
	LDI  R30,LOW(8)
	CP   R30,R9
	BRNE _0x26
	CLR  R9
; 0000 015D    if (++rx_counter == RX_BUFFER_SIZE)
_0x26:
	INC  R11
	LDI  R30,LOW(8)
	CP   R30,R11
	BRNE _0x27
; 0000 015E       {
; 0000 015F       rx_counter=0;
	CLR  R11
; 0000 0160       rx_buffer_overflow=1; //флаг переполнения буфера
	SBI  0x14,0
; 0000 0161       }
; 0000 0162    }
_0x27:
; 0000 0163 //status=0;
; 0000 0164 
; 0000 0165       /*
; 0000 0166    if (flag_init==1) {
; 0000 0167       LED_ON(6); //вкл. светодиод и усилитель мощности
; 0000 0168       writeCmd(0x8239); //вкл. передатчик TX
; 0000 0169       FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста)
; 0000 016A      while (PIND.5==0) {
; 0000 016B       rfSend_GPS();  //flag_1s==0 передача, flag_1s==1 приём
; 0000 016C        if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно <LF> и таймер кончился, можно выходить отсюда
; 0000 016D        //if (dataGPS==0x0A) {
; 0000 016E           flag_GPS=0;
; 0000 016F           break;
; 0000 0170        };
; 0000 0171      };
; 0000 0172       //rfSend_GPS();
; 0000 0173    }; */
; 0000 0174 }
_0x25:
	LD   R16,Y+
	LD   R17,Y+
	LD   R30,Y+
	OUT  SREG,R30
	LD   R30,Y+
	RETI
; .FEND
;
;
;//#ifndef _DEBUG_TERMINAL_IO_
;//// Get a character from the USART Receiver buffer
;//#define _ALTERNATE_GETCHAR_
;//#pragma used+
;char getchar_Tout(void) //=================================================
; 0000 017C {
_getchar_Tout:
; .FSTART _getchar_Tout
; 0000 017D char data;
; 0000 017E //while (rx_counter==0);
; 0000 017F //ждём когда вбуфере появятся данные и время ожидания не истекло
; 0000 0180 StartTimer0_init(); //запуск таймера
	ST   -Y,R17
;	data -> R17
	SBI  0x13,0
	LDI  R30,LOW(2)
	OUT  0x30,R30
	LDI  R30,LOW(3)
	OUT  0x33,R30
	LDI  R30,LOW(0)
	OUT  0x32,R30
	LDI  R30,LOW(229)
	OUT  0x36,R30
	LDI  R30,LOW(5)
	OUT  0x38,R30
; 0000 0181 while ((rx_counter==0) && timeout_T0);
_0x2A:
	TST  R11
	BRNE _0x2D
	SBIC 0x13,0
	RJMP _0x2E
_0x2D:
	RJMP _0x2C
_0x2E:
	RJMP _0x2A
_0x2C:
; 0000 0182  // if (rx_counter!=0) { //return; //&&(rx_counter!=0)
; 0000 0183   if (timeout_T0) { //если время ожидания истекло, уходим
	SBIS 0x13,0
	RJMP _0x2F
; 0000 0184      //goto end_getchar_Tout;
; 0000 0185     data=rx_buffer[rx_rd_index++];
	MOV  R30,R8
	INC  R8
	SUBI R30,-LOW(_rx_buffer)
	LD   R17,Z
; 0000 0186     if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
	LDI  R30,LOW(8)
	CP   R30,R8
	BRNE _0x30
	CLR  R8
; 0000 0187     #asm("cli") // глобально запретить прерывания
_0x30:
	cli
; 0000 0188     --rx_counter;
	DEC  R11
; 0000 0189     #asm("sei") // глобально разрешить прерывания
	sei
; 0000 018A     return data;
	MOV  R30,R17
; 0000 018B   };
_0x2F:
; 0000 018C //end_getchar_Tout: //выход по истечению времени
; 0000 018D }
_0x2060004:
	LD   R17,Y+
	RET
; .FEND
;//#pragma used-
;//#endif
;//*******************************************************************/
;//== конец UART по прерыванию Rx ===//
;
;
;
;
;//======== Описания функций =========//
;void LED_Blink(unsigned char blink, unsigned int timeb) //мигаем светодиодом blink раз, timeb мимлисекунд
; 0000 0198 {
_LED_Blink:
; .FSTART _LED_Blink
; 0000 0199  char i;
; 0000 019A   for(i = 0; i < blink; i++)
	ST   -Y,R27
	ST   -Y,R26
	ST   -Y,R17
;	blink -> Y+3
;	timeb -> Y+1
;	i -> R17
	LDI  R17,LOW(0)
_0x32:
	LDD  R30,Y+3
	CP   R17,R30
	BRSH _0x33
; 0000 019B     {
; 0000 019C      LED_ON(6); //вкл. светодиод PORTD.6
	SBI  0x12,6
; 0000 019D      delay_ms(timeb);
	LDD  R26,Y+1
	LDD  R27,Y+1+1
	RCALL _delay_ms
; 0000 019E      LED_OFF(6); //выкл. светодиод PORTD.6
	CBI  0x12,6
; 0000 019F      delay_ms(timeb);
	LDD  R26,Y+1
	LDD  R27,Y+1+1
	RCALL _delay_ms
; 0000 01A0     }
	SUBI R17,-1
	RJMP _0x32
_0x33:
; 0000 01A1 }
	LDD  R17,Y+0
	RJMP _0x2060002
; .FEND
;
;/*
;void LED_Blink_D4(unsigned char blink, unsigned int timeb) //мигаем светодиодом blink раз, timeb мимлисекунд
;{
; char i;
;  for(i = 0; i < blink; i++)
;    {
;     LED_ON(4); //вкл. светодиод PORTD.4
;     delay_ms(timeb);
;     LED_OFF(4); //выкл. светодиод PORTD.4
;     delay_ms(timeb);
;    }
;} */
;
;
;
;
;//====== USI - SPI //программный SPI//========//
;//инициализация портов, SPI в init_ATtiny
;//функция передачи-приёма 2-х байт(16bit) по USI с max скоростью (до Fclk/2)
;//такт 7,1МГц, 0,14мкс(7,142Мбит/сек), время передачи 16bit 5,49мкс(2,9Mbit/sec),
;//полное время передачи одной команды 16bit-8,34мкс или 1,918Мбит/сек (40 тактов)
;unsigned int writeCmd(unsigned int cmd)
; 0000 01B9 {
_writeCmd:
; .FSTART _writeCmd
; 0000 01BA  unsigned int recv_16b=0; //16bit полученные из USIDR
; 0000 01BB  LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
	ST   -Y,R27
	ST   -Y,R26
	RCALL __SAVELOCR2
;	cmd -> Y+2
;	recv_16b -> R16,R17
	__GETWRN 16,17,0
	CBI  0x18,4
; 0000 01BC  //USIDR = data_w;//передаваемые данные в сдвиговый регисть
; 0000 01BD  USIDR =cmd>>8;//16bit->8bit старший разряд, передаваемые данные в сдвиговый регистр
	LDD  R30,Y+3
	ANDI R31,HIGH(0x0)
	RCALL SUBOPT_0x1
; 0000 01BE  USICR = 0b00010001;//и формируем тактирующие импульсы программно
; 0000 01BF  USICR = 0b00010011;
; 0000 01C0  USICR = 0b00010001;
; 0000 01C1  USICR = 0b00010011;
; 0000 01C2  USICR = 0b00010001;
; 0000 01C3  USICR = 0b00010011;
; 0000 01C4  USICR = 0b00010001;
; 0000 01C5  USICR = 0b00010011;
; 0000 01C6  USICR = 0b00010001;
; 0000 01C7  USICR = 0b00010011;
; 0000 01C8  USICR = 0b00010001;
; 0000 01C9  USICR = 0b00010011;
; 0000 01CA  USICR = 0b00010001;
; 0000 01CB  USICR = 0b00010011;
; 0000 01CC  USICR = 0b00010001;
; 0000 01CD  USICR = 0b00010011;
; 0000 01CE 
; 0000 01CF  recv_16b = USIDR<<8; //сохраняем старший байт из USIDR
	MOV  R31,R30
	LDI  R30,0
	MOVW R16,R30
; 0000 01D0  USIDR = cmd&0x00FF;//оставляем младший 8бит разряд (вместо FF)
	LDD  R30,Y+2
	RCALL SUBOPT_0x1
; 0000 01D1  //USIDR =cmd<<8;//16bit->8bit младший разряд, передаваемые данные в сдвиговый регистр
; 0000 01D2 
; 0000 01D3  USICR = 0b00010001;//и формируем тактирующие импульсы программно
; 0000 01D4  USICR = 0b00010011;
; 0000 01D5  USICR = 0b00010001;
; 0000 01D6  USICR = 0b00010011;
; 0000 01D7  USICR = 0b00010001;
; 0000 01D8  USICR = 0b00010011;
; 0000 01D9  USICR = 0b00010001;
; 0000 01DA  USICR = 0b00010011;
; 0000 01DB  USICR = 0b00010001;
; 0000 01DC  USICR = 0b00010011;
; 0000 01DD  USICR = 0b00010001;
; 0000 01DE  USICR = 0b00010011;
; 0000 01DF  USICR = 0b00010001;
; 0000 01E0  USICR = 0b00010011;
; 0000 01E1  USICR = 0b00010001;
; 0000 01E2  USICR = 0b00010011;
; 0000 01E3  recv_16b |=USIDR; //(побитовая ИЛИ) добовляем младший байт из USIDR
	LDI  R31,0
	__ORWRR 16,17,30,31
; 0000 01E4  HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
	SBI  0x18,4
; 0000 01E5  return recv_16b; //возврашаем 16bit полученные из USIDR
	MOVW R30,R16
	RCALL __LOADLOCR2
	RJMP _0x2060002
; 0000 01E6 }
; .FEND
;
;//**********************************************
;//8bit функция передачи по USI 7,1МГц 0,14мкс и RF
;//3,46мкс 19тактов или 2,31Мбит/сек
;void rfSend_Byte(unsigned char rf_byte) //Передача байта по SPI с опросом освобождения прд. регистра RF
; 0000 01EC {
_rfSend_Byte:
; .FSTART _rfSend_Byte
; 0000 01ED //LO(2); //вкл. тест светодиод PORTB.2
; 0000 01EE //wait for previously TX over PIND.2=0
; 0000 01EF  while(nIRQ_LOW); //передающий регистр готов к приёму след. байта
	ST   -Y,R26
;	rf_byte -> Y+0
_0x38:
	SBIC 0x10,2
	RJMP _0x38
; 0000 01F0  USIDR = rf_byte;//8bit отправляем байт в сдвиговый регистр
	LD   R30,Y
	OUT  0xF,R30
; 0000 01F1  USICR = 0b00010001;//и формируем тактирующие импульсы программно
	RCALL SUBOPT_0x2
; 0000 01F2  USICR = 0b00010011;
; 0000 01F3  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01F4  USICR = 0b00010011;
; 0000 01F5  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01F6  USICR = 0b00010011;
; 0000 01F7  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01F8  USICR = 0b00010011;
; 0000 01F9  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01FA  USICR = 0b00010011;
; 0000 01FB  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01FC  USICR = 0b00010011;
; 0000 01FD  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 01FE  USICR = 0b00010011;
; 0000 01FF  USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 0200  USICR = 0b00010011;
; 0000 0201 //HI(2); //выкл. тест светодиод PORTB.2
; 0000 0202     //USISR |= (1<<USIOIF);//сбрасываем флаг
; 0000 0203 	//while(!(USISR & (1<<USIOIF))){};//пока нет флага окончания передачи
; 0000 0204 }
	RJMP _0x2060001
; .FEND
;
;
;/*******************
;//8bit функция передачи по USI 7,1МГц 0,14мкс для данных GPS RF
;//3,46мкс 19тактов или 2,31Мбит/сек
;void rfSend_ByteGPS(unsigned char rf_byteGPS) //Передача байта по SPI с опросом освобождения прд. регистра RF
;{
;//LO(2); //вкл. тест светодиод PORTB.2
; //while(nIRQ_LOW); //wait for previously TX over PIND.2=0
; USIDR = rf_byteGPS;//8bit отправляем байт в сдвиговый регистр
; USICR = 0b00010001;//и формируем тактирующие импульсы программно
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
; USICR = 0b00010001;
; USICR = 0b00010011;
;//HI(2); //выкл. тест светодиод PORTB.2
;    //USISR |= (1<<USIOIF);//сбрасываем флаг
;	//while(!(USISR & (1<<USIOIF))){};//пока нет флага окончания передачи
;}
;*******************/
;
;//==== инициализация RF12B TX ================//
;//Initialization of radio module 433MHz//====28.04.2014
;void rfInit()
; 0000 0228   {
_rfInit:
; .FSTART _rfInit
; 0000 0229     //LO(0);  //0 на nRES Команда на сброс модуля - если модуль начинает глючить
; 0000 022A     //HI(0); //1 на nRES
; 0000 022B     writeCmd(0xFE00);//Команда на сброс 0xFE00 - если модуль начинает глючить
	LDI  R26,LOW(65024)
	LDI  R27,HIGH(65024)
	RCALL _writeCmd
; 0000 022C     //без сброса модуль глючит!!!
; 0000 022D     delay_ms(150); //after power-on reset, the module will not accept commands for about 150 ms
	LDI  R26,LOW(150)
	RCALL SUBOPT_0x3
; 0000 022E     //===================================================
; 0000 022F     writeCmd(0x80D8);//EL,EF,enable register,433MHz,12.5pF
	LDI  R26,LOW(32984)
	LDI  R27,HIGH(32984)
	RCALL _writeCmd
; 0000 0230     //writeCmd(0x8239); //!er,!ebb,et,ES,EX,!eb,!ew,DC(вых такт.ген. выкл.) вкл. в основной программе
; 0000 0231     //writeCmd(0xA640); //frequency select 434МГц
; 0000 0232     writeCmd(0xA620); //frequency select 433,92МГц
	LDI  R26,LOW(42528)
	LDI  R27,HIGH(42528)
	RCALL _writeCmd
; 0000 0233     //=== настройка скорости =======
; 0000 0234     //writeCmd(0xC608); //38.4kbps
; 0000 0235     writeCmd(0xC605); //57.6kbps
	LDI  R26,LOW(50693)
	LDI  R27,HIGH(50693)
	RCALL _writeCmd
; 0000 0236     //writeCmd(0xC602); //115.2kbps
; 0000 0237     writeCmd(0x94A0); //VDI,FAST,134kHz(57.6kbps),0dBm,-103dBm
	LDI  R26,LOW(38048)
	LDI  R27,HIGH(38048)
	RCALL _writeCmd
; 0000 0238     //writeCmd(0x95A0); //VDI,MIDDLE,134kHz(57.6kbps),0dBm,-103dBm
; 0000 0239     //writeCmd(0x9480); //VDI,FAST,200kHz(115,2kbps),0dBm,-103dBm
; 0000 023A     //==============================
; 0000 023B     writeCmd(0xC2EC); //al,ml,DIG,DQD4(авт.режим быстрый->медленный, ручной-быстрый)
	LDI  R26,LOW(49900)
	LDI  R27,HIGH(49900)
	RCALL _writeCmd
; 0000 023C     //writeCmd(0xC2AC); //AL,!ml,DIG,DQD4(авт.режим быстрый->медленный)этот лучше
; 0000 023D     //writeCmd(0xC26C); //!AL,ml,DIG,DQD4(ручной, быстрый)
; 0000 023E     //writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR 81-заполнение FIFO-буфера не по шаблону синхронизации
; 0000 023F     writeCmd(0xCA83); //FIFO8,SYNC,ff,DR ==83заполнение FIFO-буфера по шаблону синхронизации
	LDI  R26,LOW(51843)
	LDI  R27,HIGH(51843)
	RCALL _writeCmd
; 0000 0240     //writeCmd(0xCAE3);
; 0000 0241     writeCmd(0xCED6); //SYNC=2DD4(D4 по умолчанию) синхробайт
	LDI  R26,LOW(52950)
	LDI  R27,HIGH(52950)
	RCALL _writeCmd
; 0000 0242     //writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
; 0000 0243     writeCmd(0xC49B); //@PWR,YES RSTRIC,st,!fi,OE,EN настройки АПЧ
	LDI  R26,LOW(50331)
	LDI  R27,HIGH(50331)
	RCALL _writeCmd
; 0000 0244     //=== настройка модуляции и выходной мощности === !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; 0000 0245     //writeCmd(0x9850); //!mp,90kHz(57.6kbps),MAX Pout (полярность,полоса модуляции; Pвых)
; 0000 0246     //writeCmd(0x9852); //!mp,90kHz(57.6kbps),-6дБ Pout (полярность,полоса модуляции; Pвых)!!!
; 0000 0247     writeCmd(0x9855); //!mp,90kHz(57.6kbps),-15дБ OUT (полярность,полоса модуляции; Pвых)
	LDI  R26,LOW(38997)
	LDI  R27,HIGH(38997)
	RCALL _writeCmd
; 0000 0248     //writeCmd(0x9857); //!mp,90kHz(57.6kbps),-21дБ OUT (полярность,полоса модуляции; Pвых)
; 0000 0249     //writeCmd(0x9870); //!mp,120kHz(115,2kbps),MAX OUT (120kHz зависит от скорости передачи)
; 0000 024A     //===============================================
; 0000 024B     writeCmd(0xCC77); //OB1, OB0, LPX, 0-ddy, 1-DDIT, 1, 0-CBW0 =77 регистр настройки ФАПЧ
	LDI  R26,LOW(52343)
	LDI  R27,HIGH(52343)
	RCALL _writeCmd
; 0000 024C     writeCmd(0xE000); //NOT USED
	LDI  R26,LOW(57344)
	LDI  R27,HIGH(57344)
	RCALL _writeCmd
; 0000 024D     writeCmd(0xC800); //NOT USED
	LDI  R26,LOW(51200)
	LDI  R27,HIGH(51200)
	RCALL _writeCmd
; 0000 024E     writeCmd(0xC000); //1.0MHz,2.2V NOT USED
	LDI  R26,LOW(49152)
	LDI  R27,HIGH(49152)
	RJMP _0x2060003
; 0000 024F 
; 0000 0250     //======================================================
; 0000 0251     //LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
; 0000 0252     //HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
; 0000 0253     //writeCmd(0x8219); //включен только кварцевый генератор
; 0000 0254     //writeCmd(0x8218); //включен синтезатор, кварцевый генератор
; 0000 0255     //writeCmd(0x8259); //вкл демодулятора
; 0000 0256     //writeCmd(0x8221); // et-вкл. всего тракта передатчика,dc
; 0000 0257     //writeCmd(0x8281); // et-вкл. всего тракта приёмника,dc
; 0000 0258   }
; .FEND
;
;
;
;//================= GPS ======================//
;/*
;//Сообщения начинаются символом  «$» и заканчиваются символом «*», за которым
;//последовательно идут две шестнадцатеричные цифры контрольной суммы «hh»,
;//символы возврата каретки <CR> и перевода строки <LF>.
;//В качестве разделителя полей данных используется символ «,»
;//Контрольная сумма равна восьмибитному «исключающему ИЛИ» (HOR) всех
;//символов между символами «$» и «*» (не включая их). Передается в виде двух
;//шестнадцатеричных цифр (символов) старшей тетрадой вперед.
;//Максимальное общее количество символов в любом предложении 82;
;//максимум 79 символов между разделителем "$" и <CR><LF>
;//The maximum total number of characters in any sentence is 82;
;//maximum of 79 characters between the starting delimiter "$" and the terminating <CR><LF>.
;//====== СЕЙЧАС ВКЛЮЧЕН!!!
;//Меняем заводские установи GPS на более быстрые и убираем ненужные данные в NMEA:
;//set NMEA out RMS,GGA,GSA,GSV(1раз в 5циклов)
;//DGPS correction data source mode, disable
;//set EASY, disable (для высоких скоростей)
;//Set GPS baud rate: bps
;//USART Baud Rate: bps
;//Set Update Rate: Hz     USART Baud Rate: 14400bps,  Update Rate: 2Hz
;*/
;//============================================//
;
;//==== инициализация модуля GPS ====
;void init_GPS(void) //инициализация GPS проверкой преамбулы '$GP'
; 0000 0276 {
_init_GPS:
; .FSTART _init_GPS
	PUSH R15
; 0000 0277  bit flag_GPSinit = 1; //флаг инициализации GPS, если не нужна инициализация ставим 0
; 0000 0278  bit flag_setNMEA = 0; //Для теста, флаг разрешения изменения параметров GPS после проверки,0-запрет.
; 0000 0279  unsigned char i = 0;
; 0000 027A 
; 0000 027B while(flag_GPSinit)  //если флаг сброшен, выходим отсюда
	ST   -Y,R17
;	flag_GPSinit -> R15.0
;	flag_setNMEA -> R15.1
;	i -> R17
	LDI  R30,LOW(1)
	MOV  R15,R30
	LDI  R17,0
_0x3B:
	SBRS R15,0
	RJMP _0x3D
; 0000 027C  {
; 0000 027D   unsigned char chk_S, chk_G, chk_P;
; 0000 027E   //char string_chk[];
; 0000 027F   //string_chk[]= "$GP";
; 0000 0280   //===========  restore!!!  =======================
; 0000 0281   //putsf("$PMTK104*37\r\n");     //restore GPS default setting!!!
; 0000 0282   //Set restore the GPS system default  factory setting
; 0000 0283   //#asm("sei")// глобально разрешить прерывания
; 0000 0284   chk_S = getchar_Tout();
	SBIW R28,3
;	flag_GPSinit -> R15.0
;	flag_setNMEA -> R15.1
;	chk_S -> Y+2
;	chk_G -> Y+1
;	chk_P -> Y+0
	RCALL _getchar_Tout
	STD  Y+2,R30
; 0000 0285     //putchar(chk_S);//тестовое сообщение для отладки
; 0000 0286     if(chk_S=='$') {
	LDD  R26,Y+2
	CPI  R26,LOW(0x24)
	BRNE _0x3E
; 0000 0287       chk_G = getchar_Tout();
	RCALL _getchar_Tout
	STD  Y+1,R30
; 0000 0288       chk_P = getchar_Tout();
	RCALL _getchar_Tout
	ST   Y,R30
; 0000 0289         if(chk_G=='G' && chk_P=='P') {
	LDD  R26,Y+1
	CPI  R26,LOW(0x47)
	BRNE _0x40
	LD   R26,Y
	CPI  R26,LOW(0x50)
	BREQ _0x41
_0x40:
	RJMP _0x3F
_0x41:
; 0000 028A           //if ((PIND.5 == 0)&&(flag_setNMEA == 1)) {  //опрос перемычки и флага
; 0000 028B           if (flag_setNMEA == 1) {
	SBRC R15,1
; 0000 028C             goto line_setNMEA; //установка новых параметров
	RJMP _0x43
; 0000 028D            };
; 0000 028E 
; 0000 028F           flag_GPSinit = 0; //GPS настроен правильно
	CLT
	BLD  R15,0
; 0000 0290           LED_Blink(3, 100);//мигаем 3 раза быстро
	LDI  R30,LOW(3)
	ST   -Y,R30
	LDI  R26,LOW(100)
	LDI  R27,0
	RCALL _LED_Blink
; 0000 0291           //putsf("GOOD\r\n");//тестовое сообщение для отладки
; 0000 0292           break;
	ADIW R28,3
	RJMP _0x3D
; 0000 0293          };
_0x3F:
; 0000 0294        //LED_Blink(3, 200);//мигаем 3 раза быстро для отладки
; 0000 0295      };
_0x3E:
; 0000 0296    // else {
; 0000 0297        //LO(2); //вкл. тест светодиод PORTB.2
; 0000 0298        //putsf("ERROR\r\n"); //тестовое сообщение, для отладки
; 0000 0299        if(i==82) {  //кол-во циклов, для достоверного распознавания символов
	CPI  R17,82
	BRNE _0x44
; 0000 029A         //кол-во символов в кадре NMEA = $+79+CR+LF =82
; 0000 029B         //инициализация GPS
; 0000 029C           //ВНИМАНИЕ! Для установки нового Baud Rate в программе, скорость GPS должна быть 9,6kbps
; 0000 029D           //для этого отключить батарейку или сделать программный сброс GPS
; 0000 029E           //#asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS
; 0000 029F          UBRRL=0x5F; //USART Baud Rate: 9600 если у GPS начальная скорость 9,6kbps
	LDI  R30,LOW(95)
	OUT  0x9,R30
; 0000 02A0          //UBRRL=0x3F; //63 USART Baud Rate: 14400bps
; 0000 02A1          //UBRRL=0x2F; //47 USART Baud Rate: 19200bps
; 0000 02A2          //UBRRL=0x17; //23 USART Baud Rate: 38400bps
; 0000 02A3          //UBRRL=0x0F; //15 USART Baud Rate: 57600bps и 14,745600 MHz
; 0000 02A4          //===========  restore!!!  =======================
; 0000 02A5          //putsf("$PMTK104*37\r\n"); //restore GPS default setting!!!
; 0000 02A6          //Set restore the GPS system default  factory setting
; 0000 02A7          //заводские настройки 9600, 1Гц, заполнение 53,7% VTG(1)-GSA(1)-RMC(1)-GGA(1)-GSV(5)
; 0000 02A8 
; 0000 02A9          delay_ms(100);
	LDI  R26,LOW(100)
	RCALL SUBOPT_0x3
; 0000 02AA          line_setNMEA:
_0x43:
; 0000 02AB          #asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS
	cli
; 0000 02AC          //===========  set NMEA out ======================
; 0000 02AD          putsf("$PMTK314,0,1,0,1,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0*2C\r\n"); //set NMEA out: RMS,GGA,GSA,GSV(1раз в 5циклов)
	__POINTW2FN _0x0,0
	RCALL _putsf
; 0000 02AE          putsf("$PMTK301,0*2C\x0D\x0A"); //DGPS correction data source mode, disable. Для нас не нужен.
	__POINTW2FN _0x0,52
	RCALL _putsf
; 0000 02AF          putsf("$PMTK869,1,0*34\r\n");   //set EASY disable (для update-rate 2Гц и выше).
	__POINTW2FN _0x0,68
	RCALL _putsf
; 0000 02B0 
; 0000 02B1          //=========!!!  GPS Baudrate setting должен соответствовать UART !!!=========
; 0000 02B2          //Baudrate setting : 9600,14400,19200,38400,57600,115200
; 0000 02B3          // $PMTK251,38400*27<CR><LF> Change the baud rate 38400 bps
; 0000 02B4          //putsf("$PMTK251,9600*17\x0D\x0A"); //Set GPS baud rate 9600bps
; 0000 02B5          putsf("$PMTK251,14400*29\x0D\x0A"); //Set GPS baud rate 14400bps
	__POINTW2FN _0x0,86
	RCALL _putsf
; 0000 02B6          //putsf("$PMTK251,19200*22\x0D\x0A"); //Set GPS baud rate 19200bps
; 0000 02B7          //putsf("$PMTK251,38400*27\x0D\x0A"); //Set GPS baud rate 38400bps
; 0000 02B8          //putsf("$PMTK251,57600*2C\x0D\x0A"); //Set GPS baud rate 57600bps
; 0000 02B9          //putsf("$PMTK251,115200*1F\x0D\x0A"); //Set GPS baud rate 115200bps
; 0000 02BA          delay_ms(100);
	LDI  R26,LOW(100)
	RCALL SUBOPT_0x3
; 0000 02BB 
; 0000 02BC          //=========  USART Baud Rate должен соответствовать GPS!!!===================
; 0000 02BD          //BAUDRATE; //USART Baud Rate задаём в define
; 0000 02BE          //UBRRL=0x5F; //USART Baud Rate: 9600
; 0000 02BF          UBRRL=0x3F; //USART Baud Rate: 14400bps
	LDI  R30,LOW(63)
	OUT  0x9,R30
; 0000 02C0          //UBRRL=0x2F; //23 для Baud Rate: 19200bps
; 0000 02C1          //UBRRL=0x17; //23 для Baud Rate: 38400bps
; 0000 02C2          //UBRRL=0x0F; //USART Baud Rate: 57600bps
; 0000 02C3          delay_ms(500);//занимает 1,3% памяти
	LDI  R26,LOW(500)
	LDI  R27,HIGH(500)
	RCALL _delay_ms
; 0000 02C4 
; 0000 02C5          //========= GPS Update Rate ========================
; 0000 02C6         // putsf("$PMTK220,1000*1F\r\n"); //Set Update Rate-1Hz
; 0000 02C7          putsf("$PMTK220,500*2B\r\n"); //Set Update Rate-2Hz
	__POINTW2FN _0x0,106
	RCALL _putsf
; 0000 02C8          //putsf("$PMTK220,250*29\r\n"); //Set Update Rate-4Hz
; 0000 02C9          //putsf("$PMTK220,200*2C\r\n"); //Set Update Rate-5Hz
; 0000 02CA          //putsf("$PMTK220,100*2F\r\n"); //Set Update Rate-10Hz
; 0000 02CB 
; 0000 02CC        LED_Blink(1, 500);//мигаем 1 раз
	LDI  R30,LOW(1)
	RCALL SUBOPT_0x4
; 0000 02CD        //HI(2); //вЫкл. тест светодиод PORTB.2
; 0000 02CE        flag_setNMEA=0;
	CLT
	BLD  R15,1
; 0000 02CF        i=0;//сброс счётчика
	LDI  R17,LOW(0)
; 0000 02D0        #asm("sei")// глобально разрешить прерывания
	sei
; 0000 02D1        //break;
; 0000 02D2        //return;
; 0000 02D3        }
; 0000 02D4          else {
	RJMP _0x45
_0x44:
; 0000 02D5          i++; //счётчик
	SUBI R17,-1
; 0000 02D6          };
_0x45:
; 0000 02D7 
; 0000 02D8 
; 0000 02D9     //};
; 0000 02DA  };
	ADIW R28,3
	RJMP _0x3B
_0x3D:
; 0000 02DB 
; 0000 02DC  //#asm("sei")// глобально разрешить прерывания
; 0000 02DD  //LED_Blink(4, 1000);//мигаем 3 раза через 1сек.
; 0000 02DE } //конец инициализации GPS ============================================//
	LD   R17,Y+
	POP  R15
	RET
; .FEND
;//********//
;//GPS ВКЛЮЧЕН!!!******************************//
;
;//===================== перенос железа из main в init_ATtiny2313 ==============================//
;void init_ATtiny(void)
; 0000 02E4 {
_init_ATtiny:
; .FSTART _init_ATtiny
; 0000 02E5 // Crystal Oscillator division factor: 1
; 0000 02E6 #pragma optsize-
; 0000 02E7 CLKPR=0x80;
	LDI  R30,LOW(128)
	OUT  0x26,R30
; 0000 02E8 CLKPR=0x00;
	LDI  R30,LOW(0)
	OUT  0x26,R30
; 0000 02E9 #ifdef _OPTIMIZE_SIZE_
; 0000 02EA #pragma optsize+
; 0000 02EB #endif
; 0000 02EC 
; 0000 02ED // Input/Output Ports initialization
; 0000 02EE // Port A initialization
; 0000 02EF // Func2=In Func1=In Func0=In
; 0000 02F0 // State2=P State1=T State0=T
; 0000 02F1 PORTA=0x04;
	LDI  R30,LOW(4)
	OUT  0x1B,R30
; 0000 02F2 DDRA=0x00;
	LDI  R30,LOW(0)
	OUT  0x1A,R30
; 0000 02F3 
; 0000 02F4 // Port B initialization
; 0000 02F5 // Function: Bit7=Out Bit6=Out Bit5=In Bit4=Out Bit3=In Bit2=Out Bit1=In Bit0=Out
; 0000 02F6 //DDRB=(1<<DDB7) | (1<<DDB6) | (0<<DDB5) | (1<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (1<<DDB0);
; 0000 02F7 // State: Bit7=0 Bit6=0 Bit5=T Bit4=1 Bit3=T Bit2=1 Bit1=T Bit0=0
; 0000 02F8 //PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (1<<PORTB4) | (0<<PORTB3) | (1<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
; 0000 02F9 DDRB=0xD5;  //Bit0=Out
	LDI  R30,LOW(213)
	OUT  0x17,R30
; 0000 02FA PORTB=0x14;
	LDI  R30,LOW(20)
	OUT  0x18,R30
; 0000 02FB // Port B initialization
; 0000 02FC // Func7=Out Func6=Out Func5=In Func4=Out Func3=In Func2=Out Func1=In Func0=In
; 0000 02FD // State7=0 State6=0 State5=T State4=1 State3=T State2=1 State1=T State0=T
; 0000 02FE //PORTB=0x14;
; 0000 02FF //DDRB=0xD4; //PB2=Out State2=0 FSK в режиме передачи(1=TX; 0=RX)
; 0000 0300 //DDRB=0xD0;//PB2=IN
; 0000 0301 //PB4_SPI - SS линия выбора кристалла - выход
; 0000 0302 //PB5_SPI - DI линия входа данных - вход
; 0000 0303 //PB6_SPI - DO   линия выхода данных - выход
; 0000 0304 //PB7_SPI - UCSK линия тактирующего сигнала - выход
; 0000 0305 
; 0000 0306 // Port D initialization
; 0000 0307 // Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
; 0000 0308 // State6=0 State5=T State4=T State3=T State2=P State1=0 State0=P
; 0000 0309 //PORTD=0x05; //State5=T State3=T
; 0000 030A //PORTD=0x2D; //State5=P State3=P
; 0000 030B //DDRD=0x52;  //Func4=Out State4=0
; 0000 030C //DDRD=0x42;
; 0000 030D // Port D initialization
; 0000 030E // Function: Bit6=Out Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=Out Bit0=In
; 0000 030F DDRD=(1<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (1<<DDD1) | (0<<DDD0);
	LDI  R30,LOW(82)
	OUT  0x11,R30
; 0000 0310 // State: Bit6=0 Bit5=P Bit4=0 Bit3=P Bit2=P Bit1=0 Bit0=P
; 0000 0311 PORTD=(0<<PORTD6) | (1<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);
	LDI  R30,LOW(45)
	OUT  0x12,R30
; 0000 0312 //Port D4 выход=0
; 0000 0313 //Port D3 кнопка 1, подтяжка
; 0000 0314 //Port D5 перемычка (кнопка 2), подтяжка
; 0000 0315 
; 0000 0316 // Timer/Counter 0 initialization =======================================================
; 0000 0317 //max time Timer0 Period 17,778ms
; 0000 0318 // ============= Timer0 Stopped
; 0000 0319 // Mode: Normal top=0xFF
; 0000 031A // OC0A output: Disconnected
; 0000 031B // OC0B output: Disconnected
; 0000 031C //TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
; 0000 031D //TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
; 0000 031E // ============= End Timer0 Stopped
; 0000 031F // Clock value: 14,400 kHz
; 0000 0320 // Mode: Normal top=0xFF
; 0000 0321 // OC0A output: Disconnected
; 0000 0322 // OC0B output: Disconnected
; 0000 0323 // Timer Period: 17,778 ms
; 0000 0324   //TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00); //Start Timer0 TCCR0B=0x05
; 0000 0325 
; 0000 0326 //TCNT0=0x00;
; 0000 0327 //OCR0A=0x00;
; 0000 0328 //OCR0B=0x00;
; 0000 0329 
; 0000 032A // Timer/Counter 1 initialization =======================================================
; 0000 032B // Clock source: System Clock
; 0000 032C // Clock value: 57,600 kHz
; 0000 032D // Mode: Normal top=0xFFFF
; 0000 032E // OC1A output: Disconnected
; 0000 032F // OC1B output: Disconnected
; 0000 0330 // Noise Canceler: Off
; 0000 0331 // Input Capture on Falling Edge
; 0000 0332 // Timer Period: 1 s
; 0000 0333 // Timer1 Overflow Interrupt: On
; 0000 0334 // Input Capture Interrupt: Off
; 0000 0335 // Compare A Match Interrupt: Off
; 0000 0336 // Compare B Match Interrupt: Off
; 0000 0337 TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
	LDI  R30,LOW(0)
	OUT  0x2F,R30
; 0000 0338 TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);
	LDI  R30,LOW(4)
	OUT  0x2E,R30
; 0000 0339 //=======================================================================================
; 0000 033A // Timer Period: 0,25 s
; 0000 033B //TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
; 0000 033C //=======================================================================================
; 0000 033D // Timer Period: 0,9 s
; 0000 033E //TCNT1H=0x35;
; 0000 033F //TCNT1L=0x80;
; 0000 0340 //=======================================
; 0000 0341 TCNT1H=0x1F;  //Timer Period: 1 s, 0,25 s
	RCALL SUBOPT_0x0
; 0000 0342 TCNT1L=0x00;  //Timer Period: 1 s, 0,25 s
; 0000 0343 //=======================================
; 0000 0344 ICR1H=0x00;
	LDI  R30,LOW(0)
	OUT  0x25,R30
; 0000 0345 ICR1L=0x00;
	OUT  0x24,R30
; 0000 0346 OCR1AH=0x00;
	OUT  0x2B,R30
; 0000 0347 OCR1AL=0x00;
	OUT  0x2A,R30
; 0000 0348 OCR1BH=0x00;
	OUT  0x29,R30
; 0000 0349 OCR1BL=0x00;
	OUT  0x28,R30
; 0000 034A 
; 0000 034B // Timer(s)/Counter(s) Interrupt(s) initialization Timer1(TOIE1), Timer0(TOIE0)
; 0000 034C TIMSK=(1<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (1<<OCIE0A);
	LDI  R30,LOW(129)
	OUT  0x39,R30
; 0000 034D //TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (1<<OCIE0A);
; 0000 034E //=======================================================================================
; 0000 034F 
; 0000 0350 // Timer(s)/Counter(s) Interrupt(s) initialization
; 0000 0351 //TIMSK=(1<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);
; 0000 0352 //TIMSK=0; //запрет прерывания таймера
; 0000 0353 //TIMSK=0x80; //разрешение прерывания таймера Timer1 0b01000000
; 0000 0354 //TIMSK=0x02; //разрешение прерывания таймера Timer0 0b00000010
; 0000 0355 //TIMSK=0x42; //разрешение прерывания таймера Timer0,Timer1 0b01000010
; 0000 0356 
; 0000 0357 // External Interrupt(s) initialization ===============================//================
; 0000 0358 // INT0: On                                                            //
; 0000 0359 // INT0 Mode: Low level                                                //
; 0000 035A // INT1: Off                                                           //
; 0000 035B MCUCR=0x00; //MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); //
	LDI  R30,LOW(0)
	OUT  0x35,R30
; 0000 035C //GIMSK=0x40; //включает прерывания!!!                                 //
; 0000 035D //GIFR=0x40;  //включает прерывания!!!                                 //
; 0000 035E //===== то же самое только из новой версии CVAVR3 =====================//
; 0000 035F //GIMSK=(0<<INT1) | (1<<INT0) | (0<<PCIE0) | (0<<PCIE2) | (0<<PCIE1);  //GIMSK=0x40; 0b1000000
; 0000 0360 //GIFR=(0<<INTF1) | (1<<INTF0) | (0<<PCIF0) | (0<<PCIF2) | (0<<PCIF1); //GIFR=0x40; 0b1000000
; 0000 0361 //=====================================================================//
; 0000 0362 // External Interrupt(s) initialization
; 0000 0363 // INT0: Off
; 0000 0364 // INT1: On
; 0000 0365 // INT1 Mode: Low level
; 0000 0366 GIMSK=(1<<INT1) | (0<<INT0) | (0<<PCIE0) | (0<<PCIE2) | (0<<PCIE1);  //GIMSK=0x80; 0b10000000
	LDI  R30,LOW(128)
	OUT  0x3B,R30
; 0000 0367 GIFR=(1<<INTF1) | (0<<INTF0) | (0<<PCIF0) | (0<<PCIF2) | (0<<PCIF1); //GIFR=0x80;  0b10000000
	OUT  0x3A,R30
; 0000 0368 //=====================================================================
; 0000 0369 // External Interrupt(s) initialization
; 0000 036A // INT0: On
; 0000 036B // INT0 Mode: Low level
; 0000 036C // INT1: On
; 0000 036D // INT1 Mode: Low level
; 0000 036E //GIMSK=(1<<INT1) | (1<<INT0) | (0<<PCIE0) | (0<<PCIE2) | (0<<PCIE1);  //GIMSK=0xC0; (0b11000000)
; 0000 036F //GIFR=(1<<INTF1) | (1<<INTF0) | (0<<PCIF0) | (0<<PCIF2) | (0<<PCIF1); //GIFR=0xC0; (0b11000000)
; 0000 0370 //=======================================================================================
; 0000 0371 
; 0000 0372 // Universal Serial Interface initialization ==========================================//
; 0000 0373 // Mode: Three Wire (SPI)
; 0000 0374 // USI Counter Overflow Interrupt: Off
; 0000 0375    // Clock source: Register & Counter=USICLK
; 0000 0376 //USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (1<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (1<<USICLK) | (0<<USITC);
; 0000 0377    // Clock source: Register & Counter=no clk.
; 0000 0378 //USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (1<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);
; 0000 0379 
; 0000 037A // Mode: Off (SPI)
; 0000 037B USICR=0x00; //отключен - конфигурация в программе
	LDI  R30,LOW(0)
	OUT  0xD,R30
; 0000 037C //USICR=0x12; //Three Wire(SPI), Register&Counter=USICLK отключить- конфигурация в программе
; 0000 037D //USICR=0x2; //0x12 отключить- конфигурация в программе
; 0000 037E 
; 0000 037F 
; 0000 0380 // USART initialization================================================================//
; 0000 0381 //=======  работа с прерываниями и без:  =============
; 0000 0382 // Communication Parameters: 8 Data, 1 Stop, No Parity
; 0000 0383 // USART Receiver: On
; 0000 0384 // USART Transmitter: On
; 0000 0385 // USART Mode: Asynchronous
; 0000 0386 // USART Baud Rate: 57600
; 0000 0387 UCSRA=0x00; //скорость обмена, (0x02 удвоеная скорость)
	OUT  0xB,R30
; 0000 0388 //UCSRA=0x02; //скорость обмена, (0x02 удвоеная скорость)
; 0000 0389 //===========прерывания=========
; 0000 038A UCSRB=0x98; //разрешение приёма, передачи, прерывание Rx
	LDI  R30,LOW(152)
	OUT  0xA,R30
; 0000 038B //UCSRB=0xD8; //разрешение приёма, передачи, прерывание Rx Tx
; 0000 038C //UCSRB=0x18; //работа Без прерываний разрешение приёма, передачи
; 0000 038D //==========формат кадра========
; 0000 038E UCSRC=0x06; //формат кадра 8data, 1stop, Asynchronous, выбор регистра UCSRC
	LDI  R30,LOW(6)
	OUT  0x3,R30
; 0000 038F //==========скорость============
; 0000 0390 UBRRH=0x00; //UBRR регистр скорости
	LDI  R30,LOW(0)
	OUT  0x2,R30
; 0000 0391 //UBRRL=0x0F; //!!!Baud Rate: 15 для 57600(14,745600 MHz), задаём с помошью BAUDRATE!!!
; 0000 0392 BAUDRATE;
	LDI  R30,LOW(63)
	OUT  0x9,R30
; 0000 0393 //=====================================================================================//
; 0000 0394 
; 0000 0395  //Без прерываний:
; 0000 0396 //====== USART Baud Rate: 57600 ====
; 0000 0397 //UCSRA=0x00;
; 0000 0398 //UCSRB=0x18; //работа Без прерываний разрешение приёма, передачи
; 0000 0399 //UCSRC=0x06; //формат кадра 8data, 1stop, Asynchronous, выбор регистра UCSRC
; 0000 039A //UBRR регистр скорости
; 0000 039B //UBRRH=0x00;
; 0000 039C //UBRRL=0x0F; // 15 для 57600bps и 14,745600 MHz
; 0000 039D //UBRRL=0x17; //23 для Baud Rate: 38400 ===
; 0000 039E //UBRRL=0x2F; //23 для Baud Rate: 19200bps
; 0000 039F //UBRRL=0x5F; //95 для Baud Rate: 9600 ===
; 0000 03A0 //BAUDRATE; //#define BAUDRATE UBRRL=0x2F; //23 для Baud Rate: 19200bps
; 0000 03A1 
; 0000 03A2 // Analog Comparator initialization ===================================================//
; 0000 03A3 // Analog Comparator: Off
; 0000 03A4 // Analog Comparator Input Capture by Timer/Counter 1: Off
; 0000 03A5 ACSR=0x80;
	LDI  R30,LOW(128)
	OUT  0x8,R30
; 0000 03A6 DIDR=0x00;
	LDI  R30,LOW(0)
	OUT  0x1,R30
; 0000 03A7 
; 0000 03A8   //#asm("cli") // глобально запретить прерывания
; 0000 03A9   //#asm("sei")// глобально разрешить прерывания
; 0000 03AA 
; 0000 03AB } //========================== конец инициализации ATTiny2313 =================================//
	RET
; .FEND
;
;//*********************************************************************************************//
;void main(void)  //===================== основной цикл программы ==============================//
; 0000 03AF {
_main:
; .FSTART _main
; 0000 03B0 //unsigned char i;
; 0000 03B1 //unsigned char b1,b2,b3,b4;
; 0000 03B2 //unsigned char b5;
; 0000 03B3 //volatile unsigned int i;
; 0000 03B4 //unsigned char k=0;
; 0000 03B5 //unsigned int ChkSum;
; 0000 03B6 //unsigned char TickCounter_rfTX=0;
; 0000 03B7 //unsigned char TickTimer10s=0;
; 0000 03B8 //bit flag_TickCounter_rfTX=0;
; 0000 03B9 //bit flag_s=0;
; 0000 03BA 
; 0000 03BB init_ATtiny();//инициализация железа init_ATtiny2313
	RCALL _init_ATtiny
; 0000 03BC //BAUDRATE; //задана в init_ATtiny()   (GPS #define BAUDRATE UBRRL=0x2F; //23 для Baud Rate: 19200bps)
; 0000 03BD   //=1.Инициализация RF12, rfInit() установка параметров приёма-передачи
; 0000 03BE   //Перед инициализацией модуля, вы можете сбросить его.
; 0000 03BF   //Команда на сброс 0xFE00.
; 0000 03C0   //=2.Инициализация GPS, установка параметров
; 0000 03C1   //тракт усилителя мощности вкл до начала передачи
; 0000 03C2 
; 0000 03C3 #asm("sei")// глобально разрешить прерывания
	sei
; 0000 03C4 init_GPS(); //установка параметров модуля GPS сейчас включен!!!=======================
	RCALL _init_GPS
; 0000 03C5    //flag_init=1; для тестирования в прерывании
; 0000 03C6    //LED_Blink(3, 500);//мигаем 3 раза медленно
; 0000 03C7    //putsf("rfSend\r\n");//тестовое сообщение на терминал
; 0000 03C8    //LED_ON(); //вкл. светодиод
; 0000 03C9    //delay_ms(2000); //ДЛЯ ТЕСТА, при отладке
; 0000 03CA    //LED_ON(6); //вкл. светодиод и усилитель мощности
; 0000 03CB    //UCSRB=0x98; //разрешить прерывания Rx UART
; 0000 03CC    //#asm("sei")// глобально разрешить прерывания
; 0000 03CD #asm("cli") // глобально запретить прерывания
	cli
; 0000 03CE rfInit(); //инициализация RF12
	RCALL _rfInit
; 0000 03CF LED_Blink(2, 500);//мигаем 2 раз медленно
	LDI  R30,LOW(2)
	RCALL SUBOPT_0x4
; 0000 03D0    //putsf("rfInit\r\n");//тестовое сообщение на терминал
; 0000 03D1 #asm("sei")// глобально разрешить прерывания
	sei
; 0000 03D2  while(1){
_0x46:
; 0000 03D3  //=== режим передачи =============================
; 0000 03D4  LED_ON(6); //вкл. светодиод и усилитель мощности
	RCALL SUBOPT_0x5
; 0000 03D5  writeCmd(0x8239); //вкл. передатчик TX
; 0000 03D6  FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста)
	CBI  0x18,2
; 0000 03D7     //FIFOReset(); //Disable,Enable FIFO, сброс буфера
; 0000 03D8 
; 0000 03D9  //режим ожидания, TX затем RX ===============================================================
; 0000 03DA   //timeout_T0=1;      //  && !(flag_TickCounter_rfTX && flag_delay))
; 0000 03DB   //   while (timeout_T0 && PIND.5==0) {
; 0000 03DC   //   rfSend_GPS(); //передача, StartTimer0_init(); запуск таймера timeout_T0 в getchar_Tout
; 0000 03DD   //   };
; 0000 03DE 
; 0000 03DF    //GIMSK=0x00; //запретить прерывания int1 для запрета передачи данных кнопки1
; 0000 03E0 
; 0000 03E1    do {
_0x4E:
; 0000 03E2    rfSend_GPS();
	RCALL _rfSend_GPS
; 0000 03E3    }
; 0000 03E4    while (timeout_T0); //{rfSend_GPS();}
	SBIC 0x13,0
	RJMP _0x4E
; 0000 03E5 
; 0000 03E6    //GIMSK=0x80; //разрешить прерывания int1 разрешение работы кнопки К1
; 0000 03E7 
; 0000 03E8 
; 0000 03E9 /******************************************
; 0000 03EA    //if ((dataGPS==0x0A)&& flag_delay) //если приняли последний символ пакета <LF>
; 0000 03EB //   if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета <LF>
; 0000 03EC //     {                               //и таймер кончился, выходим отсюда (для подстраховки)
; 0000 03ED //        //flag_GPS=0; //перенесено в rfSend_GPS для анализа начала нового пакета с символа "$",
; 0000 03EE //        break;        //здесь теряет первый символ начала пакета
; 0000 03EF //     };
; 0000 03F0 
; 0000 03F1 
; 0000 03F2 //      if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета <LF>
; 0000 03F3 //     {                               //и таймер кончился, выходим отсюда
; 0000 03F4 //        flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$"
; 0000 03F5 //        //break;
; 0000 03F6 //     };
; 0000 03F7 
; 0000 03F8    //if (!timeout_T0) break; //если время ожидания данных закончилось, выходим из цикла
; 0000 03F9 //   if ((dataGPS==0x0A)&& flag_delay) //если приняли последний символ пакета <LF>
; 0000 03FA //     {                                   //и таймер кончился, выходим отсюда
; 0000 03FB //        flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$"
; 0000 03FC //        break;
; 0000 03FD //     };
; 0000 03FE 
; 0000 03FF //    if ((dataGPS==0x0A)&&((flag_2s_10s==0)&& flag_delay)) //если приняли последний символ пакета <LF>
; 0000 0400 //     {                                   //и таймер кончился, выходим отсюда
; 0000 0401 //        flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$"
; 0000 0402 //        break;
; 0000 0403 //     };
; 0000 0404 
; 0000 0405      //if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно <LF> и таймер кончился, можно выходить отсюда
; 0000 0406      //PORTD.4^=1; //пикаем для теста
; 0000 0407  //FIFOReset(); //Disable,Enable FIFO, сброс буфера
; 0000 0408     // delay_ms(350);
; 0000 0409 ***************************************************/
; 0000 040A 
; 0000 040B  /***********
; 0000 040C //режим полёта, TX постоянно ===================================================================
; 0000 040D    while (PIND.5==1 && flag_delay==0) {
; 0000 040E     rfSend_GPS(); //крутимся здесь, пока не закончится время задержки (10мин)
; 0000 040F    };
; 0000 0410  ************/
; 0000 0411 
; 0000 0412  //=== режем приёма между пакетами GPS, и режим передачи раз в 10(7)сек ============================
; 0000 0413     //ожидание RX UART и режим приёма RF RX      flag_TickCounter_rfTX=1;
; 0000 0414     //выполняем цикл, если буфер RX UART пустой или таймер истёк
; 0000 0415 
; 0000 0416      if (flag_delay && (flag_TickCounter_rfTX==0)) {  //&& (flag_GPS==0) наверно нужен
	SBIS 0x13,3
	RJMP _0x51
	SBIS 0x13,4
	RJMP _0x52
_0x51:
	RJMP _0x50
_0x52:
; 0000 0417        TickCounter_rfTX++;
	INC  R4
; 0000 0418        if (TickCounter_rfTX == 6) { //6 если передано 5 пачек (6или7)
	LDI  R30,LOW(6)
	CP   R30,R4
	BRNE _0x53
; 0000 0419         //PORTB.0 ^=1; //для теста светодиод
; 0000 041A         flag_TickCounter_rfTX=1;
	SBI  0x13,4
; 0000 041B         //TickTimer10s = 0;
; 0000 041C         //TickCounter_rfTX = 0; //обнуляем счётчик в прерывании таймера T1
; 0000 041D        };
_0x53:
; 0000 041E      };
_0x50:
; 0000 041F           //ждем приема байта   while( ( UCSRA & ( 1 << RXC ) ) == 0  );
; 0000 0420           //UCSRA UDRE bit5 Data Register Empty  (1<<UDR)вместо (rx_counter==0)
; 0000 0421     while ((rx_counter==0)||(flag_delay && flag_TickCounter_rfTX)) { //работает даже с буфером 8байт
_0x56:
	TST  R11
	BREQ _0x59
	SBIS 0x13,3
	RJMP _0x5A
	SBIC 0x13,4
	RJMP _0x59
_0x5A:
	RJMP _0x58
_0x59:
; 0000 0422            // PORTB.0 ^=1; //для теста светодиод
; 0000 0423      //GIMSK=0x00; //запретить прерывания int1
; 0000 0424      if (flag_KN1) {
	SBIS 0x13,6
	RJMP _0x5D
; 0000 0425       rfSend_K(1); //посылаем по RF код кнопки 1
	LDI  R26,LOW(1)
	RCALL _rfSend_K
; 0000 0426       flag_KN1=0;
	CBI  0x13,6
; 0000 0427       flag_rfSend_K=1; //флаг передачи данных кнопки, для исключения бребезга и повтора
	SBI  0x13,7
; 0000 0428                        //таймером1, возможна только одна передача в 1сек.
; 0000 0429       //GIMSK=0x80; //разрешить прерывания int1, разрешение работы кнопки К1
; 0000 042A      };
_0x5D:
; 0000 042B 
; 0000 042C     rfRecv_Kn(); //приём данных кнопки
	RCALL _rfRecv_Kn
; 0000 042D 
; 0000 042E      //if (flag_KN1==0) {
; 0000 042F      //GIMSK=0x80; //разрешить прерывания int1
; 0000 0430      //};
; 0000 0431      };
	RJMP _0x56
_0x58:
; 0000 0432 
; 0000 0433  };
	RJMP _0x46
; 0000 0434 } //======================== конец основного цикла программы ==================================//
_0x62:
	RJMP _0x62
; .FEND
;//*********************************************************************************************//
;
;unsigned char rfRecv() {  //приём данных по радиоканалу
; 0000 0437 unsigned char rfRecv() {
_rfRecv:
; .FSTART _rfRecv
; 0000 0438 //unsigned char data_RF;
; 0000 0439           //if (nINT && DCLK) {}  //если данные действительны и FIFO заполнен
; 0000 043A           //while (!DCLK);  //ждём заполнения FIFO
; 0000 043B  if (nINT) { //если данные действительны
	SBIS 0x16,3
	RJMP _0x63
; 0000 043C    //while (!(nINT && DCLK)) {// для теста=============
; 0000 043D    StartTimer0_init();
	SBI  0x13,0
	LDI  R30,LOW(2)
	OUT  0x30,R30
	LDI  R30,LOW(3)
	OUT  0x33,R30
	LDI  R30,LOW(0)
	OUT  0x32,R30
	LDI  R30,LOW(229)
	OUT  0x36,R30
	LDI  R30,LOW(5)
	OUT  0x38,R30
; 0000 043E    while ((DCLK==0) && timeout_T0) ;  //ждём заполнения FIFO
_0x64:
	SBIC 0x16,1
	RJMP _0x67
	SBIC 0x13,0
	RJMP _0x68
_0x67:
	RJMP _0x66
_0x68:
	RJMP _0x64
_0x66:
; 0000 043F 
; 0000 0440    if (nINT && DCLK) {  //если данные действительны и FIFO заполнен
	SBIS 0x16,3
	RJMP _0x6A
	SBIC 0x16,1
	RJMP _0x6B
_0x6A:
	RJMP _0x69
_0x6B:
; 0000 0441       SDO = 0;
	CBI  0x18,6
; 0000 0442       FSK=0; //0-выбор FIFO для чтения
	CBI  0x18,2
; 0000 0443       LO(nSEL);  // PORTB.4 SPI nSEL=0 (chip select ENABLE)
	CBI  0x18,4
; 0000 0444 
; 0000 0445      //USIDR = 0;//передаваемые данные в сдвиговый регисть
; 0000 0446      USICR = 0b00010001;//и формируем тактирующие импульсы программно
	RCALL SUBOPT_0x2
; 0000 0447      USICR = 0b00010011;
; 0000 0448      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 0449      USICR = 0b00010011;
; 0000 044A      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 044B      USICR = 0b00010011;
; 0000 044C      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 044D      USICR = 0b00010011;
; 0000 044E      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 044F      USICR = 0b00010011;
; 0000 0450      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 0451      USICR = 0b00010011;
; 0000 0452      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 0453      USICR = 0b00010011;
; 0000 0454      USICR = 0b00010001;
	RCALL SUBOPT_0x2
; 0000 0455      USICR = 0b00010011;
; 0000 0456      return (USIDR);
	IN   R30,0xF
	RET
; 0000 0457      //data_RF = USIDR; //сохраняем байт из USIDR
; 0000 0458      //return (data_RF);
; 0000 0459    };
_0x69:
; 0000 045A  };
_0x63:
; 0000 045B //line_end_rfRecv:
; 0000 045C }
	RET
; .FEND
;         //dataRF = rfSend_Byte(0); // регистр чтения FIFO буфера
;         //while (DCLK&&SDI){putchar('=');};  //ждём окончания чтения FIFO
;         //FSK=1; //1-выкл. чтения FIFO приёмного региста
;         //HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
;         //FIFOReset();
;         //putchar(dataGPS);//передача данных на UART
;
;
;void FIFOReset() {
; 0000 0465 void FIFOReset() {
_FIFOReset:
; .FSTART _FIFOReset
; 0000 0466 writeCmd(0xCA81);//FIFO8,SYNC,!ff,DR Disable FIFO, сброс буфера
	LDI  R26,LOW(51841)
	LDI  R27,HIGH(51841)
	RCALL _writeCmd
; 0000 0467 writeCmd(0xCA83);//FIFO8,SYNC,ff,DR Enable FIFO
	LDI  R26,LOW(51843)
	LDI  R27,HIGH(51843)
_0x2060003:
	RCALL _writeCmd
; 0000 0468 }
	RET
; .FEND
;
;
;void rfRecv_Kn(void) //приём данных с кнопок
; 0000 046C {
_rfRecv_Kn:
; .FSTART _rfRecv_Kn
; 0000 046D //unsigned char dataRF;
; 0000 046E //unsigned char ChkSum;
; 0000 046F //unsigned char i;
; 0000 0470 unsigned char b1,b2,b3,b4;
; 0000 0471 
; 0000 0472 writeCmd(0x82D9); //вкл. приёмник RX
	RCALL __SAVELOCR4
;	b1 -> R17
;	b2 -> R16
;	b3 -> R19
;	b4 -> R18
	RCALL SUBOPT_0x6
; 0000 0473 LED_OFF(6); //выкл. усилитель мощности и светодиод, вкл ант. усилитель
; 0000 0474 FIFOReset();
	RCALL _FIFOReset
; 0000 0475        //dataRF=rfRecv();
; 0000 0476        //ChkSum=0;
; 0000 0477        //if (knb == dataRF) {  //обработка данных от кнопки
; 0000 0478        if (knb == rfRecv()) {  //обработка данных от кнопки
	RCALL _rfRecv
	CPI  R30,LOW(0x6B)
	BRNE _0x72
; 0000 0479           //dataRF=0;
; 0000 047A           b1=rfRecv();
	RCALL _rfRecv
	MOV  R17,R30
; 0000 047B           b2=rfRecv();
	RCALL _rfRecv
	MOV  R16,R30
; 0000 047C           b3=rfRecv();
	RCALL _rfRecv
	MOV  R19,R30
; 0000 047D           b4=rfRecv();
	RCALL _rfRecv
	MOV  R18,R30
; 0000 047E           //b5=rfRecv(); //5-й байт - контр. сумма
; 0000 047F           //putchar(dataRF); //передача данных на UART
; 0000 0480 
; 0000 0481           //LED_Blink_D4(1, 20); //тестовая
; 0000 0482           //проверка срабатывания кнопоки1 или кнопки2
; 0000 0483 
; 0000 0484           if (b1==k1b1 && b2==k1b2 && b3==k1b3 && b4==k1b4){ //кнопка1 "Старт-Поиск"
	CPI  R17,49
	BRNE _0x74
	CPI  R16,50
	BRNE _0x74
	CPI  R19,51
	BRNE _0x74
	CPI  R18,54
	BREQ _0x75
_0x74:
	RJMP _0x73
_0x75:
; 0000 0485              PORTD.4=1; //выход кн.1 на зв. излучатель и воспламенитель
	SBI  0x12,4
; 0000 0486              //выключаем вторым нажатием кнопки
; 0000 0487              //или через 5сек после размыкания перемычки PIND.5, в прерывании таймера
; 0000 0488              //LED_Blink_D4(2, 1000); //тестовая
; 0000 0489           };
_0x73:
; 0000 048A 
; 0000 048B           if (b1==k2b1 && b2==k2b2 && b3==k2b3 && b4==k2b4) { //кнопка2 ""
	CPI  R17,50
	BRNE _0x79
	CPI  R16,53
	BRNE _0x79
	CPI  R19,55
	BRNE _0x79
	CPI  R18,50
	BREQ _0x7A
_0x79:
	RJMP _0x78
_0x7A:
; 0000 048C             PORTB.0=1; //выход кнопки2 (изменить на плате)
	SBI  0x18,0
; 0000 048D             //выключаем вторым нажатием кнопки
; 0000 048E             //или через 1сек в прерывании таймера
; 0000 048F             //break;
; 0000 0490            };
_0x78:
; 0000 0491 
; 0000 0492           //putchar(b1); //передача данных на UART, для теста
; 0000 0493           //putchar(b2); //передача данных на UART, для теста
; 0000 0494           //putchar(b3); //передача данных на UART, для теста
; 0000 0495           //putchar(b4); //передача данных на UART, для теста
; 0000 0496           //putchar(b5); //передача данных на UART, для теста
; 0000 0497        };
_0x72:
; 0000 0498 
; 0000 0499     //};
; 0000 049A FSK=1; //1-выкл. чтения FIFO приёмного региста
	SBI  0x18,2
; 0000 049B HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
	SBI  0x18,4
; 0000 049C FIFOReset(); //приём окончен
	RCALL _FIFOReset
; 0000 049D }
	RCALL __LOADLOCR4
_0x2060002:
	ADIW R28,4
	RET
; .FEND
;
;//вариант 1
;void rfSend_GPS(void) //передача байта GPS с UART по RF, с анализом начала и конца пакета
; 0000 04A1 {
_rfSend_GPS:
; .FSTART _rfSend_GPS
; 0000 04A2         //flag_GPS=1; //для передачи без анализа начала пакета '$'
; 0000 04A3 //StartTimer0_init(); //запуск таймера, расположен в getchar_Tout();
; 0000 04A4 dataGPS = getchar_Tout();
	RCALL _getchar_Tout
	MOV  R6,R30
; 0000 04A5  if (dataGPS=='$') {        //&&(flag_GPS==0))
	LDI  R30,LOW(36)
	CP   R30,R6
	BRNE _0x7F
; 0000 04A6     flag_GPS=1;    //для анализа начала и конца пакета
	SBI  0x13,5
; 0000 04A7  };
_0x7F:
; 0000 04A8   //выполняем если timeout не закончился и первый символ '$', при флаге GPS=0
; 0000 04A9   //выполняем если timeout не закончился и первый символ любой, при флаге GPS=1
; 0000 04AA   if (timeout_T0 && !((dataGPS!='$')&&(flag_GPS==0))) {
	SBIS 0x13,0
	RJMP _0x83
	LDI  R30,LOW(36)
	CP   R30,R6
	BREQ _0x84
	SBIS 0x13,5
	RJMP _0x83
_0x84:
	RJMP _0x86
_0x83:
	RJMP _0x82
_0x86:
; 0000 04AB   //if (timeout_T0) {
; 0000 04AC     //flag_GPS=1;
; 0000 04AD     FSK=1; //1-вкл. перед. регистр
	RCALL SUBOPT_0x7
; 0000 04AE     writeCmd(0x0000);//читать(сбрасывать) регистр состояния перед каждым кадром
; 0000 04AF     //FSK=1; //1-вкл. перед. регистр здесь не работает
; 0000 04B0     LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
; 0000 04B1     //FSK=1; //1-вкл. перед. регистр здесь не работает
; 0000 04B2     rfSend_Byte(0xB8); // вкл. Передающий регистр
; 0000 04B3     rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит
; 0000 04B4     //rfSend_Byte(0xAA); // SYNC byte, необязателен на скорости 14400 не успевает передавать
; 0000 04B5     //========= Шаблон действительных данных
; 0000 04B6     rfSend_Byte(0x2D); // SYNC HI byte
; 0000 04B7     rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется
; 0000 04B8     //========= передача данных
; 0000 04B9     rfSend_Byte(dataGPS);   // передача по радиоканалу
	MOV  R26,R6
	RCALL _rfSend_Byte
; 0000 04BA     //dataGPS = getchar_Tout();
; 0000 04BB     //rfSend_Byte(dataGPS);   // передача по радиоканалу
; 0000 04BC     //dataGPS = getchar_Tout();
; 0000 04BD     //rfSend_Byte(dataGPS);   // передача по радиоканалу
; 0000 04BE     //dataGPS = getchar_Tout();
; 0000 04BF     //rfSend_Byte(dataGPS);   // передача по радиоканалу
; 0000 04C0        //rfSend_Byte(0x0D); //CR  (Carriage Return)
; 0000 04C1        //rfSend_Byte(0x0A); //LF  (Line Feed)
; 0000 04C2     //========= конец данных
; 0000 04C3        //rfSend_Byte(ChkSum); // контрольная сумма
; 0000 04C4     rfSend_Byte(0x00); // DUMMY BYTES хорошо
	RCALL SUBOPT_0x8
; 0000 04C5        //rfSend_Byte(0x00); // DUMMY BYTES
; 0000 04C6        //rfSend_Byte(0xAA); // DUMMY BYTES плохо
; 0000 04C7 
; 0000 04C8     FSK=0; //0-выкл. перед. регистр(вкл. приёмный регистр)
; 0000 04C9     HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
; 0000 04CA     //===== передача окончена
; 0000 04CB     //LED_OFF(6); //выкл. усилитель, светодиод
; 0000 04CC   };                  //&&(timeout_T0==0))
_0x82:
; 0000 04CD     if (dataGPS==0x0A) {//если приняли последний символ пакета <LF>
	LDI  R30,LOW(10)
	CP   R30,R6
	BRNE _0x8B
; 0000 04CE        flag_GPS=0;      //в rfSend_GPS для анализа начала нового пакета с символа "$"
	CBI  0x13,5
; 0000 04CF      };
_0x8B:
; 0000 04D0 
; 0000 04D1 //end_rfSend_GPS:  //точка выхода
; 0000 04D2 }
	RET
; .FEND
;
;//вариант 2
;/*
;void rfSend_GPS(void) //передача байта GPS с UART
;{
;// while (flag_1s==0) {
;//if (flag_1s==0) {
; dataGPS = getchar_Tout();
;// };
;    if ((dataGPS=='$')||(flag_GPS==1)) {
;         //goto end_rfSend_GPS;
;         //dataGPS = 0;
;    flag_GPS=1;
;    //writeCmd(0x8239); //вкл. передатчик TX
;     //FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста)
;    FSK=1; //1-вкл. перед. регистр
;    writeCmd(0x0000);//читать регистр состояния перед каждым кадром
;    //FSK=1; //1-вкл. перед. регистр здесь не работает
;    //writeCmd(0x8239); //вкл. передатчик TX ================================
;
;    LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
;    //FSK=1; //1-вкл. перед. регистр здесь не работает
;    rfSend_Byte(0xB8); // вкл. Передающий регистр
;    rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит
;    //rfSend_Byte(0xAA); // SYNC byte, необязателен на скорости 14400 не успевает передавать
;    //========= Шаблон действительных данных
;    rfSend_Byte(0x2D); // SYNC HI byte
;    rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется
;    //========= передача данных
;    rfSend_Byte(dataGPS);   // передача по радиоканалу
;       //rfSend_Byte(0x0D); //CR  (Carriage Return)
;       //rfSend_Byte(0x0A); //LF  (Line Feed)
;    //========= конец данных
;       //rfSend_Byte(ChkSum); // контрольная сумма
;    rfSend_Byte(0x00); // DUMMY BYTES хорошо
;       //rfSend_Byte(0xAA); // DUMMY BYTES плохо
;    //delay_ms(1);
;    FSK=0; //0-выкл. перед. регистр(вкл. приёмный регистр)
;    HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
;    //===== передача окончена
;       //LED_OFF(6); //выкл. усилитель, светодиод
;    //end_rfSend_GPS:  //точка выхода
;    };
;}
;*/
;
;
;void rfSend_K(char kb) //передача кода кнопки
; 0000 0503 {
_rfSend_K:
; .FSTART _rfSend_K
	PUSH R15
; 0000 0504 bit flag_rx;
; 0000 0505 //char K1, K2;
; 0000 0506 //#asm("cli") // глобально запретить прерывания
; 0000 0507 //GIMSK=0x00; //запретить прерывания int1
; 0000 0508 
; 0000 0509 //если был включен режим приёма(PIND.6=0), переключаемся на передачу
; 0000 050A     if (PIND.6==0) {
	ST   -Y,R26
;	kb -> Y+0
;	flag_rx -> R15.0
	SBIC 0x10,6
	RJMP _0x8E
; 0000 050B       flag_rx=1; //запоминаем, какой был режим до переключения
	SET
	BLD  R15,0
; 0000 050C       LED_ON(6); //вкл. светодиод и усилитель мощности (PIND.6==1)
	RCALL SUBOPT_0x5
; 0000 050D       //FSK=1; //1-вкл. перед. регистр
; 0000 050E       writeCmd(0x8239); //вкл. передатчик TX
; 0000 050F     };
_0x8E:
; 0000 0510 FSK=1; //1-вкл. перед. регистр
	RCALL SUBOPT_0x7
; 0000 0511 writeCmd(0x0000);//читать(сбрасывать) регистр состояния перед каждым кадром
; 0000 0512 LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
; 0000 0513 
; 0000 0514 rfSend_Byte(0xB8); // вкл. Передающий регистр
; 0000 0515 rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит
; 0000 0516 //rfSend_Byte(0xAA); // SYNC byte, необязателен
; 0000 0517 //========= Шаблон действительных данных
; 0000 0518 rfSend_Byte(0x2D); // SYNC HI byte
; 0000 0519 rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется
; 0000 051A //========= передача данных
; 0000 051B rfSend_Byte(knb);   // передача символа кнопки
	LDI  R26,LOW(107)
	RCALL _rfSend_Byte
; 0000 051C     if (kb==1) {
	LD   R26,Y
	CPI  R26,LOW(0x1)
	BRNE _0x93
; 0000 051D     rfSend_Byte(k1b1);   // передача byte1 кнопки1
	LDI  R26,LOW(49)
	RCALL _rfSend_Byte
; 0000 051E     rfSend_Byte(k1b2);   // передача byte2
	LDI  R26,LOW(50)
	RCALL _rfSend_Byte
; 0000 051F     rfSend_Byte(k1b3);   // передача byte3
	LDI  R26,LOW(51)
	RCALL _rfSend_Byte
; 0000 0520     rfSend_Byte(k1b4);   // передача byte4
	LDI  R26,LOW(54)
	RCALL _rfSend_Byte
; 0000 0521     //rfSend_Byte(k1b5);   // передача byte5
; 0000 0522     //rfSend_Byte(codeK1); // передача codeK1 кнопки1
; 0000 0523     };
_0x93:
; 0000 0524 
; 0000 0525 //    if (kb==2) {
; 0000 0526 //    rfSend_Byte(k2b1);   // передача byte1 кнопки2
; 0000 0527 //    rfSend_Byte(k2b2);   // передача byte2
; 0000 0528 //    rfSend_Byte(k2b3);   // передача byte3
; 0000 0529 //    rfSend_Byte(k2b4);   // передача byte4
; 0000 052A //    //rfSend_Byte(k2b5);   // передача byte5
; 0000 052B //    //rfSend_Byte(codeK2); // передача codeK2 кнопки2
; 0000 052C //    };
; 0000 052D //========= конец данных
; 0000 052E rfSend_Byte(0x00); // DUMMY BYTES
	RCALL SUBOPT_0x8
; 0000 052F //rfSend_Byte(0xAA); // DUMMY BYTES
; 0000 0530 FSK=0; //0-выкл.перед.регистр, вкл. приёмный регистр
; 0000 0531 HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
; 0000 0532 delay_ms(10);
	LDI  R26,LOW(10)
	RCALL SUBOPT_0x3
; 0000 0533 //===== передача окончена
; 0000 0534 //=== режем приёма ===========================
; 0000 0535     if (flag_rx==1) {           //восстанавливаем режим, который был до переключения
	SBRC R15,0
; 0000 0536     writeCmd(0x82D9); //вкл. приёмник RX
	RCALL SUBOPT_0x6
; 0000 0537     LED_OFF(6); //выкл. усилитель мощности и светодиод, вкл ант. усилитель
; 0000 0538     }
; 0000 0539 //#asm("sei")// глобально разрешить прерывания
; 0000 053A //GIMSK=0x80; //разрешить прерывания int1
; 0000 053B }
	ADIW R28,1
	POP  R15
	RET
; .FEND
;
;
;
;
;//========== МУСОР =============////////////////////////////////////////////////////////////////
;/*
;код для приёмника, режим передачи кнопки для RX
;ChkSum=0;
;writeCmd(0x0000);//читать регистр состояния перед каждым кадром
;LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
;rfSend_Byte(0xB8); // вкл. Передающий регистр
;rfSend_Byte(0xAA); // PREAMBLE SYNC byte
;rfSend_Byte(0xAA); // SYNC byte
;   //rfSend_Byte(0xAA); // SYNC byte для GPS не нужна
;//========= Шаблон действительных данных
;rfSend_Byte(0x2D); // SYNC HI byte
;rfSend_Byte(0xD4); // SYNC LOW byte
;//========= передача данных
;rfSend_Byte(b1);   //data byte1
;ChkSum+=b1;
;rfSend_Byte(b2);   //data byte2
;ChkSum+=b2;
;rfSend_Byte(b3);   //data byte3
;ChkSum+=b3;
;rfSend_Byte(b4);   //data byte4
;ChkSum+=b4;
;rfSend_Byte(b5);   //data byte5
;ChkSum+=b5;
;rfSend_Byte(b6);   //data byte6
;ChkSum+=b6;
;rfSend_Byte(b7);   //data byte7
;ChkSum+=b7;
;rfSend_Byte(b8);   //data byte8
;ChkSum+=b8;
;rfSend_Byte(ChkSum); //передача контрольной суммы
;//========= конец данных
;rfSend_Byte(0x00); // DUMMY BYTES хорошо
;   //rfSend_Byte(0xAA); // DUMMY BYTES плохо
;HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
;
;
;
;
;#asm("nop") // Пауза в 1 такт процессора
;=============================================
;void Check_JumperT1(void) //здесь будем проверять перемычку на разрешение запуска таймера
;{                         //проверку перемычки можно перенести в прерывание
; if((PIND.5==1)&&(flag_start_T1==0)){
; TCCR1B=0x0C; //start timer
; flag_start_T1=1; //больше не проверяем
; };
;}
;==============================================
;
;   if (flag_TX) {
;    LED_ON(6); //вкл. светодиод и усилитель мощности
;    writeCmd(0x8238); //вкл. передатчик TX
;             //flag_delay==1
;       while(flag_TX && PIND.5==1 || flag_delay==0 || flag5s_Timer==1) {
;
;        dataGPS = getchar_Tout();
;        writeCmd(0x0000);//читать регистр состояния перед каждым кадром
;        LO(nSEL);  // PORTB.4 SPI nSEL (chip select ENABLE)
;        rfSend_Byte(0xB8); // вкл. Передающий регистр
;        rfSend_Byte(0xAA); // PREAMBLE SYNC byte
;        rfSend_Byte(0xAA); // SYNC byte
;        //rfSend_Byte(0xAA); // SYNC byte для GPS не нужна
;        //========= Шаблон действительных данных
;        rfSend_Byte(0x2D); // SYNC HI byte
;        rfSend_Byte(0xD4); // SYNC LOW byte
;        //========= передача данных
;         rfSend_Byte(dataGPS);   // передача по радиоканалу
;        //rfSend_Byte(0x0D); //CR  (Carriage Return)
;        //rfSend_Byte(0x0A); //LF  (Line Feed)
;        //========= конец данных
;        //rfSend_Byte(ChkSum); // контрольная сумма
;        rfSend_Byte(0x00); // DUMMY BYTES хорошо
;        //rfSend_Byte(0xAA); // DUMMY BYTES плохо
;        HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE)
;        //===== передача окончена
;        //LED_OFF(6); //выкл. усилитель, светодиод
;        };
;    writeCmd(0x82D9); //вкл. приёмник RX
;    LED_OFF(6); //выкл. усилитель и светодиод
;    };
;
; ////////////////////////////////////////////////////////////
; if (flag_delay) //если задержка кончилась, формируем паузы
; {
;  //============= вариант 1 =====================================
;
;//    if (flag_5s && flag_stop2s==0) {  //2sec + 8сек пауза
;//        TickTimer2s++;
;//        flag_2s_10s=1;
;//      if (TickTimer2s == 3) { //2-передача 1сек, 3-передача 2сек
;//          flag_2s_10s=0;
;//          flag_stop2s=1;
;//          TickTimer2s = 0; //обнуляем через 2сек
;//      };
;//
;//    };
;//
;//    if (flag_5s==0) {
;//        flag_stop2s=0;
;//       //flag_2s=0;
;//    };
;  //============= вариант 2 =====================================
;    if (flag_5s && TickTimer2s < 3) {  //2: 2сек передача + 8сек пауза
;        TickTimer2s++;                 //3: 3сек передача + 7сек пауза
;        flag_2s_10s=1;  //3сек передача ("1"), 7сек приём ("0")
;    }
;      else  {
;        flag_2s_10s=0;
;        if (flag_5s==0) TickTimer2s=0;
;      };
; };
;
;
;*/
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x20
	.EQU __sm_mask=0x50
	.EQU __sm_powerdown=0x10
	.EQU __sm_standby=0x40
	.SET power_ctrl_reg=mcucr
	#endif

	.CSEG
_putchar:
; .FSTART _putchar
	ST   -Y,R26
putchar0:
     sbis usr,udre
     rjmp putchar0
     ld   r30,y
     out  udr,r30
_0x2060001:
	ADIW R28,1
	RET
; .FEND
_putsf:
; .FSTART _putsf
	ST   -Y,R27
	ST   -Y,R26
	ST   -Y,R17
_0x2000006:
	LDD  R30,Y+1
	LDD  R31,Y+1+1
	ADIW R30,1
	STD  Y+1,R30
	STD  Y+1+1,R31
	SBIW R30,1
	LPM  R30,Z
	MOV  R17,R30
	CPI  R30,0
	BREQ _0x2000008
	MOV  R26,R17
	RCALL _putchar
	RJMP _0x2000006
_0x2000008:
	LDI  R26,LOW(10)
	RCALL _putchar
	LDD  R17,Y+0
	ADIW R28,3
	RET
; .FEND

	.CSEG

	.CSEG

	.DSEG
_rx_buffer:
	.BYTE 0x8

	.CSEG
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x0:
	LDI  R30,LOW(31)
	OUT  0x2D,R30
	LDI  R30,LOW(0)
	OUT  0x2C,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:31 WORDS
SUBOPT_0x1:
	OUT  0xF,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	IN   R30,0xF
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 16 TIMES, CODE SIZE REDUCTION:43 WORDS
SUBOPT_0x2:
	LDI  R30,LOW(17)
	OUT  0xD,R30
	LDI  R30,LOW(19)
	OUT  0xD,R30
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x3:
	LDI  R27,0
	RJMP _delay_ms

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x4:
	ST   -Y,R30
	LDI  R26,LOW(500)
	LDI  R27,HIGH(500)
	RJMP _LED_Blink

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x5:
	SBI  0x12,6
	LDI  R26,LOW(33337)
	LDI  R27,HIGH(33337)
	RJMP _writeCmd

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x6:
	LDI  R26,LOW(33497)
	LDI  R27,HIGH(33497)
	RCALL _writeCmd
	CBI  0x12,6
	RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:10 WORDS
SUBOPT_0x7:
	SBI  0x18,2
	LDI  R26,LOW(0)
	LDI  R27,0
	RCALL _writeCmd
	CBI  0x18,4
	LDI  R26,LOW(184)
	RCALL _rfSend_Byte
	LDI  R26,LOW(170)
	RCALL _rfSend_Byte
	LDI  R26,LOW(45)
	RCALL _rfSend_Byte
	LDI  R26,LOW(214)
	RJMP _rfSend_Byte

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS
SUBOPT_0x8:
	LDI  R26,LOW(0)
	RCALL _rfSend_Byte
	CBI  0x18,2
	SBI  0x18,4
	RET


	.CSEG
_delay_ms:
	adiw r26,0
	breq __delay_ms1
__delay_ms0:
	__DELAY_USW 0xE66
	wdr
	sbiw r26,1
	brne __delay_ms0
__delay_ms1:
	ret

__SAVELOCR4:
	ST   -Y,R19
__SAVELOCR3:
	ST   -Y,R18
__SAVELOCR2:
	ST   -Y,R17
	ST   -Y,R16
	RET

__LOADLOCR4:
	LDD  R19,Y+3
__LOADLOCR3:
	LDD  R18,Y+2
__LOADLOCR2:
	LDD  R17,Y+1
	LD   R16,Y
	RET

;END OF CODE MARKER
__END_OF_CODE:
