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

📄 ptr8000.lst

📁 本文档是从MCS51向AVR的快速转换的说明文档.
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 + -