AVRASM ver. 2.1.30 I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm Tue Feb 03 14:52:12 2015 I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(991): warning: Register r3 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(992): warning: Register r2 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(993): warning: Register r5 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(994): warning: Register r4 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(995): warning: Register r7 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(996): warning: Register r6 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(997): warning: Register r9 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(998): warning: Register r8 already defined by the .DEF directive I:\AVR-1\=My Project\GPS-2313A\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm(999): warning: Register r11 already defined by the .DEF directive ;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 000000 c061 RJMP __RESET 000001 cffe RJMP 0x00 000002 c0d9 RJMP _ext_int1_isr 000003 cffc RJMP 0x00 000004 cffb RJMP 0x00 000005 c091 RJMP _timer1_ovf_isr 000006 cff9 RJMP 0x00 000007 c0da RJMP _usart_rx_isr 000008 cff7 RJMP 0x00 000009 cff6 RJMP 0x00 00000a cff5 RJMP 0x00 00000b cff4 RJMP 0x00 00000c cff3 RJMP 0x00 00000d c083 RJMP _timer0_compa_isr 00000e cff1 RJMP 0x00 00000f cff0 RJMP 0x00 000010 cfef RJMP 0x00 000011 cfee RJMP 0x00 000012 cfed RJMP 0x00 000013 cfec RJMP 0x00 000014 cfeb RJMP 0x00 _tbl10_G100: 000015 2710 000016 03e8 000017 0064 000018 000a .DB 0x10,0x27,0xE8,0x3,0x64,0x0,0xA,0x0 000019 0001 .DB 0x1,0x0 _tbl16_G100: 00001a 1000 00001b 0100 00001c 0010 00001d 0001 .DB 0x0,0x10,0x0,0x1,0x10,0x0,0x1,0x0 ;GLOBAL REGISTER VARIABLES INITIALIZATION __REG_VARS: 00001e 0000 00001f 0000 .DB 0x0,0x0,0x0,0x0 _0x0: 000020 5024 000021 544d 000022 334b 000023 3431 .DB 0x24,0x50,0x4D,0x54,0x4B,0x33,0x31,0x34 000024 302c 000025 312c 000026 302c 000027 312c .DB 0x2C,0x30,0x2C,0x31,0x2C,0x30,0x2C,0x31 000028 312c 000029 352c 00002a 302c 00002b 302c .DB 0x2C,0x31,0x2C,0x35,0x2C,0x30,0x2C,0x30 00002c 302c 00002d 302c 00002e 302c 00002f 302c .DB 0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30 000030 302c 000031 302c 000032 302c 000033 302c .DB 0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2C,0x30 000034 302c 000035 302c 000036 302c 000037 322a .DB 0x2C,0x30,0x2C,0x30,0x2C,0x30,0x2A,0x32 000038 0d43 000039 000a 00003a 5024 00003b 544d .DB 0x43,0xD,0xA,0x0,0x24,0x50,0x4D,0x54 00003c 334b 00003d 3130 00003e 302c 00003f 322a .DB 0x4B,0x33,0x30,0x31,0x2C,0x30,0x2A,0x32 000040 0d43 000041 000a 000042 5024 000043 544d .DB 0x43,0xD,0xA,0x0,0x24,0x50,0x4D,0x54 000044 384b 000045 3936 000046 312c 000047 302c .DB 0x4B,0x38,0x36,0x39,0x2C,0x31,0x2C,0x30 000048 332a 000049 0d34 00004a 000a 00004b 5024 .DB 0x2A,0x33,0x34,0xD,0xA,0x0,0x24,0x50 00004c 544d 00004d 324b 00004e 3135 00004f 312c .DB 0x4D,0x54,0x4B,0x32,0x35,0x31,0x2C,0x31 000050 3434 000051 3030 000052 322a 000053 0d39 .DB 0x34,0x34,0x30,0x30,0x2A,0x32,0x39,0xD 000054 000a 000055 5024 000056 544d 000057 324b .DB 0xA,0x0,0x24,0x50,0x4D,0x54,0x4B,0x32 000058 3032 000059 352c 00005a 3030 00005b 322a .DB 0x32,0x30,0x2C,0x35,0x30,0x30,0x2A,0x32 00005c 0d42 00005d 000a .DB 0x42,0xD,0xA,0x0 __GLOBAL_INI_TBL: 00005e 0004 .DW 0x04 00005f 0008 .DW 0x08 000060 003c .DW __REG_VARS*2 _0xFFFFFFFF: 000061 0000 .DW 0 #define __GLOBAL_INI_TBL_PRESENT 1 __RESET: 000062 94f8 CLI 000063 27ee CLR R30 000064 bbec OUT EECR,R30 000065 bfe5 OUT MCUCR,R30 ;DISABLE WATCHDOG 000066 e1f8 LDI R31,0x18 000067 95a8 WDR 000068 b7a4 IN R26,MCUSR 000069 7fa7 CBR R26,8 00006a bfa4 OUT MCUSR,R26 00006b bdf1 OUT WDTCR,R31 00006c bde1 OUT WDTCR,R30 ;CLEAR R2-R14 00006d e08d LDI R24,(14-2)+1 00006e e0a2 LDI R26,2 __CLEAR_REG: 00006f 93ed ST X+,R30 000070 958a DEC R24 000071 f7e9 BRNE __CLEAR_REG ;CLEAR SRAM 000072 e880 LDI R24,__CLEAR_SRAM_SIZE 000073 e6a0 LDI R26,__SRAM_START __CLEAR_SRAM: 000074 93ed ST X+,R30 000075 958a DEC R24 000076 f7e9 BRNE __CLEAR_SRAM ;GLOBAL VARIABLES INITIALIZATION 000077 ebec LDI R30,LOW(__GLOBAL_INI_TBL*2) 000078 e0f0 LDI R31,HIGH(__GLOBAL_INI_TBL*2) __GLOBAL_INI_NEXT: 000079 9185 LPM R24,Z+ 00007a 9195 LPM R25,Z+ 00007b 9700 SBIW R24,0 00007c f061 BREQ __GLOBAL_INI_END 00007d 91a5 LPM R26,Z+ 00007e 91b5 LPM R27,Z+ 00007f 9005 LPM R0,Z+ 000080 9015 LPM R1,Z+ 000081 01bf MOVW R22,R30 000082 01f0 MOVW R30,R0 __GLOBAL_INI_LOOP: 000083 9005 LPM R0,Z+ 000084 920d ST X+,R0 000085 9701 SBIW R24,1 000086 f7e1 BRNE __GLOBAL_INI_LOOP 000087 01fb MOVW R30,R22 000088 cff0 RJMP __GLOBAL_INI_NEXT __GLOBAL_INI_END: ;GPIOR0-GPIOR2 INITIALIZATION 000089 e0e0 LDI R30,__GPIOR0_INIT 00008a bbe3 OUT GPIOR0,R30 ;__GPIOR1_INIT = __GPIOR0_INIT 00008b bbe4 OUT GPIOR1,R30 ;__GPIOR2_INIT = __GPIOR0_INIT 00008c bbe5 OUT GPIOR2,R30 ;HARDWARE STACK POINTER INITIALIZATION 00008d edef LDI R30,LOW(__SRAM_END-__HEAP_SIZE) 00008e bfed OUT SPL,R30 ;DATA STACK POINTER INITIALIZATION 00008f e8c0 LDI R28,LOW(__SRAM_START+__DSTACK_SIZE) 000090 c172 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 #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 ;#include ;#include ; ;//==== 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<> 8; //1.0sec, 0.25sec 00009b d235 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сек 00009c e0a0 LDI R26,0 00009d 9999 SBIC 0x13,1 00009e e0a1 LDI R26,1 00009f e0e1 LDI R30,LOW(1) 0000a0 27ea EOR R30,R26 0000a1 f411 BRNE _0x8 0000a2 9899 CBI 0x13,1 0000a3 c001 RJMP _0x9 _0x8: 0000a4 9a99 SBI 0x13,1 _0x9: ; 0000 00FC if (flag_rfSend_K) { //если данные кнопки отосланы, защита от повторов 0000a5 9b9f SBIS 0x13,7 0000a6 c003 RJMP _0xA ; 0000 00FD //тогда разрешаем int1 flag_KN1 && ; 0000 00FE flag_rfSend_K=0; 0000a7 989f CBI 0x13,7 ; 0000 00FF GIMSK=0x80; //разрешить прерывания int1, разрешение работы кнопки К1 0000a8 e8e0 LDI R30,LOW(128) 0000a9 bfeb OUT 0x3B,R30 ; 0000 0100 }; _0xA: ; 0000 0101 ; 0000 0102 PORTB.0=0; //выкл.выход B.0 через 1сек 0000aa 98c0 CBI 0x18,0 ; 0000 0103 //PORTD.4=0; //выкл. через 1сек ; 0000 0104 ; 0000 0105 if (PIND.4==1) { //если включен выход D.4 0000ab 9b84 SBIS 0x10,4 0000ac c006 RJMP _0xF ; 0000 0106 TickTimer1s++; 0000ad 9433 INC R3 ; 0000 0107 if (TickTimer1s == 5){ 0000ae e0e5 LDI R30,LOW(5) 0000af 15e3 CP R30,R3 0000b0 f411 BRNE _0x10 ; 0000 0108 PORTD.4=0; //выкл.выход D.4 через 5сек, независимо от перемычки 0000b1 9894 CBI 0x12,4 ; 0000 0109 TickTimer1s = 0; //обнуляем через 5сек 0000b2 2433 CLR R3 ; 0000 010A }; _0x10: ; 0000 010B }; _0xF: ; 0000 010C ; 0000 010D //PORTD.4^=1; //для теста, пикаем с периодом 1сек ; 0000 010E if (PIND.5==1) //перемычка "Контакт Подъёма", можно GPS вкл. в режим постоянной передачи. 0000b3 9b85 SBIS 0x10,5 0000b4 c016 RJMP _0x13 ; 0000 010F { ; 0000 0110 PORTD.4=0; //выкл.выход D.4 зв. излучатель, воспламенитель. 0000b5 9894 CBI 0x12,4 ; 0000 0111 TickTimer5s++; 0000b6 9423 INC R2 ; 0000 0112 if (TickTimer5s == 5) { //период 5сек 0000b7 e0e5 LDI R30,LOW(5) 0000b8 15e2 CP R30,R2 0000b9 f489 BRNE _0x16 ; 0000 0113 //flag5s_Timer^= 1; //переодическое переключение ; 0000 0114 flag_5s ^= 1; //флаг таймера 5сек 0000ba e0a0 LDI R26,0 0000bb 999a SBIC 0x13,2 0000bc e0a1 LDI R26,1 0000bd e0e1 LDI R30,LOW(1) 0000be 27ea EOR R30,R26 0000bf f411 BRNE _0x17 0000c0 989a CBI 0x13,2 0000c1 c001 RJMP _0x18 _0x17: 0000c2 9a9a 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сек 0000c3 2422 CLR R2 ; 0000 0119 if (TickTimer_delay<=T_delay) { //формирование задержки 120=10минут 0000c4 e0e1 LDI R30,LOW(1) 0000c5 15e7 CP R30,R7 0000c6 f020 BRLO _0x19 ; 0000 011A if (TickTimer_delay == T_delay) //максимальная задержка 254=21минут 0000c7 15e7 CP R30,R7 0000c8 f409 BRNE _0x1A ; 0000 011B flag_delay=1; 0000c9 9a9b SBI 0x13,3 ; 0000 011C TickTimer_delay++; //если TickTimer_delay=121 (T_delay=120), сюда больше не заходим _0x1A: 0000ca 9473 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 пачек, формируем паузы 0000cb 9b9b SBIS 0x13,3 0000cc c002 RJMP _0x1E 0000cd 999c SBIC 0x13,4 0000ce c001 RJMP _0x1F _0x1E: 0000cf c007 RJMP _0x1D _0x1F: ; 0000 0123 TickTimer10s++; 0000d0 9453 INC R5 ; 0000 0124 if (TickTimer10s==8) { //5=10+2(период 12сек); 4=8+2(период 10сек); 3=6+2(период 8сек) 0000d1 e0e8 LDI R30,LOW(8) 0000d2 15e5 CP R30,R5 0000d3 f419 BRNE _0x20 ; 0000 0125 flag_TickCounter_rfTX=0; 0000d4 989c CBI 0x13,4 ; 0000 0126 TickCounter_rfTX = 0; //обнуляем счётчик 0000d5 2444 CLR R4 ; 0000 0127 TickTimer10s = 0; //обнуляем через 10сек 0000d6 2455 CLR R5 ; 0000 0128 ; 0000 0129 }; _0x20: ; 0000 012A }; _0x1D: ; 0000 012B } 0000d7 91e9 LD R30,Y+ 0000d8 bfef OUT SREG,R30 0000d9 91e9 LD R30,Y+ 0000da 91a9 LD R26,Y+ 0000db 9518 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 0000dc 93ea ST -Y,R30 ; 0000 0139 // код кнопки 1 ; 0000 013A //rfSend_K(1); //посылаем по RF код кнопки 1 ; 0000 013B flag_KN1=1; //флаг срабатывания кнопки 1 0000dd 9a9e SBI 0x13,6 ; 0000 013C GIMSK=0x00; //запретить прерывания int1 0000de e0e0 LDI R30,LOW(0) 0000df bfeb OUT 0x3B,R30 ; 0000 013D //GIFR=0x00; //для запрета передачи данных кнопки1 ; 0000 013E } _0x99: 0000e0 91e9 LD R30,Y+ 0000e1 9518 RETI ; .FEND ; ;//работа UART с прерыванием Rx и буфером //******************************** ;#define DATA_REGISTER_EMPTY (1< R17 ; data -> R16 0000e6 b11b IN R17,11 ; 0000 0157 data=UDR; 0000e7 b10c IN R16,12 ; 0000 0158 if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) // Если нет ошибки при приеме байта 0000e8 2fe1 MOV R30,R17 0000e9 71ec ANDI R30,LOW(0x1C) 0000ea f471 BRNE _0x25 ; 0000 0159 { ; 0000 015A rx_buffer[rx_wr_index++]=data; //сохраняем байт в буфере 0000eb 2de9 MOV R30,R9 0000ec 9493 INC R9 0000ed 58e0 SUBI R30,-LOW(_rx_buffer) 0000ee 8300 ST Z,R16 ; 0000 015B ; 0000 015C if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; 0000ef e0e8 LDI R30,LOW(8) 0000f0 15e9 CP R30,R9 0000f1 f409 BRNE _0x26 0000f2 2499 CLR R9 ; 0000 015D if (++rx_counter == RX_BUFFER_SIZE) _0x26: 0000f3 94b3 INC R11 0000f4 e0e8 LDI R30,LOW(8) 0000f5 15eb CP R30,R11 0000f6 f411 BRNE _0x27 ; 0000 015E { ; 0000 015F rx_counter=0; 0000f7 24bb CLR R11 ; 0000 0160 rx_buffer_overflow=1; //флаг переполнения буфера 0000f8 9aa0 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)) {//если равно и таймер кончился, можно выходить отсюда ; 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: 0000f9 9109 LD R16,Y+ 0000fa 9119 LD R17,Y+ 0000fb 91e9 LD R30,Y+ 0000fc bfef OUT SREG,R30 0000fd 91e9 LD R30,Y+ 0000fe 9518 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(); //запуск таймера 0000ff 931a ST -Y,R17 ; data -> R17 000100 9a98 SBI 0x13,0 000101 e0e2 LDI R30,LOW(2) 000102 bfe0 OUT 0x30,R30 000103 e0e3 LDI R30,LOW(3) 000104 bfe3 OUT 0x33,R30 000105 e0e0 LDI R30,LOW(0) 000106 bfe2 OUT 0x32,R30 000107 eee5 LDI R30,LOW(229) 000108 bfe6 OUT 0x36,R30 000109 e0e5 LDI R30,LOW(5) 00010a bfe8 OUT 0x38,R30 ; 0000 0181 while ((rx_counter==0) && timeout_T0); _0x2A: 00010b 20bb TST R11 00010c f411 BRNE _0x2D 00010d 9998 SBIC 0x13,0 00010e c001 RJMP _0x2E _0x2D: 00010f c001 RJMP _0x2C _0x2E: 000110 cffa RJMP _0x2A _0x2C: ; 0000 0182 // if (rx_counter!=0) { //return; //&&(rx_counter!=0) ; 0000 0183 if (timeout_T0) { //если время ожидания истекло, уходим 000111 9b98 SBIS 0x13,0 000112 c00c RJMP _0x2F ; 0000 0184 //goto end_getchar_Tout; ; 0000 0185 data=rx_buffer[rx_rd_index++]; 000113 2de8 MOV R30,R8 000114 9483 INC R8 000115 58e0 SUBI R30,-LOW(_rx_buffer) 000116 8110 LD R17,Z ; 0000 0186 if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; 000117 e0e8 LDI R30,LOW(8) 000118 15e8 CP R30,R8 000119 f409 BRNE _0x30 00011a 2488 CLR R8 ; 0000 0187 #asm("cli") // глобально запретить прерывания _0x30: 00011b 94f8 cli ; 0000 0188 --rx_counter; 00011c 94ba DEC R11 ; 0000 0189 #asm("sei") // глобально разрешить прерывания 00011d 9478 sei ; 0000 018A return data; 00011e 2fe1 MOV R30,R17 ; 0000 018B }; _0x2F: ; 0000 018C //end_getchar_Tout: //выход по истечению времени ; 0000 018D } _0x2060004: 00011f 9119 LD R17,Y+ 000120 9508 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++) 000121 93ba ST -Y,R27 000122 93aa ST -Y,R26 000123 931a ST -Y,R17 ; blink -> Y+3 ; timeb -> Y+1 ; i -> R17 000124 e010 LDI R17,LOW(0) _0x32: 000125 81eb LDD R30,Y+3 000126 171e CP R17,R30 000127 f450 BRSH _0x33 ; 0000 019B { ; 0000 019C LED_ON(6); //вкл. светодиод PORTD.6 000128 9a96 SBI 0x12,6 ; 0000 019D delay_ms(timeb); 000129 81a9 LDD R26,Y+1 00012a 81ba LDD R27,Y+1+1 00012b d1f3 RCALL _delay_ms ; 0000 019E LED_OFF(6); //выкл. светодиод PORTD.6 00012c 9896 CBI 0x12,6 ; 0000 019F delay_ms(timeb); 00012d 81a9 LDD R26,Y+1 00012e 81ba LDD R27,Y+1+1 00012f d1ef RCALL _delay_ms ; 0000 01A0 } 000130 5f1f SUBI R17,-1 000131 cff3 RJMP _0x32 _0x33: ; 0000 01A1 } 000132 8118 LDD R17,Y+0 000133 c14a 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) 000134 93ba ST -Y,R27 000135 93aa ST -Y,R26 000136 d1f4 RCALL __SAVELOCR2 ; cmd -> Y+2 ; recv_16b -> R16,R17 + 000137 e000 +LDI R16 , LOW ( 0 ) 000138 e010 +LDI R17 , HIGH ( 0 ) __GETWRN 16,17,0 000139 98c4 CBI 0x18,4 ; 0000 01BC //USIDR = data_w;//передаваемые данные в сдвиговый регисть ; 0000 01BD USIDR =cmd>>8;//16bit->8bit старший разряд, передаваемые данные в сдвиговый регистр 00013a 81eb LDD R30,Y+3 00013b 70f0 ANDI R31,HIGH(0x0) 00013c d199 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 00013d 2ffe MOV R31,R30 00013e e0e0 LDI R30,0 00013f 018f MOVW R16,R30 ; 0000 01D0 USIDR = cmd&0x00FF;//оставляем младший 8бит разряд (вместо FF) 000140 81ea LDD R30,Y+2 000141 d194 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 000142 e0f0 LDI R31,0 + 000143 2b0e +OR R16 , R30 000144 2b1f +OR R17 , R31 __ORWRR 16,17,30,31 ; 0000 01E4 HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) 000145 9ac4 SBI 0x18,4 ; 0000 01E5 return recv_16b; //возврашаем 16bit полученные из USIDR 000146 01f8 MOVW R30,R16 000147 d1e8 RCALL __LOADLOCR2 000148 c135 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); //передающий регистр готов к приёму след. байта 000149 93aa ST -Y,R26 ; rf_byte -> Y+0 _0x38: 00014a 9982 SBIC 0x10,2 00014b cffe RJMP _0x38 ; 0000 01F0 USIDR = rf_byte;//8bit отправляем байт в сдвиговый регистр 00014c 81e8 LD R30,Y 00014d b9ef OUT 0xF,R30 ; 0000 01F1 USICR = 0b00010001;//и формируем тактирующие импульсы программно 00014e d1aa RCALL SUBOPT_0x2 ; 0000 01F2 USICR = 0b00010011; ; 0000 01F3 USICR = 0b00010001; 00014f d1a9 RCALL SUBOPT_0x2 ; 0000 01F4 USICR = 0b00010011; ; 0000 01F5 USICR = 0b00010001; 000150 d1a8 RCALL SUBOPT_0x2 ; 0000 01F6 USICR = 0b00010011; ; 0000 01F7 USICR = 0b00010001; 000151 d1a7 RCALL SUBOPT_0x2 ; 0000 01F8 USICR = 0b00010011; ; 0000 01F9 USICR = 0b00010001; 000152 d1a6 RCALL SUBOPT_0x2 ; 0000 01FA USICR = 0b00010011; ; 0000 01FB USICR = 0b00010001; 000153 d1a5 RCALL SUBOPT_0x2 ; 0000 01FC USICR = 0b00010011; ; 0000 01FD USICR = 0b00010001; 000154 d1a4 RCALL SUBOPT_0x2 ; 0000 01FE USICR = 0b00010011; ; 0000 01FF USICR = 0b00010001; 000155 d1a3 RCALL SUBOPT_0x2 ; 0000 0200 USICR = 0b00010011; ; 0000 0201 //HI(2); //выкл. тест светодиод PORTB.2 ; 0000 0202 //USISR |= (1<медленный, ручной-быстрый) 000168 eeac LDI R26,LOW(49900) 000169 ecb2 LDI R27,HIGH(49900) 00016a dfc9 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-буфера по шаблону синхронизации 00016b e8a3 LDI R26,LOW(51843) 00016c ecba LDI R27,HIGH(51843) 00016d dfc6 RCALL _writeCmd ; 0000 0240 //writeCmd(0xCAE3); ; 0000 0241 writeCmd(0xCED6); //SYNC=2DD4(D4 по умолчанию) синхробайт 00016e eda6 LDI R26,LOW(52950) 00016f ecbe LDI R27,HIGH(52950) 000170 dfc3 RCALL _writeCmd ; 0000 0242 //writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN ; 0000 0243 writeCmd(0xC49B); //@PWR,YES RSTRIC,st,!fi,OE,EN настройки АПЧ 000171 e9ab LDI R26,LOW(50331) 000172 ecb4 LDI R27,HIGH(50331) 000173 dfc0 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вых) 000174 e5a5 LDI R26,LOW(38997) 000175 e9b8 LDI R27,HIGH(38997) 000176 dfbd 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 регистр настройки ФАПЧ 000177 e7a7 LDI R26,LOW(52343) 000178 ecbc LDI R27,HIGH(52343) 000179 dfba RCALL _writeCmd ; 0000 024C writeCmd(0xE000); //NOT USED 00017a e0a0 LDI R26,LOW(57344) 00017b eeb0 LDI R27,HIGH(57344) 00017c dfb7 RCALL _writeCmd ; 0000 024D writeCmd(0xC800); //NOT USED 00017d e0a0 LDI R26,LOW(51200) 00017e ecb8 LDI R27,HIGH(51200) 00017f dfb4 RCALL _writeCmd ; 0000 024E writeCmd(0xC000); //1.0MHz,2.2V NOT USED 000180 e0a0 LDI R26,LOW(49152) 000181 ecb0 LDI R27,HIGH(49152) 000182 c0d3 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», ;//символы возврата каретки и перевода строки . ;//В качестве разделителя полей данных используется символ «,» ;//Контрольная сумма равна восьмибитному «исключающему ИЛИ» (HOR) всех ;//символов между символами «$» и «*» (не включая их). Передается в виде двух ;//шестнадцатеричных цифр (символов) старшей тетрадой вперед. ;//Максимальное общее количество символов в любом предложении 82; ;//максимум 79 символов между разделителем "$" и ;//The maximum total number of characters in any sentence is 82; ;//maximum of 79 characters between the starting delimiter "$" and the terminating . ;//====== СЕЙЧАС ВКЛЮЧЕН!!! ;//Меняем заводские установи 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 000183 92ff 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) //если флаг сброшен, выходим отсюда 000184 931a ST -Y,R17 ; flag_GPSinit -> R15.0 ; flag_setNMEA -> R15.1 ; i -> R17 000185 e0e1 LDI R30,LOW(1) 000186 2efe MOV R15,R30 000187 e010 LDI R17,0 _0x3B: 000188 fef0 SBRS R15,0 000189 c043 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(); 00018a 9723 SBIW R28,3 ; flag_GPSinit -> R15.0 ; flag_setNMEA -> R15.1 ; chk_S -> Y+2 ; chk_G -> Y+1 ; chk_P -> Y+0 00018b df73 RCALL _getchar_Tout 00018c 83ea STD Y+2,R30 ; 0000 0285 //putchar(chk_S);//тестовое сообщение для отладки ; 0000 0286 if(chk_S=='$') { 00018d 81aa LDD R26,Y+2 00018e 32a4 CPI R26,LOW(0x24) 00018f f4b1 BRNE _0x3E ; 0000 0287 chk_G = getchar_Tout(); 000190 df6e RCALL _getchar_Tout 000191 83e9 STD Y+1,R30 ; 0000 0288 chk_P = getchar_Tout(); 000192 df6c RCALL _getchar_Tout 000193 83e8 ST Y,R30 ; 0000 0289 if(chk_G=='G' && chk_P=='P') { 000194 81a9 LDD R26,Y+1 000195 34a7 CPI R26,LOW(0x47) 000196 f419 BRNE _0x40 000197 81a8 LD R26,Y 000198 35a0 CPI R26,LOW(0x50) 000199 f009 BREQ _0x41 _0x40: 00019a c00b RJMP _0x3F _0x41: ; 0000 028A //if ((PIND.5 == 0)&&(flag_setNMEA == 1)) { //опрос перемычки и флага ; 0000 028B if (flag_setNMEA == 1) { 00019b fcf1 SBRC R15,1 ; 0000 028C goto line_setNMEA; //установка новых параметров 00019c c00f RJMP _0x43 ; 0000 028D }; ; 0000 028E ; 0000 028F flag_GPSinit = 0; //GPS настроен правильно 00019d 94e8 CLT 00019e f8f0 BLD R15,0 ; 0000 0290 LED_Blink(3, 100);//мигаем 3 раза быстро 00019f e0e3 LDI R30,LOW(3) 0001a0 93ea ST -Y,R30 0001a1 e6a4 LDI R26,LOW(100) 0001a2 e0b0 LDI R27,0 0001a3 df7d RCALL _LED_Blink ; 0000 0291 //putsf("GOOD\r\n");//тестовое сообщение для отладки ; 0000 0292 break; 0001a4 9623 ADIW R28,3 0001a5 c027 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) { //кол-во циклов, для достоверного распознавания символов 0001a6 3512 CPI R17,82 0001a7 f511 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 0001a8 e5ef LDI R30,LOW(95) 0001a9 b9e9 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); 0001aa e6a4 LDI R26,LOW(100) 0001ab d152 RCALL SUBOPT_0x3 ; 0000 02AA line_setNMEA: _0x43: ; 0000 02AB #asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS 0001ac 94f8 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циклов) + 0001ad e4a0 +LDI R26 , LOW ( 2 * _0x0 + ( 0 ) ) 0001ae e0b0 +LDI R27 , HIGH ( 2 * _0x0 + ( 0 ) ) __POINTW2FN _0x0,0 0001af d10c RCALL _putsf ; 0000 02AE putsf("$PMTK301,0*2C\x0D\x0A"); //DGPS correction data source mode, disable. Для нас не нужен. + 0001b0 e7a4 +LDI R26 , LOW ( 2 * _0x0 + ( 52 ) ) 0001b1 e0b0 +LDI R27 , HIGH ( 2 * _0x0 + ( 52 ) ) __POINTW2FN _0x0,52 0001b2 d109 RCALL _putsf ; 0000 02AF putsf("$PMTK869,1,0*34\r\n"); //set EASY disable (для update-rate 2Гц и выше). + 0001b3 e8a4 +LDI R26 , LOW ( 2 * _0x0 + ( 68 ) ) 0001b4 e0b0 +LDI R27 , HIGH ( 2 * _0x0 + ( 68 ) ) __POINTW2FN _0x0,68 0001b5 d106 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 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 + 0001b6 e9a6 +LDI R26 , LOW ( 2 * _0x0 + ( 86 ) ) 0001b7 e0b0 +LDI R27 , HIGH ( 2 * _0x0 + ( 86 ) ) __POINTW2FN _0x0,86 0001b8 d103 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); 0001b9 e6a4 LDI R26,LOW(100) 0001ba d143 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 0001bb e3ef LDI R30,LOW(63) 0001bc b9e9 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% памяти 0001bd efa4 LDI R26,LOW(500) 0001be e0b1 LDI R27,HIGH(500) 0001bf d15f 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 + 0001c0 eaaa +LDI R26 , LOW ( 2 * _0x0 + ( 106 ) ) 0001c1 e0b0 +LDI R27 , HIGH ( 2 * _0x0 + ( 106 ) ) __POINTW2FN _0x0,106 0001c2 d0f9 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 раз 0001c3 e0e1 LDI R30,LOW(1) 0001c4 d13b RCALL SUBOPT_0x4 ; 0000 02CD //HI(2); //вЫкл. тест светодиод PORTB.2 ; 0000 02CE flag_setNMEA=0; 0001c5 94e8 CLT 0001c6 f8f1 BLD R15,1 ; 0000 02CF i=0;//сброс счётчика 0001c7 e010 LDI R17,LOW(0) ; 0000 02D0 #asm("sei")// глобально разрешить прерывания 0001c8 9478 sei ; 0000 02D1 //break; ; 0000 02D2 //return; ; 0000 02D3 } ; 0000 02D4 else { 0001c9 c001 RJMP _0x45 _0x44: ; 0000 02D5 i++; //счётчик 0001ca 5f1f SUBI R17,-1 ; 0000 02D6 }; _0x45: ; 0000 02D7 ; 0000 02D8 ; 0000 02D9 //}; ; 0000 02DA }; 0001cb 9623 ADIW R28,3 0001cc cfbb RJMP _0x3B _0x3D: ; 0000 02DB ; 0000 02DC //#asm("sei")// глобально разрешить прерывания ; 0000 02DD //LED_Blink(4, 1000);//мигаем 3 раза через 1сек. ; 0000 02DE } //конец инициализации GPS ============================================// 0001cd 9119 LD R17,Y+ 0001ce 90ff POP R15 0001cf 9508 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; 0001d0 e8e0 LDI R30,LOW(128) 0001d1 bde6 OUT 0x26,R30 ; 0000 02E8 CLKPR=0x00; 0001d2 e0e0 LDI R30,LOW(0) 0001d3 bde6 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; 0001d4 e0e4 LDI R30,LOW(4) 0001d5 bbeb OUT 0x1B,R30 ; 0000 02F2 DDRA=0x00; 0001d6 e0e0 LDI R30,LOW(0) 0001d7 bbea 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< ; 0000 03EB // if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета ; 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)) //если приняли последний символ пакета ; 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) //если приняли последний символ пакета ; 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)) //если приняли последний символ пакета ; 0000 0400 // { //и таймер кончился, выходим отсюда ; 0000 0401 // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 0402 // break; ; 0000 0403 // }; ; 0000 0404 ; 0000 0405 //if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно и таймер кончился, можно выходить отсюда ; 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) наверно нужен 000210 9b9b SBIS 0x13,3 000211 c002 RJMP _0x51 000212 9b9c SBIS 0x13,4 000213 c001 RJMP _0x52 _0x51: 000214 c005 RJMP _0x50 _0x52: ; 0000 0417 TickCounter_rfTX++; 000215 9443 INC R4 ; 0000 0418 if (TickCounter_rfTX == 6) { //6 если передано 5 пачек (6или7) 000216 e0e6 LDI R30,LOW(6) 000217 15e4 CP R30,R4 000218 f409 BRNE _0x53 ; 0000 0419 //PORTB.0 ^=1; //для теста светодиод ; 0000 041A flag_TickCounter_rfTX=1; 000219 9a9c 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< 000293 e0ea LDI R30,LOW(10) 000294 15e6 CP R30,R6 000295 f409 BRNE _0x8B ; 0000 04CE flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" 000296 989d CBI 0x13,5 ; 0000 04CF }; _0x8B: ; 0000 04D0 ; 0000 04D1 //end_rfSend_GPS: //точка выхода ; 0000 04D2 } 000297 9508 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 000298 92ff 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) { 000299 93aa ST -Y,R26 ; kb -> Y+0 ; flag_rx -> R15.0 00029a 9986 SBIC 0x10,6 00029b c003 RJMP _0x8E ; 0000 050B flag_rx=1; //запоминаем, какой был режим до переключения 00029c 9468 SET 00029d f8f0 BLD R15,0 ; 0000 050C LED_ON(6); //вкл. светодиод и усилитель мощности (PIND.6==1) 00029e d065 RCALL SUBOPT_0x5 ; 0000 050D //FSK=1; //1-вкл. перед. регистр ; 0000 050E writeCmd(0x8239); //вкл. передатчик TX ; 0000 050F }; _0x8E: ; 0000 0510 FSK=1; //1-вкл. перед. регистр 00029f d06d 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); // передача символа кнопки 0002a0 e6ab LDI R26,LOW(107) 0002a1 dea7 RCALL _rfSend_Byte ; 0000 051C if (kb==1) { 0002a2 81a8 LD R26,Y 0002a3 30a1 CPI R26,LOW(0x1) 0002a4 f441 BRNE _0x93 ; 0000 051D rfSend_Byte(k1b1); // передача byte1 кнопки1 0002a5 e3a1 LDI R26,LOW(49) 0002a6 dea2 RCALL _rfSend_Byte ; 0000 051E rfSend_Byte(k1b2); // передача byte2 0002a7 e3a2 LDI R26,LOW(50) 0002a8 dea0 RCALL _rfSend_Byte ; 0000 051F rfSend_Byte(k1b3); // передача byte3 0002a9 e3a3 LDI R26,LOW(51) 0002aa de9e RCALL _rfSend_Byte ; 0000 0520 rfSend_Byte(k1b4); // передача byte4 0002ab e3a6 LDI R26,LOW(54) 0002ac de9c 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 0002ad d06c 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); 0002ae e0aa LDI R26,LOW(10) 0002af d04e RCALL SUBOPT_0x3 ; 0000 0533 //===== передача окончена ; 0000 0534 //=== режем приёма =========================== ; 0000 0535 if (flag_rx==1) { //восстанавливаем режим, который был до переключения 0002b0 fcf0 SBRC R15,0 ; 0000 0536 writeCmd(0x82D9); //вкл. приёмник RX 0002b1 d056 RCALL SUBOPT_0x6 ; 0000 0537 LED_OFF(6); //выкл. усилитель мощности и светодиод, вкл ант. усилитель ; 0000 0538 } ; 0000 0539 //#asm("sei")// глобально разрешить прерывания ; 0000 053A //GIMSK=0x80; //разрешить прерывания int1 ; 0000 053B } 0002b2 9621 ADIW R28,1 0002b3 90ff POP R15 0002b4 9508 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__ #endif .CSEG _putchar: ; .FSTART _putchar 0002b5 93aa ST -Y,R26 putchar0: 0002b6 9b5d sbis usr,udre 0002b7 cffe rjmp putchar0 0002b8 81e8 ld r30,y 0002b9 b9ec out udr,r30 _0x2060001: 0002ba 9621 ADIW R28,1 0002bb 9508 RET ; .FEND _putsf: ; .FSTART _putsf 0002bc 93ba ST -Y,R27 0002bd 93aa ST -Y,R26 0002be 931a ST -Y,R17 _0x2000006: 0002bf 81e9 LDD R30,Y+1 0002c0 81fa LDD R31,Y+1+1 0002c1 9631 ADIW R30,1 0002c2 83e9 STD Y+1,R30 0002c3 83fa STD Y+1+1,R31 0002c4 9731 SBIW R30,1 0002c5 91e4 LPM R30,Z 0002c6 2f1e MOV R17,R30 0002c7 30e0 CPI R30,0 0002c8 f019 BREQ _0x2000008 0002c9 2fa1 MOV R26,R17 0002ca dfea RCALL _putchar 0002cb cff3 RJMP _0x2000006 _0x2000008: 0002cc e0aa LDI R26,LOW(10) 0002cd dfe7 RCALL _putchar 0002ce 8118 LDD R17,Y+0 0002cf 9623 ADIW R28,3 0002d0 9508 RET ; .FEND .CSEG .CSEG .DSEG _rx_buffer: 000080 .BYTE 0x8 .CSEG ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x0: 0002d1 e1ef LDI R30,LOW(31) 0002d2 bded OUT 0x2D,R30 0002d3 e0e0 LDI R30,LOW(0) 0002d4 bdec OUT 0x2C,R30 0002d5 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:31 WORDS SUBOPT_0x1: 0002d6 b9ef OUT 0xF,R30 0002d7 e1e1 LDI R30,LOW(17) 0002d8 b9ed OUT 0xD,R30 0002d9 e1e3 LDI R30,LOW(19) 0002da b9ed OUT 0xD,R30 0002db e1e1 LDI R30,LOW(17) 0002dc b9ed OUT 0xD,R30 0002dd e1e3 LDI R30,LOW(19) 0002de b9ed OUT 0xD,R30 0002df e1e1 LDI R30,LOW(17) 0002e0 b9ed OUT 0xD,R30 0002e1 e1e3 LDI R30,LOW(19) 0002e2 b9ed OUT 0xD,R30 0002e3 e1e1 LDI R30,LOW(17) 0002e4 b9ed OUT 0xD,R30 0002e5 e1e3 LDI R30,LOW(19) 0002e6 b9ed OUT 0xD,R30 0002e7 e1e1 LDI R30,LOW(17) 0002e8 b9ed OUT 0xD,R30 0002e9 e1e3 LDI R30,LOW(19) 0002ea b9ed OUT 0xD,R30 0002eb e1e1 LDI R30,LOW(17) 0002ec b9ed OUT 0xD,R30 0002ed e1e3 LDI R30,LOW(19) 0002ee b9ed OUT 0xD,R30 0002ef e1e1 LDI R30,LOW(17) 0002f0 b9ed OUT 0xD,R30 0002f1 e1e3 LDI R30,LOW(19) 0002f2 b9ed OUT 0xD,R30 0002f3 e1e1 LDI R30,LOW(17) 0002f4 b9ed OUT 0xD,R30 0002f5 e1e3 LDI R30,LOW(19) 0002f6 b9ed OUT 0xD,R30 0002f7 b1ef IN R30,0xF 0002f8 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 16 TIMES, CODE SIZE REDUCTION:43 WORDS SUBOPT_0x2: 0002f9 e1e1 LDI R30,LOW(17) 0002fa b9ed OUT 0xD,R30 0002fb e1e3 LDI R30,LOW(19) 0002fc b9ed OUT 0xD,R30 0002fd 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x3: 0002fe e0b0 LDI R27,0 0002ff c01f RJMP _delay_ms ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x4: 000300 93ea ST -Y,R30 000301 efa4 LDI R26,LOW(500) 000302 e0b1 LDI R27,HIGH(500) 000303 ce1d RJMP _LED_Blink ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x5: 000304 9a96 SBI 0x12,6 000305 e3a9 LDI R26,LOW(33337) 000306 e8b2 LDI R27,HIGH(33337) 000307 ce2c RJMP _writeCmd ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x6: 000308 eda9 LDI R26,LOW(33497) 000309 e8b2 LDI R27,HIGH(33497) 00030a de29 RCALL _writeCmd 00030b 9896 CBI 0x12,6 00030c 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:10 WORDS SUBOPT_0x7: 00030d 9ac2 SBI 0x18,2 00030e e0a0 LDI R26,LOW(0) 00030f e0b0 LDI R27,0 000310 de23 RCALL _writeCmd 000311 98c4 CBI 0x18,4 000312 eba8 LDI R26,LOW(184) 000313 de35 RCALL _rfSend_Byte 000314 eaaa LDI R26,LOW(170) 000315 de33 RCALL _rfSend_Byte 000316 e2ad LDI R26,LOW(45) 000317 de31 RCALL _rfSend_Byte 000318 eda6 LDI R26,LOW(214) 000319 ce2f RJMP _rfSend_Byte ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x8: 00031a e0a0 LDI R26,LOW(0) 00031b de2d RCALL _rfSend_Byte 00031c 98c2 CBI 0x18,2 00031d 9ac4 SBI 0x18,4 00031e 9508 RET .CSEG _delay_ms: 00031f 9610 adiw r26,0 000320 f039 breq __delay_ms1 __delay_ms0: + 000321 e686 +LDI R24 , LOW ( 0xE66 ) 000322 e09e +LDI R25 , HIGH ( 0xE66 ) +__DELAY_USW_LOOP : 000323 9701 +SBIW R24 , 1 000324 f7f1 +BRNE __DELAY_USW_LOOP __DELAY_USW 0xE66 000325 95a8 wdr 000326 9711 sbiw r26,1 000327 f7c9 brne __delay_ms0 __delay_ms1: 000328 9508 ret __SAVELOCR4: 000329 933a ST -Y,R19 __SAVELOCR3: 00032a 932a ST -Y,R18 __SAVELOCR2: 00032b 931a ST -Y,R17 00032c 930a ST -Y,R16 00032d 9508 RET __LOADLOCR4: 00032e 813b LDD R19,Y+3 __LOADLOCR3: 00032f 812a LDD R18,Y+2 __LOADLOCR2: 000330 8119 LDD R17,Y+1 000331 8108 LD R16,Y 000332 9508 RET ;END OF CODE MARKER __END_OF_CODE: RESOURCE USE INFORMATION ------------------------ Notice: The register and instruction counts are symbol table hit counts, and hence implicitly used resources are not counted, eg, the 'lpm' instruction without operands implicitly uses r0 and z, none of which are counted. x,y,z are separate entities in the symbol table and are counted separately from r26..r31 here. .dseg memory usage only counts static data declared with .byte ATtiny2313A register use summary: r0 : 4 r1 : 1 r2 : 3 r3 : 3 r4 : 3 r5 : 3 r6 : 5 r7 : 3 r8 : 4 r9 : 4 r10: 0 r11: 6 r12: 0 r13: 0 r14: 0 r15: 11 r16: 12 r17: 29 r18: 5 r19: 5 r20: 0 r21: 0 r22: 2 r23: 0 r24: 9 r25: 2 r26: 77 r27: 34 r28: 8 r29: 0 r30: 224 r31: 9 x : 3 y : 62 z : 10 Registers used: 27 out of 35 (77.1%) ATtiny2313A instruction use summary: .lds : 0 .lds.l: 0 .sts : 0 .sts.l: 0 adc : 0 add : 0 adiw : 8 and : 0 andi : 2 asr : 0 bclr : 0 bld : 3 brbc : 0 brbs : 0 brcc : 0 brcs : 0 break : 0 breq : 8 brge : 0 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 0 brmi : 0 brne : 30 brpl : 0 brsh : 1 brtc : 0 brts : 0 brvc : 0 brvs : 0 bset : 0 bst : 0 cbi : 19 cbr : 1 clc : 0 clh : 0 cli : 4 cln : 0 clr : 8 cls : 0 clt : 2 clv : 0 clz : 0 com : 0 cp : 13 cpc : 0 cpi : 15 cpse : 0 dec : 3 des : 0 eor : 2 fmul : 0 fmuls : 0 fmulsu: 0 icall : 0 ijmp : 0 in : 7 inc : 8 ld : 16 ldd : 16 ldi : 167 lds : 0 lpm : 9 lsl : 0 lsr : 0 mov : 14 movw : 5 mul : 0 muls : 0 mulsu : 0 neg : 0 nop : 0 or : 2 ori : 0 out : 78 pop : 2 push : 2 rcall : 94 ret : 19 reti : 3 rjmp : 80 rol : 0 ror : 0 sbc : 0 sbci : 0 sbi : 19 sbic : 11 sbis : 14 sbiw : 6 sbr : 0 sbrc : 2 sbrs : 1 sec : 0 seh : 0 sei : 4 sen : 0 ser : 0 ses : 0 set : 1 sev : 0 sez : 0 sleep : 0 spm : 0 st : 31 std : 4 sts : 0 sub : 0 subi : 4 swap : 0 tst : 2 wdr : 2 Instructions used: 45 out of 114 (39.5%) ATtiny2313A memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x000666 1484 154 1638 2048 80.0% [.dseg] 0x000060 0x000088 0 8 8 128 6.3% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% Assembly complete, 0 errors, 9 warnings