📄 ptr4000.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 39E6 CPI R30,0x96
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E00CC CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\IccAvr\Pei\PTR4000\PTR4000.C
(0001) //ICC-AVR application builder : 2006-4-4 11:28:26
(0002) // Target : M16 PTR4000模块简单测试
(0003) // Crystal: 11.059Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "config.h"
(0009) #include "nrf2401A.h"
(0010)
(0011) #define MASTER //编译控制是主机还是从机
(0012)
(0013) #define T0N 25
(0014)
(0015) //32字节数据包发送时间
(0016) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0017) #define RFTN 10 //发送测试间隔 10*20ms
(0018)
(0019) bit bTimer,bRfSend;
(0020) uchar T0Cnt,RfCnt;
(0021)
(0022) void port_init(void)
(0023) {
(0024) PORTA = 0x08;
_port_init:
004B E088 LDI R24,0x8
004C BB8B OUT 0x1B,R24
(0025) DDRA = 0x37;
004D E387 LDI R24,0x37
004E BB8A OUT 0x1A,R24
(0026) PORTB = 0x50;
004F E580 LDI R24,0x50
0050 BB88 OUT 0x18,R24
(0027) DDRB = 0xBF;
0051 EB8F LDI R24,0xBF
0052 BB87 OUT 0x17,R24
(0028) PORTC = 0x00; //m103 output only
0053 2422 CLR R2
0054 BA25 OUT 0x15,R2
(0029) DDRC = 0x00;
0055 BA24 OUT 0x14,R2
(0030) PORTD = 0x1C;
0056 E18C LDI R24,0x1C
0057 BB82 OUT 0x12,R24
(0031) DDRD = 0x80;
0058 E880 LDI R24,0x80
0059 BB81 OUT 0x11,R24
005A 9508 RET
(0032) }
(0033)
(0034) //TIMER0 initialize - prescale:1024
(0035) // WGM: Normal
(0036) // desired value: 20mSec
(0037) // actual value: 19.908mSec (0.5%)
(0038) void timer0_init(void)
(0039) {
(0040) TCCR0 = 0x00; //stop
_timer0_init:
005B 2422 CLR R2
005C BE23 OUT 0x33,R2
(0041) TCNT0 = 0x29; //set count
005D E289 LDI R24,0x29
005E BF82 OUT 0x32,R24
(0042) OCR0 = 0xD7; //set compare
005F ED87 LDI R24,0xD7
0060 BF8C OUT 0x3C,R24
(0043) TCCR0 = 0x05; //start timer
0061 E085 LDI R24,5
0062 BF83 OUT 0x33,R24
0063 9508 RET
_timer0_ovf_isr:
0064 922A ST R2,-Y
0065 938A ST R24,-Y
0066 B62F IN R2,0x3F
0067 922A ST R2,-Y
(0044) }
(0045)
(0046) #pragma interrupt_handler timer0_ovf_isr:10
(0047) void timer0_ovf_isr(void)
(0048) {
(0049) TCNT0 = 0x29; //reload counter value
0068 E289 LDI R24,0x29
0069 BF82 OUT 0x32,R24
(0050)
(0051) if (--T0Cnt==0)
006A 91800061 LDS R24,T0Cnt
006C 5081 SUBI R24,1
006D 2E28 MOV R2,R24
006E 92200061 STS T0Cnt,R2
0070 2388 TST R24
0071 F431 BNE 0x0078
(0052) {T0Cnt=T0N;
0072 E189 LDI R24,0x19
0073 93800061 STS T0Cnt,R24
(0053) bTimer=1;
0075 E081 LDI R24,1
0076 93800063 STS bTimer,R24
(0054) }
(0055) if (--RfCnt==0)
0078 91800060 LDS R24,RfCnt
007A 5081 SUBI R24,1
007B 2E28 MOV R2,R24
007C 92200060 STS RfCnt,R2
007E 2388 TST R24
007F F431 BNE 0x0086
(0056) {RfCnt=RFTN;
0080 E08A LDI R24,0xA
0081 93800060 STS RfCnt,R24
(0057) bRfSend=1;
0083 E081 LDI R24,1
0084 93800062 STS bRfSend,R24
(0058) }
0086 9029 LD R2,Y+
0087 BE2F OUT 0x3F,R2
0088 9189 LD R24,Y+
0089 9029 LD R2,Y+
008A 9518 RETI
(0059) }
(0060)
(0061) //TIMER1 initialize - prescale:8
(0062) // WGM: 0) Normal, TOP=0xFFFF
(0063) // desired value: 10mSec
(0064) // actual value: 9.999mSec (0.0%)
(0065) void timer1_init(void)
(0066) {
(0067) TCCR1B = 0x00; //stop
_timer1_init:
008B 2422 CLR R2
008C BC2E OUT 0x2E,R2
(0068) TCNT1H = 0xCA; //setup
008D EC8A LDI R24,0xCA
008E BD8D OUT 0x2D,R24
(0069) TCNT1L = 0x01;
008F E081 LDI R24,1
0090 BD8C OUT 0x2C,R24
(0070) OCR1AH = 0x35;
0091 E385 LDI R24,0x35
0092 BD8B OUT 0x2B,R24
(0071) OCR1AL = 0xFF;
0093 EF8F LDI R24,0xFF
0094 BD8A OUT 0x2A,R24
(0072) OCR1BH = 0x35;
0095 E385 LDI R24,0x35
0096 BD89 OUT 0x29,R24
(0073) OCR1BL = 0xFF;
0097 EF8F LDI R24,0xFF
0098 BD88 OUT 0x28,R24
(0074) ICR1H = 0x35;
0099 E385 LDI R24,0x35
009A BD87 OUT 0x27,R24
(0075) ICR1L = 0xFF;
009B EF8F LDI R24,0xFF
009C BD86 OUT 0x26,R24
(0076) TCCR1A = 0x00;
009D BC2F OUT 0x2F,R2
(0077) TCCR1B = 0x02; //start Timer
009E E082 LDI R24,2
009F BD8E OUT 0x2E,R24
00A0 9508 RET
_timer1_ovf_isr:
00A1 938A ST R24,-Y
00A2 B78F IN R24,0x3F
00A3 938A ST R24,-Y
(0078) }
(0079)
(0080) #pragma interrupt_handler timer1_ovf_isr:9
(0081) void timer1_ovf_isr(void)
(0082) {
(0083) //TIMER1 has overflowed
(0084) TCNT1H = 0xCA; //reload counter high value
00A4 EC8A LDI R24,0xCA
00A5 BD8D OUT 0x2D,R24
(0085) TCNT1L = 0x01; //reload counter low value
00A6 E081 LDI R24,1
00A7 BD8C OUT 0x2C,R24
00A8 9189 LD R24,Y+
00A9 BF8F OUT 0x3F,R24
00AA 9189 LD R24,Y+
00AB 9518 RETI
(0086) }
(0087)
(0088) //SPI initialize
(0089) void spi_init(void)
(0090) {uchar temp;
(0091)
(0092) //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
(0093) SPCR = 0x51; //不使用SPI中断,其它同上
_spi_init:
temp --> R16
00AC E581 LDI R24,0x51
00AD B98D OUT 0x0D,R24
(0094) SPSR = 0x00; //setup SPI
00AE 2422 CLR R2
00AF B82E OUT 0x0E,R2
(0095)
(0096) temp = SPSR; //!!!
00B0 B10E IN R16,0x0E
(0097) temp = SPDR; //清空SPI,和中断标志,使SPI空闲
00B1 B10F IN R16,0x0F
00B2 9508 RET
(0098) }
(0099)
(0100) #pragma interrupt_handler spi_stc_isr:11
(0101) void spi_stc_isr(void)
(0102) {uchar data;
_spi_stc_isr:
data --> Y+1
00B3 9518 RETI
(0103) //byte in SPDR has been sent/received
(0104) //data=SPDR;
(0105) //SPDR=0x66;
(0106) }
(0107)
(0108) //UART0 initialize
(0109) // desired baud rate: 19200
(0110) // actual: baud rate:19200 (0.0%)
(0111) // char size: 5 bits
(0112) // parity: Disabled
(0113) void uart0_init(void)
(0114) {
(0115) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
00B4 2422 CLR R2
00B5 B82A OUT 0x0A,R2
(0116) UCSRA = 0x00;
00B6 B82B OUT 0x0B,R2
(0117) UCSRC = BIT(URSEL) | 0x00;
00B7 E880 LDI R24,0x80
00B8 BD80 OUT 0x20,R24
(0118) UBRRL = 0x23; //set baud rate lo
00B9 E283 LDI R24,0x23
00BA B989 OUT 0x09,R24
(0119) UBRRH = 0x00; //set baud rate hi
00BB BC20 OUT 0x20,R2
(0120) UCSRB = 0x18;
00BC E188 LDI R24,0x18
00BD B98A OUT 0x0A,R24
00BE 9508 RET
(0121) }
(0122)
(0123) //call this routine to initialize all peripherals
(0124) void init_devices(void)
(0125) {
(0126) //stop errant interrupts until set up
(0127) CLI(); //disable all interrupts
_init_devices:
00BF 94F8 BCLR 7
(0128) port_init();
00C0 DF8A RCALL _port_init
(0129) timer0_init();
00C1 DF99 RCALL _timer0_init
(0130) timer1_init();
00C2 DFC8 RCALL _timer1_init
(0131) spi_init();
00C3 DFE8 RCALL _spi_init
(0132) uart0_init();
00C4 DFEF RCALL _uart0_init
(0133)
(0134) MCUCR = 0x00;
00C5 2422 CLR R2
00C6 BE25 OUT 0x35,R2
(0135) GICR = 0x00;
00C7 BE2B OUT 0x3B,R2
(0136) TIMSK = 0x05; //timer interrupt sources
00C8 E085 LDI R24,5
00C9 BF89 OUT 0x39,R24
(0137) SEI(); //re-enable interrupts
00CA 9478 BSET 7
00CB 9508 RET
(0138) //all peripherals are now initialized
(0139) }
(0140)
(0141) void main()
(0142) {
(0143) init_devices();
_main:
00CC DFF2 RCALL _init_devices
(0144) SystemIni();
00CD D05A RCALL _SystemIni
(0145) nrf2401A_Init();
00CE 940E01B8 CALL _nrf2401A_Init
00D0 C00E RJMP 0x00DF
(0146)
(0147) while (1)
(0148) {
(0149) if (bTimer) TimerFunc();
00D1 90200063 LDS R2,bTimer
00D3 2022 TST R2
00D4 F009 BEQ 0x00D6
00D5 D047 RCALL _TimerFunc
(0150) #ifdef MASTER
(0151) if (bRfSend)
00D6 90200062 LDS R2,bRfSend
00D8 2022 TST R2
00D9 F021 BEQ 0x00DE
(0152) { bRfSend=0;
00DA 2422 CLR R2
00DB 92200062 STS bRfSend,R2
(0153) RfSendProc();//发送测试
00DD D025 RCALL _RfSendProc
(0154) }
(0155) #endif
(0156)
(0157) //#ifndef MASTER
(0158) RfRecvProc();//接收处理
00DE D002 RCALL _RfRecvProc
00DF CFF1 RJMP 0x00D1
(0159) //#endif
(0160) };
00E0 9508 RET
_RfRecvProc:
i --> R20
00E1 940E01FE CALL push_gset1
(0161) }
(0162)
(0163) //接收处理
(0164) void RfRecvProc()
(0165) {uchar i;
(0166)
(0167) if ((PINA&(1<<DR2))==0) return;//DR=1时表示数据接收对而且Crc正确
00E3 99CB SBIC 0x19,3
00E4 C001 RJMP 0x00E6
00E5 C01A RJMP 0x0100
(0168)
(0169) //已经接收到数据
(0170) nrf2401A_ReadData();//读出...
00E6 940E01E1 CALL _nrf2401A_ReadData
(0171) for (i=0;i<10;i++)
00E8 2744 CLR R20
00E9 C00D RJMP 0x00F7
(0172) { if (RxBuf[i]!=(i+i))
00EA 2E24 MOV R2,R20
00EB 0E24 ADD R2,R20
00EC E684 LDI R24,0x64
00ED E090 LDI R25,0
00EE 2FE4 MOV R30,R20
00EF 27FF CLR R31
00F0 0FE8 ADD R30,R24
00F1 1FF9 ADC R31,R25
00F2 8030 LDD R3,Z+0
00F3 1432 CP R3,R2
00F4 F009 BEQ 0x00F6
(0173) return;
00F5 C00A RJMP 0x0100
00F6 9543 INC R20
00F7 304A CPI R20,0xA
00F8 F388 BCS 0x00EA
(0174) }
(0175)
(0176) //数据接收正确...灯指示
(0177) CPL(PORTD,LED);
00F9 E880 LDI R24,0x80
00FA E090 LDI R25,0
00FB B222 IN R2,0x12
00FC 2433 CLR R3
00FD 2628 EOR R2,R24
00FE 2639 EOR R3,R25
00FF BA22 OUT 0x12,R2
0100 940E0201 CALL pop_gset1
0102 9508 RET
_RfSendProc:
i --> R20
0103 940E01FE CALL push_gset1
(0178)
(0179) //从机回送数据包,这样双方都能指示是否收到有效数据包
(0180) #ifndef MASTER
(0181) DelayMs(5);
(0182) RfSendProc();
(0183) #endif
(0184) }
(0185)
(0186) //发送测试
(0187) void RfSendProc()
(0188) {uchar i;
(0189) for (i=0;i<32;i++) TxBuf[i]=i+i;
0105 2744 CLR R20
0106 C00A RJMP 0x0111
0107 2E24 MOV R2,R20
0108 0E24 ADD R2,R20
0109 E78D LDI R24,0x7D
010A E090 LDI R25,0
010B 2FE4 MOV R30,R20
010C 27FF CLR R31
010D 0FE8 ADD R30,R24
010E 1FF9 ADC R31,R25
010F 8220 STD Z+0,R2
0110 9543 INC R20
0111 3240 CPI R20,0x20
0112 F3A0 BCS 0x0107
(0190) nrf2401A_SendData();//发送测试数据
0113 940E01DB CALL _nrf2401A_SendData
(0191) DelayMs(5);//必须,马上转回RxMode的话数据发不出
0115 E005 LDI R16,5
0116 E010 LDI R17,0
0117 D017 RCALL _DelayMs
(0192) nrf2401A_RxOn();//重新回到接收状态
0118 940E01AE CALL _nrf2401A_RxOn
011A 940E0201 CALL pop_gset1
011C 9508 RET
(0193)
(0194) }
(0195)
(0196) void TimerFunc()
(0197) {
(0198) bTimer=0;
_TimerFunc:
011D 2422 CLR R2
011E 92200063 STS bTimer,R2
(0199) //WDR();//clear WDT
(0200)
(0201) CPL(PORTD,LED);
0120 E880 LDI R24,0x80
0121 E090 LDI R25,0
0122 B222 IN R2,0x12
0123 2433 CLR R3
0124 2628 EOR R2,R24
0125 2639 EOR R3,R25
0126 BA22 OUT 0x12,R2
0127 9508 RET
(0202) //SPDR=66;
(0203) }
(0204)
(0205) void SystemIni()
(0206) {
(0207) T0Cnt=T0N;
_SystemIni:
0128 E189 LDI R24,0x19
0129 93800061 STS T0Cnt,R24
(0208) RfCnt=RFTN;
012B E08A LDI R24,0xA
012C 93800060 STS RfCnt,R24
012E 9508 RET
_DelayMs:
i --> R20
ms --> R22
012F 940E01FC CALL push_gset2
0131 2F60 MOV R22,R16
(0209) }
(0210)
(0211) void DelayMs(uchar ms)
(0212) {char i;
(0213) for (i=0;i<ms;i++)
0132 2744 CLR R20
0133 C004 RJMP 0x0138
(0214) {DelayUs(1000);
0134 EE08 LDI R16,0xE8
0135 E013 LDI R17,3
0136 D006 RCALL _DelayUs
0137 9543 INC R20
0138 1746 CP R20,R22
0139 F3D0 BCS 0x0134
(0215) }
(0216) return;
013A 940E01F3 CALL pop_gset2
013C 9508 RET
_DelayUs:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -