📄 ptr8000.lst
字号:
00AB E680 LDI R24,0x60
00AC E090 LDI R25,0
00AD 2FE4 MOV R30,R20
00AE 27FF CLR R31
00AF 0FE8 ADD R30,R24
00B0 1FF9 ADC R31,R25
00B1 8300 STD Z+0,R16
00B2 9543 INC R20
00B3 304A CPI R20,0xA
00B4 F3A0 BCS 0x00A9
(0204) }
(0205) SET(PORTB,CSN);
00B5 9AC4 SBI 0x18,4
00B6 940E0210 CALL pop_gset1
00B8 9508 RET
(0206) }
(0207)
(0208) //写Tx地址
(0209) void nrf905_SetTxAddr()
(0210) {
(0211) CLR(PORTB,CSN);
_nrf905_SetTxAddr:
00B9 98C4 CBI 0x18,4
(0212) nrf905_SpiRW(WTA); //写Tx地址
00BA E202 LDI R16,0x22
00BB DFBF RCALL _nrf905_SpiRW
(0213) nrf905_SpiRW(TX_ADDRESS_0);
00BC E102 LDI R16,0x12
00BD DFBD RCALL _nrf905_SpiRW
(0214) nrf905_SpiRW(TX_ADDRESS_1);
00BE E304 LDI R16,0x34
00BF DFBB RCALL _nrf905_SpiRW
(0215) nrf905_SpiRW(TX_ADDRESS_2);
00C0 E506 LDI R16,0x56
00C1 DFB9 RCALL _nrf905_SpiRW
(0216) nrf905_SpiRW(TX_ADDRESS_3);
00C2 E708 LDI R16,0x78
00C3 DFB7 RCALL _nrf905_SpiRW
(0217) SET(PORTB,CSN);
00C4 9AC4 SBI 0x18,4
00C5 9508 RET
_nrf905_SetData:
i --> R20
00C6 940E020D CALL push_gset1
(0218) }
(0219)
(0220) //写Tx数据
(0221) void nrf905_SetData()
(0222) {uchar i;
(0223)
(0224) CLR(PORTB,CSN);
00C8 98C4 CBI 0x18,4
(0225) nrf905_SpiRW(WTP); //写TxPayload
00C9 E200 LDI R16,0x20
00CA DFB0 RCALL _nrf905_SpiRW
(0226) for (i=0;i<SIZE;i++)
00CB 2744 CLR R20
00CC C009 RJMP 0x00D6
(0227) {
(0228) nrf905_SpiRW(TxBuf[i]);
00CD E880 LDI R24,0x80
00CE E090 LDI R25,0
00CF 2FE4 MOV R30,R20
00D0 27FF CLR R31
00D1 0FE8 ADD R30,R24
00D2 1FF9 ADC R31,R25
00D3 8100 LDD R16,Z+0
00D4 DFA6 RCALL _nrf905_SpiRW
00D5 9543 INC R20
00D6 3240 CPI R20,0x20
00D7 F3A8 BCS 0x00CD
(0229) }
(0230)
(0231) SET(PORTB,CSN);
00D8 9AC4 SBI 0x18,4
00D9 940E0210 CALL pop_gset1
00DB 9508 RET
(0232) }
(0233)
(0234) //等待发送结束
(0235) void nrf905_WaitSended()
(0236) {
(0237) while ((PIND&(1<<DR))==0);
_nrf905_WaitSended:
00DC 9B84 SBIS 0x10,4
00DD CFFE RJMP _nrf905_WaitSended
00DE 9508 RET
(0238) }
(0239)
(0240) //发送TxBuf中的数据
(0241) void nrf905_SendData()
(0242) {
(0243) nrf905_TxOn();//切换到发送模式
_nrf905_SendData:
00DF DFAB RCALL _nrf905_TxOn
(0244) nrf905_SetTxAddr();//写发送地址
00E0 DFD8 RCALL _nrf905_SetTxAddr
(0245) nrf905_SetData();//写数据
00E1 DFE4 RCALL _nrf905_SetData
(0246) nrf905_TxSend();//启动发送
00E2 DFAC RCALL _nrf905_TxSend
(0247) nrf905_WaitSended();//等待发送结束
00E3 DFF8 RCALL _nrf905_WaitSended
00E4 9508 RET
(0248)
(0249) }
(0250)
(0251) //测试直接重新发送上次写入的数据
(0252) void nrf905_SendAgain()
(0253) {
(0254) nrf905_TxOn();
_nrf905_SendAgain:
00E5 DFA5 RCALL _nrf905_TxOn
(0255) nrf905_TxSend();
00E6 DFA8 RCALL _nrf905_TxSend
(0256) nrf905_WaitSended();
00E7 DFF4 RCALL _nrf905_WaitSended
00E8 9508 RET
_nrf905_ReadData:
i --> R20
00E9 940E020D CALL push_gset1
(0257)
(0258) }
(0259)
(0260) //读出接收到的数据
(0261) void nrf905_ReadData()
(0262) {
(0263) uchar i;
(0264)
(0265) CLR(PORTB,CSN);
00EB 98C4 CBI 0x18,4
(0266) nrf905_SpiRW(RRP); //读RxPayload
00EC E204 LDI R16,0x24
00ED DF8D RCALL _nrf905_SpiRW
(0267) for (i=0;i<SIZE;i++)
00EE 2744 CLR R20
00EF C00A RJMP 0x00FA
(0268) {
(0269) RxBuf[i]=nrf905_SpiRW(0);//read...
00F0 2700 CLR R16
00F1 DF89 RCALL _nrf905_SpiRW
00F2 E680 LDI R24,0x60
00F3 E090 LDI R25,0
00F4 2FE4 MOV R30,R20
00F5 27FF CLR R31
00F6 0FE8 ADD R30,R24
00F7 1FF9 ADC R31,R25
00F8 8300 STD Z+0,R16
00F9 9543 INC R20
00FA 3240 CPI R20,0x20
00FB F3A0 BCS 0x00F0
(0270) }
(0271)
(0272) SET(PORTB,CSN);
00FC 9AC4 SBI 0x18,4
00FD 940E0210 CALL pop_gset1
00FF 9508 RET
FILE: D:\IccAvr\Pei\ptr8000\PTR8000.C
(0001) //ICC-AVR application builder : 2006-4-4 11:28:26
(0002) // Target : M16 PTR8000模块简单测试
(0003) // Crystal: 11.059Mhz
(0004)
(0005) //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
(0006)
(0007) #include <iom16v.h>
(0008) #include <macros.h>
(0009)
(0010) #include "config.h"
(0011) #include "nrf905.h"
(0012)
(0013) #define MASTER //编译控制是主机还是从机
(0014)
(0015) #define T0N 25
(0016)
(0017) //32字节数据包发送时间
(0018) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0019) #define RFTN 10 //发送测试间隔 10*20ms
(0020)
(0021) bit bTimer,bRfSend;
(0022) uchar T0Cnt,RfCnt;
(0023)
(0024) void port_init(void)
(0025) {
(0026) PORTA = 0x08;
_port_init:
0100 E088 LDI R24,0x8
0101 BB8B OUT 0x1B,R24
(0027) DDRA = 0x37;
0102 E387 LDI R24,0x37
0103 BB8A OUT 0x1A,R24
(0028) PORTB = 0x50;
0104 E580 LDI R24,0x50
0105 BB88 OUT 0x18,R24
(0029) DDRB = 0xBF;
0106 EB8F LDI R24,0xBF
0107 BB87 OUT 0x17,R24
(0030) PORTC = 0x00; //m103 output only
0108 2422 CLR R2
0109 BA25 OUT 0x15,R2
(0031) DDRC = 0x00;
010A BA24 OUT 0x14,R2
(0032) PORTD = 0x1C;
010B E18C LDI R24,0x1C
010C BB82 OUT 0x12,R24
(0033) DDRD = 0x80;
010D E880 LDI R24,0x80
010E BB81 OUT 0x11,R24
010F 9508 RET
(0034) }
(0035)
(0036) //TIMER0 initialize - prescale:1024
(0037) // WGM: Normal
(0038) // desired value: 20mSec
(0039) // actual value: 19.908mSec (0.5%)
(0040) void timer0_init(void)
(0041) {
(0042) TCCR0 = 0x00; //stop
_timer0_init:
0110 2422 CLR R2
0111 BE23 OUT 0x33,R2
(0043) TCNT0 = 0x29; //set count
0112 E289 LDI R24,0x29
0113 BF82 OUT 0x32,R24
(0044) OCR0 = 0xD7; //set compare
0114 ED87 LDI R24,0xD7
0115 BF8C OUT 0x3C,R24
(0045) TCCR0 = 0x05; //start timer
0116 E085 LDI R24,5
0117 BF83 OUT 0x33,R24
0118 9508 RET
_timer0_ovf_isr:
0119 922A ST R2,-Y
011A 938A ST R24,-Y
011B B62F IN R2,0x3F
011C 922A ST R2,-Y
(0046) }
(0047)
(0048) #pragma interrupt_handler timer0_ovf_isr:10
(0049) void timer0_ovf_isr(void)
(0050) {
(0051) TCNT0 = 0x29; //reload counter value
011D E289 LDI R24,0x29
011E BF82 OUT 0x32,R24
(0052)
(0053) if (--T0Cnt==0)
011F 918000A1 LDS R24,T0Cnt
0121 5081 SUBI R24,1
0122 2E28 MOV R2,R24
0123 922000A1 STS T0Cnt,R2
0125 2388 TST R24
0126 F431 BNE 0x012D
(0054) {T0Cnt=T0N;
0127 E189 LDI R24,0x19
0128 938000A1 STS T0Cnt,R24
(0055) bTimer=1;
012A E081 LDI R24,1
012B 938000A3 STS bTimer,R24
(0056) }
(0057) if (--RfCnt==0)
012D 918000A0 LDS R24,RfCnt
012F 5081 SUBI R24,1
0130 2E28 MOV R2,R24
0131 922000A0 STS RfCnt,R2
0133 2388 TST R24
0134 F431 BNE 0x013B
(0058) {RfCnt=RFTN;
0135 E08A LDI R24,0xA
0136 938000A0 STS RfCnt,R24
(0059) bRfSend=1;
0138 E081 LDI R24,1
0139 938000A2 STS bRfSend,R24
(0060) }
013B 9029 LD R2,Y+
013C BE2F OUT 0x3F,R2
013D 9189 LD R24,Y+
013E 9029 LD R2,Y+
013F 9518 RETI
(0061) }
(0062)
(0063) //TIMER1 initialize - prescale:8
(0064) // WGM: 0) Normal, TOP=0xFFFF
(0065) // desired value: 10mSec
(0066) // actual value: 9.999mSec (0.0%)
(0067) void timer1_init(void)
(0068) {
(0069) TCCR1B = 0x00; //stop
_timer1_init:
0140 2422 CLR R2
0141 BC2E OUT 0x2E,R2
(0070) TCNT1H = 0xCA; //setup
0142 EC8A LDI R24,0xCA
0143 BD8D OUT 0x2D,R24
(0071) TCNT1L = 0x01;
0144 E081 LDI R24,1
0145 BD8C OUT 0x2C,R24
(0072) OCR1AH = 0x35;
0146 E385 LDI R24,0x35
0147 BD8B OUT 0x2B,R24
(0073) OCR1AL = 0xFF;
0148 EF8F LDI R24,0xFF
0149 BD8A OUT 0x2A,R24
(0074) OCR1BH = 0x35;
014A E385 LDI R24,0x35
014B BD89 OUT 0x29,R24
(0075) OCR1BL = 0xFF;
014C EF8F LDI R24,0xFF
014D BD88 OUT 0x28,R24
(0076) ICR1H = 0x35;
014E E385 LDI R24,0x35
014F BD87 OUT 0x27,R24
(0077) ICR1L = 0xFF;
0150 EF8F LDI R24,0xFF
0151 BD86 OUT 0x26,R24
(0078) TCCR1A = 0x00;
0152 BC2F OUT 0x2F,R2
(0079) TCCR1B = 0x02; //start Timer
0153 E082 LDI R24,2
0154 BD8E OUT 0x2E,R24
0155 9508 RET
_timer1_ovf_isr:
0156 938A ST R24,-Y
0157 B78F IN R24,0x3F
0158 938A ST R24,-Y
(0080) }
(0081)
(0082) #pragma interrupt_handler timer1_ovf_isr:9
(0083) void timer1_ovf_isr(void)
(0084) {
(0085) //TIMER1 has overflowed
(0086) TCNT1H = 0xCA; //reload counter high value
0159 EC8A LDI R24,0xCA
015A BD8D OUT 0x2D,R24
(0087) TCNT1L = 0x01; //reload counter low value
015B E081 LDI R24,1
015C BD8C OUT 0x2C,R24
015D 9189 LD R24,Y+
015E BF8F OUT 0x3F,R24
015F 9189 LD R24,Y+
0160 9518 RETI
(0088) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -