📄 ptr8000.lst
字号:
(0089)
(0090) //SPI initialize
(0091) void spi_init(void)
(0092) {uchar temp;
(0093)
(0094) //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
(0095) SPCR = 0x51; //不使用SPI中断,其它同上
_spi_init:
temp --> R16
0161 E581 LDI R24,0x51
0162 B98D OUT 0x0D,R24
(0096) SPSR = 0x00; //setup SPI
0163 2422 CLR R2
0164 B82E OUT 0x0E,R2
(0097)
(0098) temp = SPSR; //!!!
0165 B10E IN R16,0x0E
(0099) temp = SPDR; //清空SPI,和中断标志,使SPI空闲
0166 B10F IN R16,0x0F
0167 9508 RET
(0100) }
(0101)
(0102) #pragma interrupt_handler spi_stc_isr:11
(0103) void spi_stc_isr(void)
(0104) {uchar data;
_spi_stc_isr:
data --> Y+1
0168 9518 RETI
(0105) //byte in SPDR has been sent/received
(0106) //data=SPDR;
(0107) //SPDR=0x66;
(0108) }
(0109)
(0110) //UART0 initialize
(0111) // desired baud rate: 19200
(0112) // actual: baud rate:19200 (0.0%)
(0113) // char size: 5 bits
(0114) // parity: Disabled
(0115) void uart0_init(void)
(0116) {
(0117) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
0169 2422 CLR R2
016A B82A OUT 0x0A,R2
(0118) UCSRA = 0x00;
016B B82B OUT 0x0B,R2
(0119) UCSRC = BIT(URSEL) | 0x00;
016C E880 LDI R24,0x80
016D BD80 OUT 0x20,R24
(0120) UBRRL = 0x23; //set baud rate lo
016E E283 LDI R24,0x23
016F B989 OUT 0x09,R24
(0121) UBRRH = 0x00; //set baud rate hi
0170 BC20 OUT 0x20,R2
(0122) UCSRB = 0x18;
0171 E188 LDI R24,0x18
0172 B98A OUT 0x0A,R24
0173 9508 RET
(0123) }
(0124)
(0125) //call this routine to initialize all peripherals
(0126) void init_devices(void)
(0127) {
(0128) //stop errant interrupts until set up
(0129) CLI(); //disable all interrupts
_init_devices:
0174 94F8 BCLR 7
(0130) port_init();
0175 DF8A RCALL _port_init
(0131) timer0_init();
0176 DF99 RCALL _timer0_init
(0132) timer1_init();
0177 DFC8 RCALL _timer1_init
(0133) spi_init();
0178 DFE8 RCALL _spi_init
(0134) uart0_init();
0179 DFEF RCALL _uart0_init
(0135)
(0136) MCUCR = 0x00;
017A 2422 CLR R2
017B BE25 OUT 0x35,R2
(0137) GICR = 0x00;
017C BE2B OUT 0x3B,R2
(0138) TIMSK = 0x05; //timer interrupt sources
017D E085 LDI R24,5
017E BF89 OUT 0x39,R24
(0139) SEI(); //re-enable interrupts
017F 9478 BSET 7
0180 9508 RET
(0140) //all peripherals are now initialized
(0141) }
(0142)
(0143) void main()
(0144) {
(0145) init_devices();
_main:
0181 DFF2 RCALL _init_devices
(0146) SystemIni();
0182 D057 RCALL _SystemIni
(0147) nrf905_Init();
0183 940E009A CALL _nrf905_Init
0185 C00E RJMP 0x0194
(0148)
(0149) while (1)
(0150) {
(0151) if (bTimer) TimerFunc();
0186 902000A3 LDS R2,bTimer
0188 2022 TST R2
0189 F009 BEQ 0x018B
018A D044 RCALL _TimerFunc
(0152) #ifdef MASTER
(0153) if (bRfSend)
018B 902000A2 LDS R2,bRfSend
018D 2022 TST R2
018E F021 BEQ 0x0193
(0154) { bRfSend=0;
018F 2422 CLR R2
0190 922000A2 STS bRfSend,R2
(0155) RfSendProc();//发送测试
0192 D025 RCALL _RfSendProc
(0156) }
(0157) #endif
(0158)
(0159) RfRecvProc();//接收处理
0193 D002 RCALL _RfRecvProc
0194 CFF1 RJMP 0x0186
(0160) };
0195 9508 RET
_RfRecvProc:
i --> R20
0196 940E020D CALL push_gset1
(0161) }
(0162)
(0163) //接收处理
(0164) void RfRecvProc()
(0165) {uchar i;
(0166)
(0167) //if ((PIND&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
(0168)
(0169) if ((PIND&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
0198 9984 SBIC 0x10,4
0199 C001 RJMP 0x019B
019A C01A RJMP 0x01B5
(0170)
(0171) //已经接收到数据
(0172) nrf905_ReadData();//读出...
019B 940E00E9 CALL _nrf905_ReadData
(0173) for (i=0;i<32;i++)
019D 2744 CLR R20
019E C00D RJMP 0x01AC
(0174) { if (RxBuf[i]!=(i+i))
019F 2E24 MOV R2,R20
01A0 0E24 ADD R2,R20
01A1 E680 LDI R24,0x60
01A2 E090 LDI R25,0
01A3 2FE4 MOV R30,R20
01A4 27FF CLR R31
01A5 0FE8 ADD R30,R24
01A6 1FF9 ADC R31,R25
01A7 8030 LDD R3,Z+0
01A8 1432 CP R3,R2
01A9 F009 BEQ 0x01AB
(0175) return;
01AA C00A RJMP 0x01B5
01AB 9543 INC R20
01AC 3240 CPI R20,0x20
01AD F388 BCS 0x019F
(0176) }
(0177)
(0178) //数据接收正确...灯指示
(0179) CPL(PORTD,LED);
01AE E880 LDI R24,0x80
01AF E090 LDI R25,0
01B0 B222 IN R2,0x12
01B1 2433 CLR R3
01B2 2628 EOR R2,R24
01B3 2639 EOR R3,R25
01B4 BA22 OUT 0x12,R2
01B5 940E0210 CALL pop_gset1
01B7 9508 RET
_RfSendProc:
i --> R20
01B8 940E020D CALL push_gset1
(0180)
(0181) //从机回送数据包,这样双方都能指示是否收到有效数据包
(0182) #ifndef MASTER
(0183) RfSendProc();
(0184) #endif
(0185) }
(0186)
(0187) //发送测试
(0188) void RfSendProc()
(0189) {uchar i;
(0190) for (i=0;i<32;i++) TxBuf[i]=i+i;
01BA 2744 CLR R20
01BB C00A RJMP 0x01C6
01BC 2E24 MOV R2,R20
01BD 0E24 ADD R2,R20
01BE E880 LDI R24,0x80
01BF E090 LDI R25,0
01C0 2FE4 MOV R30,R20
01C1 27FF CLR R31
01C2 0FE8 ADD R30,R24
01C3 1FF9 ADC R31,R25
01C4 8220 STD Z+0,R2
01C5 9543 INC R20
01C6 3240 CPI R20,0x20
01C7 F3A0 BCS 0x01BC
(0191) nrf905_SendData();//发送测试数据
01C8 940E00DF CALL _nrf905_SendData
(0192) nrf905_RxOn();//重新回到接收状态
01CA 940E0096 CALL _nrf905_RxOn
01CC 940E0210 CALL pop_gset1
01CE 9508 RET
(0193) }
(0194)
(0195) void TimerFunc()
(0196) {
(0197) bTimer=0;
_TimerFunc:
01CF 2422 CLR R2
01D0 922000A3 STS bTimer,R2
(0198) //WDR();//clear WDT
(0199)
(0200) CPL(PORTD,LED);
01D2 E880 LDI R24,0x80
01D3 E090 LDI R25,0
01D4 B222 IN R2,0x12
01D5 2433 CLR R3
01D6 2628 EOR R2,R24
01D7 2639 EOR R3,R25
01D8 BA22 OUT 0x12,R2
01D9 9508 RET
(0201) //SPDR=66;
(0202) }
(0203)
(0204) void SystemIni()
(0205) {
(0206) T0Cnt=T0N;
_SystemIni:
01DA E189 LDI R24,0x19
01DB 938000A1 STS T0Cnt,R24
(0207) RfCnt=RFTN;
01DD E08A LDI R24,0xA
01DE 938000A0 STS RfCnt,R24
01E0 9508 RET
_DelayMs:
i --> R20
ms --> R22
01E1 940E020B CALL push_gset2
01E3 2F60 MOV R22,R16
(0208) }
(0209)
(0210) void DelayMs(uchar ms)
(0211) {char i;
(0212) for (i=0;i<ms;i++)
01E4 2744 CLR R20
01E5 C004 RJMP 0x01EA
(0213) {DelayUs(1000);
01E6 EE08 LDI R16,0xE8
01E7 E013 LDI R17,3
01E8 D006 RCALL _DelayUs
01E9 9543 INC R20
01EA 1746 CP R20,R22
01EB F3D0 BCS 0x01E6
(0214) }
(0215) return;
01EC 940E0202 CALL pop_gset2
01EE 9508 RET
_DelayUs:
i --> R20
us --> R16
01EF 940E020D CALL push_gset1
(0216) }
(0217)
(0218) void DelayUs(uint us)
(0219) {uint i;
(0220) for (i=0;i<us;i++)
01F1 2744 CLR R20
01F2 2755 CLR R21
01F3 C008 RJMP 0x01FC
(0221) {NOP();NOP();NOP();NOP();NOP();NOP();
FILE: <library>
01F4 0000 NOP
01F5 0000 NOP
01F6 0000 NOP
01F7 0000 NOP
01F8 0000 NOP
01F9 0000 NOP
01FA 5F4F SUBI R20,0xFF
01FB 4F5F SBCI R21,0xFF
01FC 1740 CP R20,R16
01FD 0751 CPC R21,R17
01FE F3A8 BCS 0x01F4
01FF 940E0210 CALL pop_gset1
0201 9508 RET
pop_gset2:
0202 E0E2 LDI R30,2
0203 940C0211 JMP pop
push_gset5:
0205 92FA ST R15,-Y
0206 92EA ST R14,-Y
push_gset4:
0207 92DA ST R13,-Y
0208 92CA ST R12,-Y
push_gset3:
0209 92BA ST R11,-Y
020A 92AA ST R10,-Y
push_gset2:
020B 937A ST R23,-Y
020C 936A ST R22,-Y
push_gset1:
020D 935A ST R21,-Y
020E 934A ST R20,-Y
020F 9508 RET
pop_gset1:
0210 E0E1 LDI R30,1
pop:
0211 9149 LD R20,Y+
0212 9159 LD R21,Y+
0213 FDE0 SBRC R30,0
0214 9508 RET
0215 9169 LD R22,Y+
0216 9179 LD R23,Y+
0217 FDE1 SBRC R30,1
0218 9508 RET
0219 90A9 LD R10,Y+
021A 90B9 LD R11,Y+
021B FDE2 SBRC R30,2
021C 9508 RET
021D 90C9 LD R12,Y+
021E 90D9 LD R13,Y+
021F FDE3 SBRC R30,3
0220 9508 RET
0221 90E9 LD R14,Y+
0222 90F9 LD R15,Y+
0223 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -