AVRASM ver. 2.1.30 I:\AVR-1\=My Project\GPS-2313A\GPS-2313A_EEPROM\GPS-2313A-Tx_14400\List\RFM12B-2313A-Tx.asm Tue Feb 03 17:52:51 2015 I:\AVR-1\=My Project\GPS-2313A\GPS-2313A_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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_EEPROM\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 ;03.02.2015 ;EEPROM usage: 0 byte(s), 0,0% of EEPROM ;Program size: 819 words (1638 bytes), 80,0% of FLASH ;90 words (180 bytes), 9,9% reduced by Code Compression ;*****************************************************/ ; ;#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 d257 RCALL SUBOPT_0x0 ; 0000 00FF TCNT1L=0x1F00 & 0xff;//1.0sec, 0.25sec ; 0000 0100 //============================= ; 0000 0101 //TCNT1H=0x3580 >> 8; //0.9sec ; 0000 0102 //TCNT1L=0x3580 & 0xff; ; 0000 0103 //============================= ; 0000 0104 //TCNT1H=0xA600 >> 8; //0.1sec ; 0000 0105 //TCNT1L=0xA600 & 0xff;//0.1sec ; 0000 0106 //============================= ; 0000 0107 //секундный таймер ; 0000 0108 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 0109 if (flag_rfSend_K) { //если данные кнопки отосланы, защита от повторов 0000a5 9b9f SBIS 0x13,7 0000a6 c003 RJMP _0xA ; 0000 010A //тогда разрешаем int1 flag_KN1 && ; 0000 010B flag_rfSend_K=0; 0000a7 989f CBI 0x13,7 ; 0000 010C GIMSK=0x80; //разрешить прерывания int1, разрешение работы кнопки К1 0000a8 e8e0 LDI R30,LOW(128) 0000a9 bfeb OUT 0x3B,R30 ; 0000 010D }; _0xA: ; 0000 010E ; 0000 010F PORTB.0=0; //выкл.выход B.0 через 1сек 0000aa 98c0 CBI 0x18,0 ; 0000 0110 //PORTD.4=0; //выкл. через 1сек ; 0000 0111 ; 0000 0112 if (PIND.4==1) { //если включен выход D.4 0000ab 9b84 SBIS 0x10,4 0000ac c006 RJMP _0xF ; 0000 0113 TickTimer1s++; 0000ad 9433 INC R3 ; 0000 0114 if (TickTimer1s == 5){ 0000ae e0e5 LDI R30,LOW(5) 0000af 15e3 CP R30,R3 0000b0 f411 BRNE _0x10 ; 0000 0115 PORTD.4=0; //выкл.выход D.4 через 5сек, независимо от перемычки 0000b1 9894 CBI 0x12,4 ; 0000 0116 TickTimer1s = 0; //обнуляем через 5сек 0000b2 2433 CLR R3 ; 0000 0117 }; _0x10: ; 0000 0118 }; _0xF: ; 0000 0119 ; 0000 011A //PORTD.4^=1; //для теста, пикаем с периодом 1сек ; 0000 011B if (PIND.5==1) //перемычка "Контакт Подъёма", можно GPS вкл. в режим постоянной передачи. 0000b3 9b85 SBIS 0x10,5 0000b4 c016 RJMP _0x13 ; 0000 011C { ; 0000 011D PORTD.4=0; //выкл.выход D.4 зв. излучатель, воспламенитель. 0000b5 9894 CBI 0x12,4 ; 0000 011E TickTimer5s++; 0000b6 9423 INC R2 ; 0000 011F if (TickTimer5s == 5) { //период 5сек 0000b7 e0e5 LDI R30,LOW(5) 0000b8 15e2 CP R30,R2 0000b9 f489 BRNE _0x16 ; 0000 0120 //flag5s_Timer^= 1; //переодическое переключение ; 0000 0121 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 0122 //PORTD.4=0; //выкл.выход D.4 на зв. излучатель и воспламенитель ; 0000 0123 //PORTD.4^=1; //пикаем с периодом 5сек ; 0000 0124 //PORTB.0=0; //выкл.выход B.0 при размыкании перемычки, через 5сек ; 0000 0125 TickTimer5s = 0; //обнуляем через 5сек 0000c3 2422 CLR R2 ; 0000 0126 if (TickTimer_delay<=T_delay) { //формирование задержки 120=10минут 0000c4 e0e1 LDI R30,LOW(1) 0000c5 15e7 CP R30,R7 0000c6 f020 BRLO _0x19 ; 0000 0127 if (TickTimer_delay == T_delay) //максимальная задержка 254=21минут 0000c7 15e7 CP R30,R7 0000c8 f409 BRNE _0x1A ; 0000 0128 flag_delay=1; 0000c9 9a9b SBI 0x13,3 ; 0000 0129 TickTimer_delay++; //если TickTimer_delay=121 (T_delay=120), сюда больше не заходим _0x1A: 0000ca 9473 INC R7 ; 0000 012A }; _0x19: ; 0000 012B }; _0x16: ; 0000 012C }; _0x13: ; 0000 012D ; 0000 012E //формирование 8-10сек пауз TX //в одной пачке от 3 до 7 пакетов ; 0000 012F 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 0130 TickTimer10s++; 0000d0 9453 INC R5 ; 0000 0131 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 0132 flag_TickCounter_rfTX=0; 0000d4 989c CBI 0x13,4 ; 0000 0133 TickCounter_rfTX = 0; //обнуляем счётчик 0000d5 2444 CLR R4 ; 0000 0134 TickTimer10s = 0; //обнуляем через 10сек 0000d6 2455 CLR R5 ; 0000 0135 ; 0000 0136 }; _0x20: ; 0000 0137 }; _0x1D: ; 0000 0138 } 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 0145 { _ext_int1_isr: ; .FSTART _ext_int1_isr 0000dc 93ea ST -Y,R30 ; 0000 0146 // код кнопки 1 ; 0000 0147 //rfSend_K(1); //посылаем по RF код кнопки 1 ; 0000 0148 flag_KN1=1; //флаг срабатывания кнопки 1 0000dd 9a9e SBI 0x13,6 ; 0000 0149 GIMSK=0x00; //запретить прерывания int1 0000de e0e0 LDI R30,LOW(0) 0000df bfeb OUT 0x3B,R30 ; 0000 014A //GIFR=0x00; //для запрета передачи данных кнопки1 ; 0000 014B } _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 0164 data=UDR; 0000e7 b10c IN R16,12 ; 0000 0165 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 0166 { ; 0000 0167 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 0168 ; 0000 0169 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 016A 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 016B { ; 0000 016C rx_counter=0; 0000f7 24bb CLR R11 ; 0000 016D rx_buffer_overflow=1; //флаг переполнения буфера 0000f8 9aa0 SBI 0x14,0 ; 0000 016E } ; 0000 016F } _0x27: ; 0000 0170 //status=0; ; 0000 0171 ; 0000 0172 /* ; 0000 0173 if (flag_init==1) { ; 0000 0174 LED_ON(6); //вкл. светодиод и усилитель мощности ; 0000 0175 writeCmd(0x8239); //вкл. передатчик TX ; 0000 0176 FSK=0; //выкл. перед. регистр (0-вкл. приёмного региста) ; 0000 0177 while (PIND.5==0) { ; 0000 0178 rfSend_GPS(); //flag_1s==0 передача, flag_1s==1 приём ; 0000 0179 if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно и таймер кончился, можно выходить отсюда ; 0000 017A //if (dataGPS==0x0A) { ; 0000 017B flag_GPS=0; ; 0000 017C break; ; 0000 017D }; ; 0000 017E }; ; 0000 017F //rfSend_GPS(); ; 0000 0180 }; */ ; 0000 0181 } _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 0189 { _getchar_Tout: ; .FSTART _getchar_Tout ; 0000 018A char data; ; 0000 018B //while (rx_counter==0); ; 0000 018C //ждём когда вбуфере появятся данные и время ожидания не истекло ; 0000 018D 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 018E 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 018F // if (rx_counter!=0) { //return; //&&(rx_counter!=0) ; 0000 0190 if (timeout_T0) { //если время ожидания истекло, уходим 000111 9b98 SBIS 0x13,0 000112 c00c RJMP _0x2F ; 0000 0191 //goto end_getchar_Tout; ; 0000 0192 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 0193 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 0194 #asm("cli") // глобально запретить прерывания _0x30: 00011b 94f8 cli ; 0000 0195 --rx_counter; 00011c 94ba DEC R11 ; 0000 0196 #asm("sei") // глобально разрешить прерывания 00011d 9478 sei ; 0000 0197 return data; 00011e 2fe1 MOV R30,R17 ; 0000 0198 }; _0x2F: ; 0000 0199 //end_getchar_Tout: //выход по истечению времени ; 0000 019A } _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 01A5 { _LED_Blink: ; .FSTART _LED_Blink ; 0000 01A6 char i; ; 0000 01A7 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 01A8 { ; 0000 01A9 LED_ON(6); //вкл. светодиод PORTD.6 000128 9a96 SBI 0x12,6 ; 0000 01AA delay_ms(timeb); 000129 81a9 LDD R26,Y+1 00012a 81ba LDD R27,Y+1+1 00012b d218 RCALL _delay_ms ; 0000 01AB LED_OFF(6); //выкл. светодиод PORTD.6 00012c 9896 CBI 0x12,6 ; 0000 01AC delay_ms(timeb); 00012d 81a9 LDD R26,Y+1 00012e 81ba LDD R27,Y+1+1 00012f d214 RCALL _delay_ms ; 0000 01AD } 000130 5f1f SUBI R17,-1 000131 cff3 RJMP _0x32 _0x33: ; 0000 01AE } 000132 8118 LDD R17,Y+0 000133 c167 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 01C6 { _writeCmd: ; .FSTART _writeCmd ; 0000 01C7 unsigned int recv_16b=0; //16bit полученные из USIDR ; 0000 01C8 LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) 000134 93ba ST -Y,R27 000135 93aa ST -Y,R26 000136 d224 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 01C9 //USIDR = data_w;//передаваемые данные в сдвиговый регисть ; 0000 01CA USIDR =cmd>>8;//16bit->8bit старший разряд, передаваемые данные в сдвиговый регистр 00013a 81eb LDD R30,Y+3 00013b 70f0 ANDI R31,HIGH(0x0) 00013c d1bb RCALL SUBOPT_0x1 ; 0000 01CB USICR = 0b00010001;//и формируем тактирующие импульсы программно ; 0000 01CC USICR = 0b00010011; ; 0000 01CD USICR = 0b00010001; ; 0000 01CE USICR = 0b00010011; ; 0000 01CF USICR = 0b00010001; ; 0000 01D0 USICR = 0b00010011; ; 0000 01D1 USICR = 0b00010001; ; 0000 01D2 USICR = 0b00010011; ; 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 ; 0000 01DC recv_16b = USIDR<<8; //сохраняем старший байт из USIDR 00013d 2ffe MOV R31,R30 00013e e0e0 LDI R30,0 00013f 018f MOVW R16,R30 ; 0000 01DD USIDR = cmd&0x00FF;//оставляем младший 8бит разряд (вместо FF) 000140 81ea LDD R30,Y+2 000141 d1b6 RCALL SUBOPT_0x1 ; 0000 01DE //USIDR =cmd<<8;//16bit->8bit младший разряд, передаваемые данные в сдвиговый регистр ; 0000 01DF ; 0000 01E0 USICR = 0b00010001;//и формируем тактирующие импульсы программно ; 0000 01E1 USICR = 0b00010011; ; 0000 01E2 USICR = 0b00010001; ; 0000 01E3 USICR = 0b00010011; ; 0000 01E4 USICR = 0b00010001; ; 0000 01E5 USICR = 0b00010011; ; 0000 01E6 USICR = 0b00010001; ; 0000 01E7 USICR = 0b00010011; ; 0000 01E8 USICR = 0b00010001; ; 0000 01E9 USICR = 0b00010011; ; 0000 01EA USICR = 0b00010001; ; 0000 01EB USICR = 0b00010011; ; 0000 01EC USICR = 0b00010001; ; 0000 01ED USICR = 0b00010011; ; 0000 01EE USICR = 0b00010001; ; 0000 01EF USICR = 0b00010011; ; 0000 01F0 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 01F1 HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) 000145 9ac4 SBI 0x18,4 ; 0000 01F2 return recv_16b; //возврашаем 16bit полученные из USIDR 000146 01f8 MOVW R30,R16 000147 d218 RCALL __LOADLOCR2 000148 c152 RJMP _0x2060002 ; 0000 01F3 } ; .FEND ; ;//********************************************** ;//8bit функция передачи по USI 7,1МГц 0,14мкс и RF ;//3,46мкс 19тактов или 2,31Мбит/сек ;void rfSend_Byte(unsigned char rf_byte) //Передача байта по SPI с опросом освобождения прд. регистра RF ; 0000 01F9 { _rfSend_Byte: ; .FSTART _rfSend_Byte ; 0000 01FA //LO(2); //вкл. тест светодиод PORTB.2 ; 0000 01FB //wait for previously TX over PIND.2=0 ; 0000 01FC while(nIRQ_LOW); //передающий регистр готов к приёму след. байта 000149 93aa ST -Y,R26 ; rf_byte -> Y+0 _0x38: 00014a 9982 SBIC 0x10,2 00014b cffe RJMP _0x38 ; 0000 01FD USIDR = rf_byte;//8bit отправляем байт в сдвиговый регистр 00014c 81e8 LD R30,Y 00014d b9ef OUT 0xF,R30 ; 0000 01FE USICR = 0b00010001;//и формируем тактирующие импульсы программно 00014e d1cc RCALL SUBOPT_0x2 ; 0000 01FF USICR = 0b00010011; ; 0000 0200 USICR = 0b00010001; 00014f d1cb RCALL SUBOPT_0x2 ; 0000 0201 USICR = 0b00010011; ; 0000 0202 USICR = 0b00010001; 000150 d1ca RCALL SUBOPT_0x2 ; 0000 0203 USICR = 0b00010011; ; 0000 0204 USICR = 0b00010001; 000151 d1c9 RCALL SUBOPT_0x2 ; 0000 0205 USICR = 0b00010011; ; 0000 0206 USICR = 0b00010001; 000152 d1c8 RCALL SUBOPT_0x2 ; 0000 0207 USICR = 0b00010011; ; 0000 0208 USICR = 0b00010001; 000153 d1c7 RCALL SUBOPT_0x2 ; 0000 0209 USICR = 0b00010011; ; 0000 020A USICR = 0b00010001; 000154 d1c6 RCALL SUBOPT_0x2 ; 0000 020B USICR = 0b00010011; ; 0000 020C USICR = 0b00010001; 000155 d1c5 RCALL SUBOPT_0x2 ; 0000 020D USICR = 0b00010011; ; 0000 020E //HI(2); //выкл. тест светодиод PORTB.2 ; 0000 020F //USISR |= (1<медленный, ручной-быстрый) 000168 eeac LDI R26,LOW(49900) 000169 ecb2 LDI R27,HIGH(49900) 00016a dfc9 RCALL _writeCmd ; 0000 0249 //writeCmd(0xC2AC); //AL,!ml,DIG,DQD4(авт.режим быстрый->медленный)этот лучше ; 0000 024A //writeCmd(0xC26C); //!AL,ml,DIG,DQD4(ручной, быстрый) ; 0000 024B //writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR 81-заполнение FIFO-буфера не по шаблону синхронизации ; 0000 024C 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 024D //writeCmd(0xCAE3); ; 0000 024E writeCmd(0xCED6); //SYNC=2DD4(D4 по умолчанию) синхробайт 00016e eda6 LDI R26,LOW(52950) 00016f ecbe LDI R27,HIGH(52950) 000170 dfc3 RCALL _writeCmd ; 0000 024F //writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN ; 0000 0250 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 0251 //=== настройка модуляции и выходной мощности === !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; 0000 0252 //writeCmd(0x9850); //!mp,90kHz(57.6kbps),MAX Pout (полярность,полоса модуляции; Pвых) ; 0000 0253 //writeCmd(0x9852); //!mp,90kHz(57.6kbps),-6дБ Pout (полярность,полоса модуляции; Pвых)!!! ; 0000 0254 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 0255 //writeCmd(0x9857); //!mp,90kHz(57.6kbps),-21дБ OUT (полярность,полоса модуляции; Pвых) ; 0000 0256 //writeCmd(0x9870); //!mp,120kHz(115,2kbps),MAX OUT (120kHz зависит от скорости передачи) ; 0000 0257 //=============================================== ; 0000 0258 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 0259 writeCmd(0xE000); //NOT USED 00017a e0a0 LDI R26,LOW(57344) 00017b eeb0 LDI R27,HIGH(57344) 00017c dfb7 RCALL _writeCmd ; 0000 025A writeCmd(0xC800); //NOT USED 00017d e0a0 LDI R26,LOW(51200) 00017e ecb8 LDI R27,HIGH(51200) 00017f dfb4 RCALL _writeCmd ; 0000 025B 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 025C ; 0000 025D //====================================================== ; 0000 025E //LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ; 0000 025F //HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; 0000 0260 //writeCmd(0x8219); //включен только кварцевый генератор ; 0000 0261 //writeCmd(0x8218); //включен синтезатор, кварцевый генератор ; 0000 0262 //writeCmd(0x8259); //вкл демодулятора ; 0000 0263 //writeCmd(0x8221); // et-вкл. всего тракта передатчика,dc ; 0000 0264 //writeCmd(0x8281); // et-вкл. всего тракта приёмника,dc ; 0000 0265 } ; .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 0283 { _init_GPS: ; .FSTART _init_GPS 000183 92ff PUSH R15 ; 0000 0284 bit flag_GPSinit = 1; //флаг инициализации GPS, если не нужна инициализация ставим 0 ; 0000 0285 bit flag_setNMEA = 0; //Для теста, флаг разрешения изменения параметров GPS после проверки,0-запрет. ; 0000 0286 unsigned char i = 0; ; 0000 0287 ; 0000 0288 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 0289 { ; 0000 028A unsigned char chk_S, chk_G, chk_P; ; 0000 028B //char string_chk[]; ; 0000 028C //string_chk[]= "$GP"; ; 0000 028D //=========== restore!!! ======================= ; 0000 028E //putsf("$PMTK104*37\r\n"); //restore GPS default setting!!! ; 0000 028F //Set restore the GPS system default factory setting ; 0000 0290 //#asm("sei")// глобально разрешить прерывания ; 0000 0291 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 0292 //putchar(chk_S);//тестовое сообщение для отладки ; 0000 0293 if(chk_S=='$') { 00018d 81aa LDD R26,Y+2 00018e 32a4 CPI R26,LOW(0x24) 00018f f4b1 BRNE _0x3E ; 0000 0294 chk_G = getchar_Tout(); 000190 df6e RCALL _getchar_Tout 000191 83e9 STD Y+1,R30 ; 0000 0295 chk_P = getchar_Tout(); 000192 df6c RCALL _getchar_Tout 000193 83e8 ST Y,R30 ; 0000 0296 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 0297 //if ((PIND.5 == 0)&&(flag_setNMEA == 1)) { //опрос перемычки и флага ; 0000 0298 if (flag_setNMEA == 1) { 00019b fcf1 SBRC R15,1 ; 0000 0299 goto line_setNMEA; //установка новых параметров 00019c c00f RJMP _0x43 ; 0000 029A }; ; 0000 029B ; 0000 029C flag_GPSinit = 0; //GPS настроен правильно 00019d 94e8 CLT 00019e f8f0 BLD R15,0 ; 0000 029D 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 029E //putsf("GOOD\r\n");//тестовое сообщение для отладки ; 0000 029F break; 0001a4 9623 ADIW R28,3 0001a5 c027 RJMP _0x3D ; 0000 02A0 }; _0x3F: ; 0000 02A1 //LED_Blink(3, 200);//мигаем 3 раза быстро для отладки ; 0000 02A2 }; _0x3E: ; 0000 02A3 // else { ; 0000 02A4 //LO(2); //вкл. тест светодиод PORTB.2 ; 0000 02A5 //putsf("ERROR\r\n"); //тестовое сообщение, для отладки ; 0000 02A6 if(i==82) { //кол-во циклов, для достоверного распознавания символов 0001a6 3512 CPI R17,82 0001a7 f511 BRNE _0x44 ; 0000 02A7 //кол-во символов в кадре NMEA = $+79+CR+LF =82 ; 0000 02A8 //инициализация GPS ; 0000 02A9 //ВНИМАНИЕ! Для установки нового Baud Rate в программе, скорость GPS должна быть 9,6kbps ; 0000 02AA //для этого отключить батарейку или сделать программный сброс GPS ; 0000 02AB //#asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS ; 0000 02AC UBRRL=0x5F; //USART Baud Rate: 9600 если у GPS начальная скорость 9,6kbps 0001a8 e5ef LDI R30,LOW(95) 0001a9 b9e9 OUT 0x9,R30 ; 0000 02AD //UBRRL=0x3F; //63 USART Baud Rate: 14400bps ; 0000 02AE //UBRRL=0x2F; //47 USART Baud Rate: 19200bps ; 0000 02AF //UBRRL=0x17; //23 USART Baud Rate: 38400bps ; 0000 02B0 //UBRRL=0x0F; //15 USART Baud Rate: 57600bps и 14,745600 MHz ; 0000 02B1 //=========== restore!!! ======================= ; 0000 02B2 //putsf("$PMTK104*37\r\n"); //restore GPS default setting!!! ; 0000 02B3 //Set restore the GPS system default factory setting ; 0000 02B4 //заводские настройки 9600, 1Гц, заполнение 53,7% VTG(1)-GSA(1)-RMC(1)-GGA(1)-GSV(5) ; 0000 02B5 ; 0000 02B6 delay_ms(100); 0001aa e6a4 LDI R26,LOW(100) 0001ab d174 RCALL SUBOPT_0x3 ; 0000 02B7 line_setNMEA: _0x43: ; 0000 02B8 #asm("cli") // глобально запретить прерывания, во время установки параметров модуля GPS 0001ac 94f8 cli ; 0000 02B9 //=========== set NMEA out ====================== ; 0000 02BA 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 d12e RCALL _putsf ; 0000 02BB 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 d12b RCALL _putsf ; 0000 02BC 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 d128 RCALL _putsf ; 0000 02BD ; 0000 02BE //=========!!! GPS Baudrate setting должен соответствовать UART !!!========= ; 0000 02BF //Baudrate setting : 9600,14400,19200,38400,57600,115200 ; 0000 02C0 // $PMTK251,38400*27 Change the baud rate 38400 bps ; 0000 02C1 //putsf("$PMTK251,9600*17\x0D\x0A"); //Set GPS baud rate 9600bps ; 0000 02C2 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 d125 RCALL _putsf ; 0000 02C3 //putsf("$PMTK251,19200*22\x0D\x0A"); //Set GPS baud rate 19200bps ; 0000 02C4 //putsf("$PMTK251,38400*27\x0D\x0A"); //Set GPS baud rate 38400bps ; 0000 02C5 //putsf("$PMTK251,57600*2C\x0D\x0A"); //Set GPS baud rate 57600bps ; 0000 02C6 //putsf("$PMTK251,115200*1F\x0D\x0A"); //Set GPS baud rate 115200bps ; 0000 02C7 delay_ms(100); 0001b9 e6a4 LDI R26,LOW(100) 0001ba d165 RCALL SUBOPT_0x3 ; 0000 02C8 ; 0000 02C9 //========= USART Baud Rate должен соответствовать GPS!!!=================== ; 0000 02CA //BAUDRATE; //USART Baud Rate задаём в define ; 0000 02CB //UBRRL=0x5F; //USART Baud Rate: 9600 ; 0000 02CC UBRRL=0x3F; //USART Baud Rate: 14400bps 0001bb e3ef LDI R30,LOW(63) 0001bc b9e9 OUT 0x9,R30 ; 0000 02CD //UBRRL=0x2F; //23 для Baud Rate: 19200bps ; 0000 02CE //UBRRL=0x17; //23 для Baud Rate: 38400bps ; 0000 02CF //UBRRL=0x0F; //USART Baud Rate: 57600bps ; 0000 02D0 delay_ms(500);//занимает 1,3% памяти 0001bd efa4 LDI R26,LOW(500) 0001be e0b1 LDI R27,HIGH(500) 0001bf d184 RCALL _delay_ms ; 0000 02D1 ; 0000 02D2 //========= GPS Update Rate ======================== ; 0000 02D3 // putsf("$PMTK220,1000*1F\r\n"); //Set Update Rate-1Hz ; 0000 02D4 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 d11b RCALL _putsf ; 0000 02D5 //putsf("$PMTK220,250*29\r\n"); //Set Update Rate-4Hz ; 0000 02D6 //putsf("$PMTK220,200*2C\r\n"); //Set Update Rate-5Hz ; 0000 02D7 //putsf("$PMTK220,100*2F\r\n"); //Set Update Rate-10Hz ; 0000 02D8 ; 0000 02D9 LED_Blink(1, 500);//мигаем 1 раз 0001c3 e0e1 LDI R30,LOW(1) 0001c4 d15d RCALL SUBOPT_0x4 ; 0000 02DA //HI(2); //вЫкл. тест светодиод PORTB.2 ; 0000 02DB flag_setNMEA=0; 0001c5 94e8 CLT 0001c6 f8f1 BLD R15,1 ; 0000 02DC i=0;//сброс счётчика 0001c7 e010 LDI R17,LOW(0) ; 0000 02DD #asm("sei")// глобально разрешить прерывания 0001c8 9478 sei ; 0000 02DE //break; ; 0000 02DF //return; ; 0000 02E0 } ; 0000 02E1 else { 0001c9 c001 RJMP _0x45 _0x44: ; 0000 02E2 i++; //счётчик 0001ca 5f1f SUBI R17,-1 ; 0000 02E3 }; _0x45: ; 0000 02E4 ; 0000 02E5 ; 0000 02E6 //}; ; 0000 02E7 }; 0001cb 9623 ADIW R28,3 0001cc cfbb RJMP _0x3B _0x3D: ; 0000 02E8 ; 0000 02E9 //#asm("sei")// глобально разрешить прерывания ; 0000 02EA //LED_Blink(4, 1000);//мигаем 3 раза через 1сек. ; 0000 02EB } //конец инициализации GPS ============================================// 0001cd 9119 LD R17,Y+ 0001ce 90ff POP R15 0001cf 9508 RET ; .FEND ;//********// ;//GPS ВКЛЮЧЕН!!!******************************// ; ;//===================== перенос железа из main в init_ATtiny2313 ==============================// ;void init_ATtiny(void) ; 0000 02F1 { _init_ATtiny: ; .FSTART _init_ATtiny ; 0000 02F2 // Crystal Oscillator division factor: 1 ; 0000 02F3 #pragma optsize- ; 0000 02F4 CLKPR=0x80; 0001d0 e8e0 LDI R30,LOW(128) 0001d1 bde6 OUT 0x26,R30 ; 0000 02F5 CLKPR=0x00; 0001d2 e0e0 LDI R30,LOW(0) 0001d3 bde6 OUT 0x26,R30 ; 0000 02F6 #ifdef _OPTIMIZE_SIZE_ ; 0000 02F7 #pragma optsize+ ; 0000 02F8 #endif ; 0000 02F9 ; 0000 02FA // Input/Output Ports initialization ; 0000 02FB // Port A initialization ; 0000 02FC // Func2=In Func1=In Func0=In ; 0000 02FD // State2=P State1=T State0=T ; 0000 02FE PORTA=0x04; 0001d4 e0e4 LDI R30,LOW(4) 0001d5 bbeb OUT 0x1B,R30 ; 0000 02FF DDRA=0x00; 0001d6 e0e0 LDI R30,LOW(0) 0001d7 bbea OUT 0x1A,R30 ; 0000 0300 ; 0000 0301 // Port B initialization ; 0000 0302 // Function: Bit7=Out Bit6=Out Bit5=In Bit4=Out Bit3=In Bit2=Out Bit1=In Bit0=Out ; 0000 0303 //DDRB=(1< ; 0000 03F8 // if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета ; 0000 03F9 // { //и таймер кончился, выходим отсюда (для подстраховки) ; 0000 03FA // //flag_GPS=0; //перенесено в rfSend_GPS для анализа начала нового пакета с символа "$", ; 0000 03FB // break; //здесь теряет первый символ начала пакета ; 0000 03FC // }; ; 0000 03FD ; 0000 03FE ; 0000 03FF // if ((dataGPS==0x0A)&&(timeout_T0==0)) //если приняли последний символ пакета ; 0000 0400 // { //и таймер кончился, выходим отсюда ; 0000 0401 // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 0402 // //break; ; 0000 0403 // }; ; 0000 0404 ; 0000 0405 //if (!timeout_T0) break; //если время ожидания данных закончилось, выходим из цикла ; 0000 0406 // if ((dataGPS==0x0A)&& flag_delay) //если приняли последний символ пакета ; 0000 0407 // { //и таймер кончился, выходим отсюда ; 0000 0408 // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 0409 // break; ; 0000 040A // }; ; 0000 040B ; 0000 040C // if ((dataGPS==0x0A)&&((flag_2s_10s==0)&& flag_delay)) //если приняли последний символ пакета ; 0000 040D // { //и таймер кончился, выходим отсюда ; 0000 040E // flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" ; 0000 040F // break; ; 0000 0410 // }; ; 0000 0411 ; 0000 0412 //if ((dataGPS==0x0A)&&(flag_1s==1)) {//если равно и таймер кончился, можно выходить отсюда ; 0000 0413 //PORTD.4^=1; //пикаем для теста ; 0000 0414 //FIFOReset(); //Disable,Enable FIFO, сброс буфера ; 0000 0415 // delay_ms(350); ; 0000 0416 ***************************************************/ ; 0000 0417 ; 0000 0418 /*********** ; 0000 0419 //режим полёта, TX постоянно =================================================================== ; 0000 041A while (PIND.5==1 && flag_delay==0) { ; 0000 041B rfSend_GPS(); //крутимся здесь, пока не закончится время задержки (10мин) ; 0000 041C }; ; 0000 041D ************/ ; 0000 041E ; 0000 041F //=== режем приёма между пакетами GPS, и режим передачи раз в 10(7)сек ============================ ; 0000 0420 //ожидание RX UART и режим приёма RF RX flag_TickCounter_rfTX=1; ; 0000 0421 //выполняем цикл, если буфер RX UART пустой или таймер истёк ; 0000 0422 ; 0000 0423 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 0424 TickCounter_rfTX++; 000215 9443 INC R4 ; 0000 0425 if (TickCounter_rfTX == 6) { //6 если передано 5 пачек (6или7) 000216 e0e6 LDI R30,LOW(6) 000217 15e4 CP R30,R4 000218 f409 BRNE _0x53 ; 0000 0426 //PORTB.0 ^=1; //для теста светодиод ; 0000 0427 flag_TickCounter_rfTX=1; 000219 9a9c SBI 0x13,4 ; 0000 0428 //TickTimer10s = 0; ; 0000 0429 //TickCounter_rfTX = 0; //обнуляем счётчик в прерывании таймера T1 ; 0000 042A }; _0x53: ; 0000 042B }; _0x50: ; 0000 042C //ждем приема байта while( ( UCSRA & ( 1 << RXC ) ) == 0 ); ; 0000 042D //UCSRA UDRE bit5 Data Register Empty (1< 0002b0 e0ea LDI R30,LOW(10) 0002b1 15e6 CP R30,R6 0002b2 f409 BRNE _0x8B ; 0000 04D9 flag_GPS=0; //в rfSend_GPS для анализа начала нового пакета с символа "$" 0002b3 989d CBI 0x13,5 ; 0000 04DA }; _0x8B: ; 0000 04DB ; 0000 04DC //end_rfSend_GPS: //точка выхода ; 0000 04DD } 0002b4 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 050E { _rfSend_K: ; .FSTART _rfSend_K 0002b5 92ff PUSH R15 ; 0000 050F bit flag_rx; ; 0000 0510 //char K1, K2; ; 0000 0511 //#asm("cli") // глобально запретить прерывания ; 0000 0512 //GIMSK=0x00; //запретить прерывания int1 ; 0000 0513 ; 0000 0514 //если был включен режим приёма(PIND.6=0), переключаемся на передачу ; 0000 0515 if (PIND.6==0) { 0002b6 93aa ST -Y,R26 ; kb -> Y+0 ; flag_rx -> R15.0 0002b7 9986 SBIC 0x10,6 0002b8 c003 RJMP _0x8E ; 0000 0516 flag_rx=1; //запоминаем, какой был режим до переключения 0002b9 9468 SET 0002ba f8f0 BLD R15,0 ; 0000 0517 LED_ON(6); //вкл. светодиод и усилитель мощности (PIND.6==1) 0002bb d06a RCALL SUBOPT_0x5 ; 0000 0518 //FSK=1; //1-вкл. перед. регистр ; 0000 0519 writeCmd(0x8239); //вкл. передатчик TX ; 0000 051A }; _0x8E: ; 0000 051B FSK=1; //1-вкл. перед. регистр 0002bc d072 RCALL SUBOPT_0x7 ; 0000 051C writeCmd(0x0000);//читать(сбрасывать) регистр состояния перед каждым кадром ; 0000 051D LO(nSEL); // PORTB.4 SPI nSEL (chip select ENABLE) ; 0000 051E ; 0000 051F rfSend_Byte(0xB8); // вкл. Передающий регистр ; 0000 0520 rfSend_Byte(0xAA); // PREAMBLE SYNC byte, рекомендованная длина 8бит-12бит ; 0000 0521 //rfSend_Byte(0xAA); // SYNC byte, необязателен ; 0000 0522 //========= Шаблон действительных данных ; 0000 0523 rfSend_Byte(0x2D); // SYNC HI byte ; 0000 0524 rfSend_Byte(0xD6); // SYNC LOW byte, (D4) программируется ; 0000 0525 //========= передача данных ; 0000 0526 rfSend_Byte(knb); // передача символа кнопки 0002bd e0a0 LDI R26,LOW(_knb) 0002be e0b0 LDI R27,HIGH(_knb) 0002bf d081 RCALL SUBOPT_0x9 ; 0000 0527 if (kb==1) { 0002c0 81a8 LD R26,Y 0002c1 30a1 CPI R26,LOW(0x1) 0002c2 f461 BRNE _0x93 ; 0000 0528 rfSend_Byte(k1b1); // передача byte1 кнопки1 0002c3 e0a1 LDI R26,LOW(_k1b1) 0002c4 e0b0 LDI R27,HIGH(_k1b1) 0002c5 d07b RCALL SUBOPT_0x9 ; 0000 0529 rfSend_Byte(k1b2); // передача byte2 0002c6 e0a2 LDI R26,LOW(_k1b2) 0002c7 e0b0 LDI R27,HIGH(_k1b2) 0002c8 d078 RCALL SUBOPT_0x9 ; 0000 052A rfSend_Byte(k1b3); // передача byte3 0002c9 e0a3 LDI R26,LOW(_k1b3) 0002ca e0b0 LDI R27,HIGH(_k1b3) 0002cb d075 RCALL SUBOPT_0x9 ; 0000 052B rfSend_Byte(k1b4); // передача byte4 0002cc e0a4 LDI R26,LOW(_k1b4) 0002cd e0b0 LDI R27,HIGH(_k1b4) 0002ce d072 RCALL SUBOPT_0x9 ; 0000 052C //rfSend_Byte(k1b5); // передача byte5 ; 0000 052D //rfSend_Byte(codeK1); // передача codeK1 кнопки1 ; 0000 052E }; _0x93: ; 0000 052F ; 0000 0530 // if (kb==2) { ; 0000 0531 // rfSend_Byte(k2b1); // передача byte1 кнопки2 ; 0000 0532 // rfSend_Byte(k2b2); // передача byte2 ; 0000 0533 // rfSend_Byte(k2b3); // передача byte3 ; 0000 0534 // rfSend_Byte(k2b4); // передача byte4 ; 0000 0535 // //rfSend_Byte(k2b5); // передача byte5 ; 0000 0536 // //rfSend_Byte(codeK2); // передача codeK2 кнопки2 ; 0000 0537 // }; ; 0000 0538 //========= конец данных ; 0000 0539 rfSend_Byte(0x00); // DUMMY BYTES 0002cf d06c RCALL SUBOPT_0x8 ; 0000 053A //rfSend_Byte(0xAA); // DUMMY BYTES ; 0000 053B FSK=0; //0-выкл.перед.регистр, вкл. приёмный регистр ; 0000 053C HI(nSEL); //PORTB.4 SPI nSEL (chip select DISALBE) ; 0000 053D delay_ms(10); 0002d0 e0aa LDI R26,LOW(10) 0002d1 d04e RCALL SUBOPT_0x3 ; 0000 053E //===== передача окончена ; 0000 053F //=== режем приёма =========================== ; 0000 0540 if (flag_rx==1) { //восстанавливаем режим, который был до переключения 0002d2 fcf0 SBRC R15,0 ; 0000 0541 writeCmd(0x82D9); //вкл. приёмник RX 0002d3 d056 RCALL SUBOPT_0x6 ; 0000 0542 LED_OFF(6); //выкл. усилитель мощности и светодиод, вкл ант. усилитель ; 0000 0543 } ; 0000 0544 //#asm("sei")// глобально разрешить прерывания ; 0000 0545 //GIMSK=0x80; //разрешить прерывания int1 ; 0000 0546 } 0002d4 9621 ADIW R28,1 0002d5 90ff POP R15 0002d6 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 0002d7 93aa ST -Y,R26 putchar0: 0002d8 9b5d sbis usr,udre 0002d9 cffe rjmp putchar0 0002da 81e8 ld r30,y 0002db b9ec out udr,r30 _0x2060001: 0002dc 9621 ADIW R28,1 0002dd 9508 RET ; .FEND _putsf: ; .FSTART _putsf 0002de 93ba ST -Y,R27 0002df 93aa ST -Y,R26 0002e0 931a ST -Y,R17 _0x2000006: 0002e1 81e9 LDD R30,Y+1 0002e2 81fa LDD R31,Y+1+1 0002e3 9631 ADIW R30,1 0002e4 83e9 STD Y+1,R30 0002e5 83fa STD Y+1+1,R31 0002e6 9731 SBIW R30,1 0002e7 91e4 LPM R30,Z 0002e8 2f1e MOV R17,R30 0002e9 30e0 CPI R30,0 0002ea f019 BREQ _0x2000008 0002eb 2fa1 MOV R26,R17 0002ec dfea RCALL _putchar 0002ed cff3 RJMP _0x2000006 _0x2000008: 0002ee e0aa LDI R26,LOW(10) 0002ef dfe7 RCALL _putchar 0002f0 8118 LDD R17,Y+0 0002f1 9623 ADIW R28,3 0002f2 9508 RET ; .FEND .CSEG .CSEG .ESEG _knb: 000000 .BYTE 0x1 _k1b1: 000001 .BYTE 0x1 _k1b2: 000002 .BYTE 0x1 _k1b3: 000003 .BYTE 0x1 _k1b4: 000004 .BYTE 0x1 _k2b1: 000005 .BYTE 0x1 _k2b2: 000006 .BYTE 0x1 _k2b3: 000007 .BYTE 0x1 _k2b4: 000008 .BYTE 0x1 .DSEG _rx_buffer: 000080 .BYTE 0x8 .CSEG ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x0: 0002f3 e1ef LDI R30,LOW(31) 0002f4 bded OUT 0x2D,R30 0002f5 e0e0 LDI R30,LOW(0) 0002f6 bdec OUT 0x2C,R30 0002f7 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:31 WORDS SUBOPT_0x1: 0002f8 b9ef OUT 0xF,R30 0002f9 e1e1 LDI R30,LOW(17) 0002fa b9ed OUT 0xD,R30 0002fb e1e3 LDI R30,LOW(19) 0002fc b9ed OUT 0xD,R30 0002fd e1e1 LDI R30,LOW(17) 0002fe b9ed OUT 0xD,R30 0002ff e1e3 LDI R30,LOW(19) 000300 b9ed OUT 0xD,R30 000301 e1e1 LDI R30,LOW(17) 000302 b9ed OUT 0xD,R30 000303 e1e3 LDI R30,LOW(19) 000304 b9ed OUT 0xD,R30 000305 e1e1 LDI R30,LOW(17) 000306 b9ed OUT 0xD,R30 000307 e1e3 LDI R30,LOW(19) 000308 b9ed OUT 0xD,R30 000309 e1e1 LDI R30,LOW(17) 00030a b9ed OUT 0xD,R30 00030b e1e3 LDI R30,LOW(19) 00030c b9ed OUT 0xD,R30 00030d e1e1 LDI R30,LOW(17) 00030e b9ed OUT 0xD,R30 00030f e1e3 LDI R30,LOW(19) 000310 b9ed OUT 0xD,R30 000311 e1e1 LDI R30,LOW(17) 000312 b9ed OUT 0xD,R30 000313 e1e3 LDI R30,LOW(19) 000314 b9ed OUT 0xD,R30 000315 e1e1 LDI R30,LOW(17) 000316 b9ed OUT 0xD,R30 000317 e1e3 LDI R30,LOW(19) 000318 b9ed OUT 0xD,R30 000319 b1ef IN R30,0xF 00031a 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 16 TIMES, CODE SIZE REDUCTION:43 WORDS SUBOPT_0x2: 00031b e1e1 LDI R30,LOW(17) 00031c b9ed OUT 0xD,R30 00031d e1e3 LDI R30,LOW(19) 00031e b9ed OUT 0xD,R30 00031f 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 4 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x3: 000320 e0b0 LDI R27,0 000321 c022 RJMP _delay_ms ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x4: 000322 93ea ST -Y,R30 000323 efa4 LDI R26,LOW(500) 000324 e0b1 LDI R27,HIGH(500) 000325 cdfb RJMP _LED_Blink ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x5: 000326 9a96 SBI 0x12,6 000327 e3a9 LDI R26,LOW(33337) 000328 e8b2 LDI R27,HIGH(33337) 000329 ce0a RJMP _writeCmd ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x6: 00032a eda9 LDI R26,LOW(33497) 00032b e8b2 LDI R27,HIGH(33497) 00032c de07 RCALL _writeCmd 00032d 9896 CBI 0x12,6 00032e 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:10 WORDS SUBOPT_0x7: 00032f 9ac2 SBI 0x18,2 000330 e0a0 LDI R26,LOW(0) 000331 e0b0 LDI R27,0 000332 de01 RCALL _writeCmd 000333 98c4 CBI 0x18,4 000334 eba8 LDI R26,LOW(184) 000335 de13 RCALL _rfSend_Byte 000336 eaaa LDI R26,LOW(170) 000337 de11 RCALL _rfSend_Byte 000338 e2ad LDI R26,LOW(45) 000339 de0f RCALL _rfSend_Byte 00033a eda6 LDI R26,LOW(214) 00033b ce0d RJMP _rfSend_Byte ;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:1 WORDS SUBOPT_0x8: 00033c e0a0 LDI R26,LOW(0) 00033d de0b RCALL _rfSend_Byte 00033e 98c2 CBI 0x18,2 00033f 9ac4 SBI 0x18,4 000340 9508 RET ;OPTIMIZER ADDED SUBROUTINE, CALLED 5 TIMES, CODE SIZE REDUCTION:6 WORDS SUBOPT_0x9: 000341 d00c RCALL __EEPROMRDB 000342 2fae MOV R26,R30 000343 ce05 RJMP _rfSend_Byte .CSEG _delay_ms: 000344 9610 adiw r26,0 000345 f039 breq __delay_ms1 __delay_ms0: + 000346 e686 +LDI R24 , LOW ( 0xE66 ) 000347 e09e +LDI R25 , HIGH ( 0xE66 ) +__DELAY_USW_LOOP : 000348 9701 +SBIW R24 , 1 000349 f7f1 +BRNE __DELAY_USW_LOOP __DELAY_USW 0xE66 00034a 95a8 wdr 00034b 9711 sbiw r26,1 00034c f7c9 brne __delay_ms0 __delay_ms1: 00034d 9508 ret __EEPROMRDB: 00034e 99e1 SBIC EECR,EEWE 00034f cffe RJMP __EEPROMRDB 000350 93ff PUSH R31 000351 b7ff IN R31,SREG 000352 94f8 CLI 000353 bbae OUT EEARL,R26 000354 9ae0 SBI EECR,EERE 000355 b3ed IN R30,EEDR 000356 bfff OUT SREG,R31 000357 91ff POP R31 000358 9508 RET __SAVELOCR4: 000359 933a ST -Y,R19 __SAVELOCR3: 00035a 932a ST -Y,R18 __SAVELOCR2: 00035b 931a ST -Y,R17 00035c 930a ST -Y,R16 00035d 9508 RET __LOADLOCR4: 00035e 813b LDD R19,Y+3 __LOADLOCR3: 00035f 812a LDD R18,Y+2 __LOADLOCR2: 000360 8119 LDD R17,Y+1 000361 8108 LD R16,Y 000362 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: 90 r27: 48 r28: 8 r29: 0 r30: 235 r31: 13 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 : 5 cln : 0 clr : 8 cls : 0 clt : 2 clv : 0 clz : 0 com : 0 cp : 22 cpc : 0 cpi : 6 cpse : 0 dec : 3 des : 0 eor : 2 fmul : 0 fmuls : 0 fmulsu: 0 icall : 0 ijmp : 0 in : 9 inc : 8 ld : 16 ldd : 16 ldi : 190 lds : 0 lpm : 9 lsl : 0 lsr : 0 mov : 15 movw : 5 mul : 0 muls : 0 mulsu : 0 neg : 0 nop : 0 or : 2 ori : 0 out : 80 pop : 4 push : 4 rcall : 104 ret : 20 reti : 3 rjmp : 82 rol : 0 ror : 0 sbc : 0 sbci : 0 sbi : 20 sbic : 12 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 0x0006c6 1580 154 1734 2048 84.7% [.dseg] 0x000060 0x000088 0 8 8 128 6.3% [.eseg] 0x000000 0x000009 0 9 9 128 7.0% Assembly complete, 0 errors, 9 warnings