⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptr8000.lst

📁 本代码实现了两块无线收发模块prt8000(核心芯片nrf905)的通信功能
💻 LST
📖 第 1 页 / 共 3 页
字号:
     148 BC2F      OUT	0x2F,R2
(0079)  TCCR1B = 0x02; //start Timer
     149 E082      LDI	R24,2
     14A BD8E      OUT	0x2E,R24
     14B 9508      RET
_timer1_ovf_isr:
     14C 938A      ST	R24,-Y
     14D B78F      IN	R24,0x3F
     14E 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
     14F EC8A      LDI	R24,0xCA
     150 BD8D      OUT	0x2D,R24
(0087)  TCNT1L = 0x01; //reload counter low value
     151 E081      LDI	R24,1
     152 BD8C      OUT	0x2C,R24
     153 9189      LD	R24,Y+
     154 BF8F      OUT	0x3F,R24
     155 9189      LD	R24,Y+
     156 9518      RETI
(0088) }
(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
     157 E581      LDI	R24,0x51
     158 B98D      OUT	0x0D,R24
(0096)  SPSR = 0x00; //setup SPI
     159 2422      CLR	R2
     15A B82E      OUT	0x0E,R2
(0097)  
(0098)  temp = SPSR; //!!!
     15B B10E      IN	R16,0x0E
(0099)  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
     15C B10F      IN	R16,0x0F
     15D 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
     15E 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:
     15F 2422      CLR	R2
     160 B82A      OUT	0x0A,R2
(0118)  UCSRA = 0x00;
     161 B82B      OUT	0x0B,R2
(0119)  UCSRC = BIT(URSEL) | 0x00;
     162 E880      LDI	R24,0x80
     163 BD80      OUT	0x20,R24
(0120)  UBRRL = 0x23; //set baud rate lo
     164 E283      LDI	R24,0x23
     165 B989      OUT	0x09,R24
(0121)  UBRRH = 0x00; //set baud rate hi
     166 BC20      OUT	0x20,R2
(0122)  UCSRB = 0x18;
     167 E188      LDI	R24,0x18
     168 B98A      OUT	0x0A,R24
     169 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:
     16A 94F8      BCLR	7
(0130)  port_init();
     16B DF8A      RCALL	_port_init
(0131)  timer0_init();
     16C DF99      RCALL	_timer0_init
(0132)  timer1_init();
     16D DFC8      RCALL	_timer1_init
(0133)  spi_init();
     16E DFE8      RCALL	_spi_init
(0134)  uart0_init();
     16F DFEF      RCALL	_uart0_init
(0135) 
(0136)  MCUCR = 0x00;
     170 2422      CLR	R2
     171 BE25      OUT	0x35,R2
(0137)  GICR  = 0x00;
     172 BE2B      OUT	0x3B,R2
(0138)  TIMSK = 0x05; //timer interrupt sources
     173 E085      LDI	R24,5
     174 BF89      OUT	0x39,R24
(0139)  SEI(); //re-enable interrupts
     175 9478      BSET	7
     176 9508      RET
(0140)  //all peripherals are now initialized
(0141) }
(0142) 
(0143) void main()
(0144) {
(0145)    init_devices();
_main:
     177 DFF2      RCALL	_init_devices
(0146)    SystemIni();
     178 D053      RCALL	_SystemIni
(0147)    nrf905_Init();
     179 940E 0096 CALL	_nrf905_Init
     17B C00E      RJMP	0x018A
(0148) 
(0149)    while (1)
(0150)    {  
(0151)       if (bTimer) TimerFunc();
     17C 9020 00A3 LDS	R2,bTimer
     17E 2022      TST	R2
     17F F009      BEQ	0x0181
     180 D040      RCALL	_TimerFunc
(0152) 	  #ifdef MASTER
(0153) 	    if (bRfSend)
     181 9020 00A2 LDS	R2,bRfSend
     183 2022      TST	R2
     184 F021      BEQ	0x0189
(0154) 		{ bRfSend=0;
     185 2422      CLR	R2
     186 9220 00A2 STS	bRfSend,R2
(0155) 		  RfSendProc();//发送测试
     188 D023      RCALL	_RfSendProc
(0156) 		}
(0157) 	  #endif
(0158) 	  
(0159) 	  RfRecvProc();//接收处理
     189 D002      RCALL	_RfRecvProc
     18A CFF1      RJMP	0x017C
     18B 9508      RET
_RfRecvProc:
  i                    --> R20
     18C 934A      ST	R20,-Y
(0160)    };
(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正确
     18D 9984      SBIC	0x10,4
     18E C001      RJMP	0x0190
     18F C01A      RJMP	0x01AA
(0170)    
(0171)    //已经接收到数据
(0172)    nrf905_ReadData();//读出...
     190 940E 00E1 CALL	_nrf905_ReadData
(0173)    for (i=0;i<32;i++)
     192 2744      CLR	R20
     193 C00D      RJMP	0x01A1
(0174)    { if (RxBuf[i]!=(i+i)) 
     194 2E24      MOV	R2,R20
     195 0E24      ADD	R2,R20
     196 E680      LDI	R24,0x60
     197 E090      LDI	R25,0
     198 2FE4      MOV	R30,R20
     199 27FF      CLR	R31
     19A 0FE8      ADD	R30,R24
     19B 1FF9      ADC	R31,R25
     19C 8030      LDD	R3,Z+0
     19D 1432      CP	R3,R2
     19E F009      BEQ	0x01A0
(0175)         return;
     19F C00A      RJMP	0x01AA
     1A0 9543      INC	R20
     1A1 3240      CPI	R20,0x20
     1A2 F388      BCS	0x0194
(0176)    }
(0177)    
(0178)    //数据接收正确...灯指示
(0179)    CPL(PORTD,LED);
     1A3 E880      LDI	R24,0x80
     1A4 E090      LDI	R25,0
     1A5 B222      IN	R2,0x12
     1A6 2433      CLR	R3
     1A7 2628      EOR	R2,R24
     1A8 2639      EOR	R3,R25
     1A9 BA22      OUT	0x12,R2
     1AA 9149      LD	R20,Y+
     1AB 9508      RET
_RfSendProc:
  i                    --> R20
     1AC 934A      ST	R20,-Y
(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;
     1AD 2744      CLR	R20
     1AE C00A      RJMP	0x01B9
     1AF 2E24      MOV	R2,R20
     1B0 0E24      ADD	R2,R20
     1B1 E880      LDI	R24,0x80
     1B2 E090      LDI	R25,0
     1B3 2FE4      MOV	R30,R20
     1B4 27FF      CLR	R31
     1B5 0FE8      ADD	R30,R24
     1B6 1FF9      ADC	R31,R25
     1B7 8220      STD	Z+0,R2
     1B8 9543      INC	R20
     1B9 3240      CPI	R20,0x20
     1BA F3A0      BCS	0x01AF
(0191)    nrf905_SendData();//发送测试数据
     1BB 940E 00D7 CALL	_nrf905_SendData
(0192)    nrf905_RxOn();//重新回到接收状态
     1BD 940E 0092 CALL	_nrf905_RxOn
     1BF 9149      LD	R20,Y+
     1C0 9508      RET
(0193) }
(0194) 
(0195) void TimerFunc()
(0196) {
(0197)    bTimer=0;
_TimerFunc:
     1C1 2422      CLR	R2
     1C2 9220 00A3 STS	bTimer,R2
(0198)    //WDR();//clear WDT
(0199)    
(0200)    CPL(PORTD,LED);
     1C4 E880      LDI	R24,0x80
     1C5 E090      LDI	R25,0
     1C6 B222      IN	R2,0x12
     1C7 2433      CLR	R3
     1C8 2628      EOR	R2,R24
     1C9 2639      EOR	R3,R25
     1CA BA22      OUT	0x12,R2
     1CB 9508      RET
(0201)    //SPDR=66;
(0202) }
(0203) 
(0204) void SystemIni()
(0205) {
(0206)   T0Cnt=T0N;
_SystemIni:
     1CC E189      LDI	R24,0x19
     1CD 9380 00A1 STS	T0Cnt,R24
(0207)   RfCnt=RFTN;
     1CF E08A      LDI	R24,0xA
     1D0 9380 00A0 STS	RfCnt,R24
     1D2 9508      RET
_DelayMs:
  i                    --> R10
  ms                   --> R12
     1D3 92AA      ST	R10,-Y
     1D4 92CA      ST	R12,-Y
     1D5 2EC0      MOV	R12,R16
(0208) }
(0209) 
(0210) void DelayMs(uchar ms)
(0211) {char i;
(0212) for (i=0;i<ms;i++)
     1D6 24AA      CLR	R10
     1D7 C004      RJMP	0x01DC
(0213)   {DelayUs(1000);
     1D8 EE08      LDI	R16,0xE8
     1D9 E013      LDI	R17,3
     1DA D006      RCALL	_DelayUs
     1DB 94A3      INC	R10
     1DC 14AC      CP	R10,R12
     1DD F3D0      BCS	0x01D8
(0214)   }
(0215)   return;
     1DE 90C9      LD	R12,Y+
     1DF 90A9      LD	R10,Y+
     1E0 9508      RET
_DelayUs:
  i                    --> R20
  us                   --> R16
     1E1 934A      ST	R20,-Y
     1E2 935A      ST	R21,-Y
(0216) }
(0217) 
(0218) void DelayUs(uint us)
(0219) {uint i;
(0220)   for (i=0;i<us;i++)
     1E3 2744      CLR	R20
     1E4 2755      CLR	R21
     1E5 C008      RJMP	0x01EE
(0221)   {NOP();NOP();NOP();NOP();NOP();NOP();
FILE: <library>
     1E6 0000      NOP
     1E7 0000      NOP
     1E8 0000      NOP
     1E9 0000      NOP
     1EA 0000      NOP
     1EB 0000      NOP
     1EC 5F4F      SUBI	R20,0xFF
     1ED 4F5F      SBCI	R21,0xFF
     1EE 1740      CP	R20,R16
     1EF 0751      CPC	R21,R17
     1F0 F3A8      BCS	0x01E6
     1F1 9159      LD	R21,Y+
     1F2 9149      LD	R20,Y+
     1F3 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -