📄 slave.lis
字号:
.module slave.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\slave.C
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 23
0000 ; //SLAVE
0000 ;
0000 ; //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
0000 ;
0000 ;
0000 ; #include "config.h"
0000 ; #include "nrf905.h"
0000 ;
0000 ; #define MASTER //编译控制是主机还是从机
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 ; bit bTimer,bRfSend;
0000 ; uchar T0Cnt,RfCnt;
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 24
0000 ; PORTA = 0x00;
0000 2224 clr R2
0002 2BBA out 0x1b,R2
0004 .dbline 25
0004 ; DDRA = 0xff;
0004 8FEF ldi R24,255
0006 8ABB out 0x1a,R24
0008 .dbline 26
0008 ; PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
0008 8EE4 ldi R24,78
000A 88BB out 0x18,R24
000C .dbline 27
000C ; DDRB = BIT(CSN)|BIT(MOSI)|BIT(SCK);
000C 80EB ldi R24,176
000E 87BB out 0x17,R24
0010 .dbline 28
0010 ; PORTC = 0x00; //m103 output only
0010 25BA out 0x15,R2
0012 .dbline 29
0012 ; DDRC = 0x00;
0012 24BA out 0x14,R2
0014 .dbline 30
0014 ; PORTD = BIT(uPCLK);
0014 80E2 ldi R24,32
0016 82BB out 0x12,R24
0018 .dbline 31
0018 ; DDRD = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED)|0x07;
0018 8FED ldi R24,223
001A 81BB out 0x11,R24
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbend
001E .dbfunc e timer0_init _timer0_init fV
.even
001E _timer0_init::
001E .dbline -1
001E .dbline 39
001E ; }
001E ;
001E ; //TIMER0 initialize - prescale:1024
001E ; // WGM: Normal
001E ; // desired value: 20mSec
001E ; // actual value: 19.861mSec (0.7%)
001E ; void timer0_init(void)
001E ; {
001E .dbline 40
001E ; TCCR0 = 0x00; //stop
001E 2224 clr R2
0020 23BE out 0x33,R2
0022 .dbline 41
0022 ; TCNT0 = 0x71; //set count
0022 81E7 ldi R24,113
0024 82BF out 0x32,R24
0026 .dbline 42
0026 ; OCR0 = 0x8F; //set compare
0026 8FE8 ldi R24,143
0028 8CBF out 0x3c,R24
002A .dbline 43
002A ; TCCR0 = 0x05; //start timer
002A 85E0 ldi R24,5
002C 83BF out 0x33,R24
002E .dbline -2
002E L2:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
.area vector(rom, abs)
.org 36
0024 0C941800 jmp _timer0_ovf_isr
.area text(rom, con, rel)
0030 .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\slave.C
0030 .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
0030 _timer0_ovf_isr::
0030 2A92 st -y,R2
0032 8A93 st -y,R24
0034 2FB6 in R2,0x3f
0036 2A92 st -y,R2
0038 .dbline -1
0038 .dbline 48
0038 ; }
0038 ;
0038 ; #pragma interrupt_handler timer0_ovf_isr:10
0038 ; void timer0_ovf_isr(void)
0038 ; {
0038 .dbline 49
0038 ; TCNT0 = 0x29; //reload counter value
0038 89E2 ldi R24,41
003A 82BF out 0x32,R24
003C .dbline 51
003C ;
003C ; if (--T0Cnt==0)
003C 80910100 lds R24,_T0Cnt
0040 8150 subi R24,1
0042 282E mov R2,R24
0044 20920100 sts _T0Cnt,R2
0048 8823 tst R24
004A 31F4 brne L4
004C .dbline 52
004C ; {T0Cnt=T0N;
004C .dbline 52
004C 89E1 ldi R24,25
004E 80930100 sts _T0Cnt,R24
0052 .dbline 53
0052 ; bTimer=1;
0052 81E0 ldi R24,1
0054 80930300 sts _bTimer,R24
0058 .dbline 54
0058 ; }
0058 L4:
0058 .dbline 55
0058 80910000 lds R24,_RfCnt
005C 8150 subi R24,1
005E 282E mov R2,R24
0060 20920000 sts _RfCnt,R2
0064 8823 tst R24
0066 31F4 brne L6
0068 .dbline 56
0068 .dbline 56
0068 89E1 ldi R24,25
006A 80930000 sts _RfCnt,R24
006E .dbline 57
006E 81E0 ldi R24,1
0070 80930200 sts _bRfSend,R24
0074 .dbline 58
0074 L6:
0074 .dbline -2
0074 L3:
0074 2990 ld R2,y+
0076 2FBE out 0x3f,R2
0078 8991 ld R24,y+
007A 2990 ld R2,y+
007C .dbline 0 ; func end
007C 1895 reti
007E .dbend
007E .dbfunc e spi_init _spi_init fV
007E ; temp -> R16
.even
007E _spi_init::
007E .dbline -1
007E .dbline 65
007E ; if (--RfCnt==0)
007E ; {RfCnt=RFTN;
007E ; bRfSend=1;
007E ; }
007E ; }
007E ;
007E ;
007E ;
007E ; //SPI initialize
007E ; void spi_init(void)
007E ; {uchar temp;
007E .dbline 67
007E ;
007E ; SPCR = 0x51; //不使用SPI中断,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
007E 81E5 ldi R24,81
0080 8DB9 out 0xd,R24
0082 .dbline 68
0082 ; SPSR = 0x00; //setup SPI
0082 2224 clr R2
0084 2EB8 out 0xe,R2
0086 .dbline 70
0086 ;
0086 ; temp = SPSR; //!!!
0086 0EB1 in R16,0xe
0088 .dbline 71
0088 ; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
0088 0FB1 in R16,0xf
008A .dbline -2
008A L8:
008A .dbline 0 ; func end
008A 0895 ret
008C .dbsym r temp 16 c
008C .dbend
008C .dbfunc e init_devices _init_devices fV
.even
008C _init_devices::
008C .dbline -1
008C .dbline 79
008C ; }
008C ;
008C ;
008C ;
008C ;
008C ; //call this routine to initialize all peripherals
008C ; void init_devices(void)
008C ; {
008C .dbline 81
008C ; //stop errant interrupts until set up
008C ; CLI(); //disable all interrupts
008C F894 cli
008E .dbline 82
008E ; port_init();
008E B8DF xcall _port_init
0090 .dbline 83
0090 ; timer0_init();
0090 C6DF xcall _timer0_init
0092 .dbline 84
0092 ; spi_init();
0092 F5DF xcall _spi_init
0094 .dbline 85
0094 ; init_lcd();
0094 0E940000 xcall _init_lcd
0098 .dbline 86
0098 ; DISLCD();
0098 919A sbi 0x12,1
009A .dbline 88
009A ;
009A ; MCUCR = 0x00; //下降沿触发
009A 2224 clr R2
009C 25BE out 0x35,R2
009E .dbline 89
009E ; GICR = 0x00;
009E 2BBE out 0x3b,R2
00A0 .dbline 90
00A0 ; TIMSK = 0x05; //timer interrupt sources
00A0 85E0 ldi R24,5
00A2 89BF out 0x39,R24
00A4 .dbline 91
00A4 ; SEI(); //re-enable interrupts
00A4 7894 sei
00A6 .dbline -2
00A6 L9:
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbend
00A8 .dbfunc e RfRecvProc _RfRecvProc fV
00A8 ; i -> R20
.even
00A8 _RfRecvProc::
00A8 0E940000 xcall push_gset1
00AC .dbline -1
00AC .dbline 100
00AC ; //all peripherals are now initialized
00AC ; }
00AC ;
00AC ;
00AC ;
00AC ;
00AC ; //接收处理
00AC ; void RfRecvProc()
00AC ; {uchar i;
00AC .dbline 102
00AC ;
00AC ; if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
00AC B199 sbic 0x16,1
00AE 01C0 rjmp L11
00B0 .dbline 102
00B0 1EC0 xjmp L10
00B2 L11:
00B2 .dbline 104
00B2 ;
00B2 ; if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
00B2 B399 sbic 0x16,3
00B4 01C0 rjmp L13
00B6 .dbline 104
00B6 1BC0 xjmp L10
00B8 L13:
00B8 .dbline 108
00B8 ;
00B8 ;
00B8 ; //已经接收到数据
00B8 ; nrf905_ReadData();//读出...
00B8 0E940000 xcall _nrf905_ReadData
00BC .dbline 112
00BC ;
00BC ;
00BC ; //数据接收正确...灯指示
00BC ; CPL(PORTD,LED);
00BC 80E8 ldi R24,128
00BE 90E0 ldi R25,0
00C0 22B2 in R2,0x12
00C2 3324 clr R3
00C4 2826 eor R2,R24
00C6 3926 eor R3,R25
00C8 22BA out 0x12,R2
00CA .dbline 113
00CA 4427 clr R20
00CC 0AC0 xjmp L18
00CE L15:
00CE .dbline 113
00CE .dbline 113
00CE 80E0 ldi R24,<_RxBuf
00D0 90E0 ldi R25,>_RxBuf
00D2 E42F mov R30,R20
00D4 FF27 clr R31
00D6 E80F add R30,R24
00D8 F91F adc R31,R25
00DA 0081 ldd R16,z+0
00DC 0E940000 xcall _seg
00E0 .dbline 113
00E0 L16:
00E0 .dbline 113
00E0 4395 inc R20
00E2 L18:
00E2 .dbline 113
00E2 ; for (i=0;i<SIZE;i++){seg(RxBuf[i]);}
00E2 4032 cpi R20,32
00E4 A0F3 brlo L15
00E6 .dbline 114
00E6 ; LCD(RxBuf[0]);
00E6 00910000 lds R16,_RxBuf
00EA 0E940000 xcall _LCD
00EE .dbline -2
00EE L10:
00EE 0E940000 xcall pop_gset1
00F2 .dbline 0 ; func end
00F2 0895 ret
00F4 .dbsym r i 20 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -