📄 master.lis
字号:
.module master.C
.area data(ram, con, rel)
0000 _X:
0000 .blkb 1
.area idata
0000 0A .byte 10
.area data(ram, con, rel)
0001 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
0001 .dbsym s X _X c
0001 _Y:
0001 .blkb 1
.area idata
0001 02 .byte 2
.area data(ram, con, rel)
0002 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
0002 .dbsym s Y _Y c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
0000 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 27
0000 ; //master
0000 ;
0000 ; //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #include "config.h"
0000 ; #include "nrf905.h"
0000 ;
0000 ; #define MASTER //编译控制是主机还是从机
0000 ;
0000 ;
0000 ;
0000 ; #define T0N 25
0000 ; void DelayUs(uint);
0000 ; void DelayMs(uchar);
0000 ; //32字节数据包发送时间
0000 ; //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
0000 ; #define RFTN 25 //发送测试间隔 10*20ms
0000 ;
0000 ;
0000 ; bit bTimer,bRfSend;
0000 ; uchar T0Cnt,RfCnt;
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 28
0000 ; PORTA = 0x0F;
0000 8FE0 ldi R24,15
0002 8BBB out 0x1b,R24
0004 .dbline 29
0004 ; DDRA = 0xF0;
0004 80EF ldi R24,240
0006 8ABB out 0x1a,R24
0008 .dbline 30
0008 ; PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
0008 8EE4 ldi R24,78
000A 88BB out 0x18,R24
000C .dbline 31
000C ; DDRB = BIT(CSN)|BIT(MOSI)|BIT(SCK);
000C 80EB ldi R24,176
000E 87BB out 0x17,R24
0010 .dbline 32
0010 ; PORTC = 0x00;
0010 2224 clr R2
0012 25BA out 0x15,R2
0014 .dbline 33
0014 ; DDRC = 0x00;
0014 24BA out 0x14,R2
0016 .dbline 34
0016 ; PORTD = BIT(uPCLK)|BIT(2);
0016 84E2 ldi R24,36
0018 82BB out 0x12,R24
001A .dbline 35
001A ; DDRD = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED);
001A 88ED ldi R24,216
001C 81BB out 0x11,R24
001E .dbline -2
001E L1:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e timer0_init _timer0_init fV
.even
0020 _timer0_init::
0020 .dbline -1
0020 .dbline 44
0020 ; }
0020 ;
0020 ;
0020 ; //TIMER0 initialize - prescale:1024
0020 ; // WGM: Normal
0020 ; // desired value: 20mSec
0020 ; // actual value: 19.861mSec (0.7%)
0020 ; void timer0_init(void)
0020 ; {
0020 .dbline 45
0020 ; TCCR0 = 0x00; //stop
0020 2224 clr R2
0022 23BE out 0x33,R2
0024 .dbline 46
0024 ; TCNT0 = 0x71; //set count
0024 81E7 ldi R24,113
0026 82BF out 0x32,R24
0028 .dbline 47
0028 ; OCR0 = 0x8F; //set compare
0028 8FE8 ldi R24,143
002A 8CBF out 0x3c,R24
002C .dbline 48
002C ; TCCR0 = 0x05; //start timer
002C 85E0 ldi R24,5
002E 83BF out 0x33,R24
0030 .dbline -2
0030 L2:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbend
.area vector(rom, abs)
.org 36
0024 0C941900 jmp _timer0_ovf_isr
.area text(rom, con, rel)
0032 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
0032 .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
0032 _timer0_ovf_isr::
0032 2A92 st -y,R2
0034 8A93 st -y,R24
0036 2FB6 in R2,0x3f
0038 2A92 st -y,R2
003A .dbline -1
003A .dbline 53
003A ; }
003A ;
003A ; #pragma interrupt_handler timer0_ovf_isr:10
003A ; void timer0_ovf_isr(void)
003A ; {
003A .dbline 54
003A ; TCNT0 = 0x29; //reload counter value
003A 89E2 ldi R24,41
003C 82BF out 0x32,R24
003E .dbline 56
003E ;
003E ; if (--T0Cnt==0)
003E 80910100 lds R24,_T0Cnt
0042 8150 subi R24,1
0044 282E mov R2,R24
0046 20920100 sts _T0Cnt,R2
004A 8823 tst R24
004C 31F4 brne L4
004E .dbline 57
004E ; {T0Cnt=T0N;
004E .dbline 57
004E 89E1 ldi R24,25
0050 80930100 sts _T0Cnt,R24
0054 .dbline 58
0054 ; bTimer=1;
0054 81E0 ldi R24,1
0056 80930300 sts _bTimer,R24
005A .dbline 59
005A ; }
005A L4:
005A .dbline 60
005A 80910000 lds R24,_RfCnt
005E 8150 subi R24,1
0060 282E mov R2,R24
0062 20920000 sts _RfCnt,R2
0066 8823 tst R24
0068 31F4 brne L6
006A .dbline 61
006A .dbline 61
006A 89E1 ldi R24,25
006C 80930000 sts _RfCnt,R24
0070 .dbline 62
0070 81E0 ldi R24,1
0072 80930200 sts _bRfSend,R24
0076 .dbline 63
0076 L6:
0076 .dbline -2
0076 L3:
0076 2990 ld R2,y+
0078 2FBE out 0x3f,R2
007A 8991 ld R24,y+
007C 2990 ld R2,y+
007E .dbline 0 ; func end
007E 1895 reti
0080 .dbend
0080 .dbfunc e spi_init _spi_init fV
0080 ; temp -> R16
.even
0080 _spi_init::
0080 .dbline -1
0080 .dbline 68
0080 ; if (--RfCnt==0)
0080 ; {RfCnt=RFTN;
0080 ; bRfSend=1;
0080 ; }
0080 ; }
0080 ;
0080 ; //SPI initialize
0080 ; void spi_init(void)
0080 ; {uchar temp;
0080 .dbline 71
0080 ;
0080 ; //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
0080 ; SPCR = 0x51; //不使用SPI中断,其它同上
0080 81E5 ldi R24,81
0082 8DB9 out 0xd,R24
0084 .dbline 72
0084 ; SPSR = 0x00; //setup SPI
0084 2224 clr R2
0086 2EB8 out 0xe,R2
0088 .dbline 74
0088 ;
0088 ; temp = SPSR; //!!!
0088 0EB1 in R16,0xe
008A .dbline 75
008A ; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
008A 0FB1 in R16,0xf
008C .dbline -2
008C L8:
008C .dbline 0 ; func end
008C 0895 ret
008E .dbsym r temp 16 c
008E .dbend
008E .dbfunc e init_devices _init_devices fV
.even
008E _init_devices::
008E .dbline -1
008E .dbline 81
008E ; }
008E ;
008E ;
008E ; //call this routine to initialize all peripherals
008E ; void init_devices(void)
008E ; {
008E .dbline 83
008E ; //stop errant interrupts until set up
008E ; CLI(); //disable all interrupts
008E F894 cli
0090 .dbline 84
0090 ; port_init();
0090 B7DF xcall _port_init
0092 .dbline 85
0092 ; timer0_init();
0092 C6DF xcall _timer0_init
0094 .dbline 87
0094 ;
0094 ; spi_init();
0094 F5DF xcall _spi_init
0096 .dbline 90
0096 ;
0096 ;
0096 ; MCUCR = BIT(ISC01); //下降沿触发
0096 82E0 ldi R24,2
0098 85BF out 0x35,R24
009A .dbline 91
009A ; GICR = 0x00;
009A 2224 clr R2
009C 2BBE out 0x3b,R2
009E .dbline 92
009E ; TIMSK = 0x05; //timer interrupt sources
009E 85E0 ldi R24,5
00A0 89BF out 0x39,R24
00A2 .dbline 93
00A2 ; SEI(); //re-enable interrupts
00A2 7894 sei
00A4 .dbline -2
00A4 L9:
00A4 .dbline 0 ; func end
00A4 0895 ret
00A6 .dbend
00A6 .dbfunc e RfRecvProc _RfRecvProc fV
00A6 ; i -> R20
.even
00A6 _RfRecvProc::
00A6 0E940000 xcall push_gset1
00AA .dbline -1
00AA .dbline 101
00AA ; //all peripherals are now initialized
00AA ; }
00AA ;
00AA ;
00AA ;
00AA ; //接收处理
00AA ; void RfRecvProc()
00AA ; {uchar i;
00AA .dbline 103
00AA ;
00AA ; if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
00AA B199 sbic 0x16,1
00AC 01C0 rjmp L11
00AE .dbline 103
00AE 1DC0 xjmp L10
00B0 L11:
00B0 .dbline 105
00B0 ;
00B0 ; if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
00B0 B399 sbic 0x16,3
00B2 01C0 rjmp L13
00B4 .dbline 105
00B4 1AC0 xjmp L10
00B6 L13:
00B6 .dbline 108
00B6 ;
00B6 ; //已经接收到数据
00B6 ; nrf905_ReadData();//读出...
00B6 0E940000 xcall _nrf905_ReadData
00BA .dbline 109
00BA ; for (i=0;i<SIZE;i++)
00BA 4427 clr R20
00BC 0DC0 xjmp L18
00BE L15:
00BE .dbline 110
00BE ; { if (RxBuf[i]!=(i+i))
00BE .dbline 110
00BE 242E mov R2,R20
00C0 240E add R2,R20
00C2 80E0 ldi R24,<_RxBuf
00C4 90E0 ldi R25,>_RxBuf
00C6 E42F mov R30,R20
00C8 FF27 clr R31
00CA E80F add R30,R24
00CC F91F adc R31,R25
00CE 3080 ldd R3,z+0
00D0 3214 cp R3,R2
00D2 09F0 breq L19
00D4 .dbline 111
00D4 ; return;
00D4 0AC0 xjmp L10
00D6 L19:
00D6 .dbline 112
00D6 L16:
00D6 .dbline 109
00D6 4395 inc R20
00D8 L18:
00D8 .dbline 109
00D8 4032 cpi R20,32
00DA 88F3 brlo L15
00DC .dbline 115
00DC ; }
00DC ;
00DC ; //数据接收正确...灯指示
00DC ; CPL(PORTD,LED);
00DC 80E8 ldi R24,128
00DE 90E0 ldi R25,0
00E0 22B2 in R2,0x12
00E2 3324 clr R3
00E4 2826 eor R2,R24
00E6 3926 eor R3,R25
00E8 22BA out 0x12,R2
00EA .dbline -2
00EA L10:
00EA 0E940000 xcall pop_gset1
00EE .dbline 0 ; func end
00EE 0895 ret
00F0 .dbsym r i 20 c
00F0 .dbend
00F0 .dbfunc e RfSendProc _RfSendProc fV
00F0 ; i -> R20
.even
00F0 _RfSendProc::
00F0 0E940000 xcall push_gset1
00F4 .dbline -1
00F4 .dbline 125
00F4 ;
00F4 ; //从机回送数据包,这样双方都能指示是否收到有效数据包
00F4 ; #ifndef MASTER
00F4 ; //RfSendProc();
00F4 ; #endif
00F4 ; }
00F4 ;
00F4 ; //发送测试
00F4 ; void RfSendProc()
00F4 ; {uchar i;
00F4 .dbline 126
00F4 4427 clr R20
00F6 0AC0 xjmp L25
00F8 L22:
00F8 .dbline 126
00F8 80E0 ldi R24,<_TxBuf
00FA 90E0 ldi R25,>_TxBuf
00FC E42F mov R30,R20
00FE FF27 clr R31
0100 E80F add R30,R24
0102 F91F adc R31,R25
0104 20900400 lds R2,_key
0108 2082 std z+0,R2
010A L23:
010A .dbline 126
010A 4395 inc R20
010C L25:
010C .dbline 126
010C ; for (i=0;i<SIZE;i++) TxBuf[i]=key;
010C 4032 cpi R20,32
010E A0F3 brlo L22
0110 .dbline 127
0110 ; nrf905_SendData();//发送测试数据
0110 0E940000 xcall _nrf905_SendData
0114 .dbline 128
0114 ; nrf905_RxOn();//重新回到接收状态
0114 0E940000 xcall _nrf905_RxOn
0118 .dbline -2
0118 L21:
0118 0E940000 xcall pop_gset1
011C .dbline 0 ; func end
011C 0895 ret
011E .dbsym r i 20 c
011E .dbend
011E .dbfunc e TimerFunc _TimerFunc fV
.even
011E _TimerFunc::
011E .dbline -1
011E .dbline 132
011E ; }
011E ;
011E ; void TimerFunc()
011E ; {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -