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

📄 ptr4000.lst

📁 本附件是基于nrf2401的无线收发模块代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -