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

📄 master.s

📁 这是用C编的nrf905的通讯程序
💻 S
字号:
	.module master.C
	.area data(ram, con, rel)
_X:
	.blkb 1
	.area idata
	.byte 10
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
	.dbsym s X _X c
_Y:
	.blkb 1
	.area idata
	.byte 2
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
	.dbsym s Y _Y c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 27
; //master
; 
; //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; #include "config.h"
; #include "nrf905.h"
; 
; #define MASTER  //编译控制是主机还是从机
; 
; 
; 
; #define T0N 25
; void DelayUs(uint);
; void DelayMs(uchar);
; //32字节数据包发送时间 
; //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
; #define RFTN 25  //发送测试间隔 10*20ms
; 
; 
; bit bTimer,bRfSend;
; uchar T0Cnt,RfCnt;
; 
; void port_init(void)
; {
	.dbline 28
;  PORTA = 0x0F;
	ldi R24,15
	out 0x1b,R24
	.dbline 29
;  DDRA  = 0xF0;
	ldi R24,240
	out 0x1a,R24
	.dbline 30
;  PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
	ldi R24,78
	out 0x18,R24
	.dbline 31
;  DDRB  = BIT(CSN)|BIT(MOSI)|BIT(SCK);
	ldi R24,176
	out 0x17,R24
	.dbline 32
;  PORTC = 0x00;
	clr R2
	out 0x15,R2
	.dbline 33
;  DDRC  = 0x00;
	out 0x14,R2
	.dbline 34
;  PORTD = BIT(uPCLK)|BIT(2);
	ldi R24,36
	out 0x12,R24
	.dbline 35
;  DDRD  = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED);
	ldi R24,216
	out 0x11,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer0_init _timer0_init fV
	.even
_timer0_init::
	.dbline -1
	.dbline 44
; }
; 
; 
; //TIMER0 initialize - prescale:1024
; // WGM: Normal
; // desired value: 20mSec
; // actual value: 19.861mSec (0.7%)
; void timer0_init(void)
; {
	.dbline 45
;  TCCR0 = 0x00; //stop
	clr R2
	out 0x33,R2
	.dbline 46
;  TCNT0 = 0x71; //set count
	ldi R24,113
	out 0x32,R24
	.dbline 47
;  OCR0  = 0x8F;  //set compare
	ldi R24,143
	out 0x3c,R24
	.dbline 48
;  TCCR0 = 0x05; //start timer
	ldi R24,5
	out 0x33,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 36
	jmp _timer0_ovf_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
	.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
	.even
_timer0_ovf_isr::
	st -y,R2
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 53
; }
; 
; #pragma interrupt_handler timer0_ovf_isr:10
; void timer0_ovf_isr(void)
; {
	.dbline 54
;  TCNT0 = 0x29; //reload counter value
	ldi R24,41
	out 0x32,R24
	.dbline 56
;  
;  if (--T0Cnt==0)
	lds R24,_T0Cnt
	subi R24,1
	mov R2,R24
	sts _T0Cnt,R2
	tst R24
	brne L4
	.dbline 57
;    {T0Cnt=T0N;
	.dbline 57
	ldi R24,25
	sts _T0Cnt,R24
	.dbline 58
;     bTimer=1;
	ldi R24,1
	sts _bTimer,R24
	.dbline 59
;     }
L4:
	.dbline 60
	lds R24,_RfCnt
	subi R24,1
	mov R2,R24
	sts _RfCnt,R2
	tst R24
	brne L6
	.dbline 61
	.dbline 61
	ldi R24,25
	sts _RfCnt,R24
	.dbline 62
	ldi R24,1
	sts _bRfSend,R24
	.dbline 63
L6:
	.dbline -2
L3:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e spi_init _spi_init fV
;           temp -> R16
	.even
_spi_init::
	.dbline -1
	.dbline 68
; if (--RfCnt==0)
;    {RfCnt=RFTN;
;     bRfSend=1;
;     }
; }
; 
; //SPI initialize
; void spi_init(void)
; {uchar temp;
	.dbline 71
; 
;  //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
;  SPCR = 0x51; //不使用SPI中断,其它同上
	ldi R24,81
	out 0xd,R24
	.dbline 72
;  SPSR = 0x00; //setup SPI
	clr R2
	out 0xe,R2
	.dbline 74
;  
;  temp = SPSR; //!!!
	in R16,0xe
	.dbline 75
;  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
	in R16,0xf
	.dbline -2
L8:
	.dbline 0 ; func end
	ret
	.dbsym r temp 16 c
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 81
; }
; 
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 83
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 84
;  port_init();
	xcall _port_init
	.dbline 85
;  timer0_init();
	xcall _timer0_init
	.dbline 87
;  
;  spi_init();
	xcall _spi_init
	.dbline 90
; 
;  
;  MCUCR = BIT(ISC01); //下降沿触发
	ldi R24,2
	out 0x35,R24
	.dbline 91
;  GICR  = 0x00;
	clr R2
	out 0x3b,R2
	.dbline 92
;  TIMSK = 0x05; //timer interrupt sources
	ldi R24,5
	out 0x39,R24
	.dbline 93
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e RfRecvProc _RfRecvProc fV
;              i -> R20
	.even
_RfRecvProc::
	xcall push_gset1
	.dbline -1
	.dbline 101
;  //all peripherals are now initialized
; }
; 
; 
; 
; //接收处理
; void RfRecvProc()
; {uchar i;
	.dbline 103
; 
;    if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
	sbic 0x16,1
	rjmp L11
	.dbline 103
	xjmp L10
L11:
	.dbline 105
;     
;    if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
	sbic 0x16,3
	rjmp L13
	.dbline 105
	xjmp L10
L13:
	.dbline 108
;    
;    //已经接收到数据
;    nrf905_ReadData();//读出...
	xcall _nrf905_ReadData
	.dbline 109
;    for (i=0;i<SIZE;i++)
	clr R20
	xjmp L18
L15:
	.dbline 110
;    { if (RxBuf[i]!=(i+i)) 
	.dbline 110
	mov R2,R20
	add R2,R20
	ldi R24,<_RxBuf
	ldi R25,>_RxBuf
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R3,z+0
	cp R3,R2
	breq L19
	.dbline 111
;         return;
	xjmp L10
L19:
	.dbline 112
L16:
	.dbline 109
	inc R20
L18:
	.dbline 109
	cpi R20,32
	brlo L15
	.dbline 115
;    }
;    
;    //数据接收正确...灯指示
;    CPL(PORTD,LED);
	ldi R24,128
	ldi R25,0
	in R2,0x12
	clr R3
	eor R2,R24
	eor R3,R25
	out 0x12,R2
	.dbline -2
L10:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e RfSendProc _RfSendProc fV
;              i -> R20
	.even
_RfSendProc::
	xcall push_gset1
	.dbline -1
	.dbline 125
;    
;    //从机回送数据包,这样双方都能指示是否收到有效数据包
;    #ifndef MASTER
;      //RfSendProc();
;    #endif
; }
; 
; //发送测试
; void RfSendProc()
; {uchar i;
	.dbline 126
	clr R20
	xjmp L25
L22:
	.dbline 126
	ldi R24,<_TxBuf
	ldi R25,>_TxBuf
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,_key
	std z+0,R2
L23:
	.dbline 126
	inc R20
L25:
	.dbline 126
;    for (i=0;i<SIZE;i++) TxBuf[i]=key;
	cpi R20,32
	brlo L22
	.dbline 127
;    nrf905_SendData();//发送测试数据
	xcall _nrf905_SendData
	.dbline 128
;    nrf905_RxOn();//重新回到接收状态
	xcall _nrf905_RxOn
	.dbline -2
L21:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e TimerFunc _TimerFunc fV
	.even
_TimerFunc::
	.dbline -1
	.dbline 132
; }
; 
; void TimerFunc()
; {
	.dbline 133
;    bTimer=0;
	clr R2
	sts _bTimer,R2
	.dbline 136
;    //WDR();//clear WDT
;    
;    CPL(PORTD,LED);
	ldi R24,128
	ldi R25,0
	in R2,0x12
	clr R3
	eor R2,R24
	eor R3,R25
	out 0x12,R2
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SystemIni _SystemIni fV
	.even
_SystemIni::
	.dbline -1
	.dbline 141
;    //SPDR=66;
; }
; 
; void SystemIni()
; {
	.dbline 142
;   T0Cnt=T0N;
	ldi R24,25
	sts _T0Cnt,R24
	.dbline 143
;   RfCnt=RFTN;
	sts _RfCnt,R24
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e DelayMs _DelayMs fV
;              i -> R20
;             ms -> R22
	.even
_DelayMs::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 147
; }
; 
; void DelayMs(uchar ms)
; {char i;
	.dbline 148
; for (i=0;i<ms;i++)
	clr R20
	xjmp L32
L29:
	.dbline 149
	.dbline 149
	ldi R16,1000
	ldi R17,3
	xcall _DelayUs
	.dbline 150
L30:
	.dbline 148
	inc R20
L32:
	.dbline 148
	cp R20,R22
	brlo L29
	.dbline 151
;   {DelayUs(1000);
;   }
;   return;
	.dbline -2
L28:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r ms 22 c
	.dbend
	.dbfunc e DelayUs _DelayUs fV
;              i -> R20,R21
;             us -> R16,R17
	.even
_DelayUs::
	xcall push_gset1
	.dbline -1
	.dbline 155
; }
; 
; void DelayUs(uint us)
; {uint i;
	.dbline 156
;   for (i=0;i<us;i++)
	clr R20
	clr R21
	xjmp L37
L34:
	.dbline 157
	.dbline 157
	nop
	.dbline 157
	nop
	.dbline 157
	nop
	.dbline 157
	nop
	.dbline 157
	nop
	.dbline 157
	nop
	.dbline 158
L35:
	.dbline 156
	subi R20,255  ; offset = 1
	sbci R21,255
L37:
	.dbline 156
	cp R20,R16
	cpc R21,R17
	brlo L34
	.dbline -2
L33:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r us 16 i
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
	.dbfunc e int0_isr _int0_isr fV
;              i -> <dead>
;        key_buf -> R20
	.even
_int0_isr::
	xcall push_lset
	xcall push_gset1
	.dbline -1
	.dbline 171
;   {NOP();NOP();NOP();NOP();NOP();NOP();
;   }
; }
; 
; 
; 
; 
; ////////////////////////////key interrupt/////////////////////////////////
; 
; 
; 
; #pragma interrupt_handler int0_isr:iv_INT0
; 
; void int0_isr(void)
; {
	.dbline 172
; uchar key_buf=16,i;
	ldi R20,16
	.dbline 173
; GICR=0x00; //关闭中断使能
	clr R2
	out 0x3b,R2
	.dbline 174
; DDRA=0xf0; //行列反转读取键盘的值
	ldi R24,240
	out 0x1a,R24
	.dbline 175
; PORTA=0x0f;
	ldi R24,15
	out 0x1b,R24
	.dbline 176
; if((~PINA)&0x01)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,0
	rjmp L39
	.dbline 177
; key_buf=0;
	clr R20
	xjmp L40
L39:
	.dbline 178
; else if((~PINA)&0x02)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,1
	rjmp L41
	.dbline 179
; key_buf=1;
	ldi R20,1
	xjmp L42
L41:
	.dbline 180
; else if((~PINA)&0x04)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,2
	rjmp L43
	.dbline 181
; key_buf=2;
	ldi R20,2
	xjmp L44
L43:
	.dbline 182
; else if((~PINA)&0x08)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrc R2,3
	.dbline 183
; key_buf=3;
	ldi R20,3
L45:
L44:
L42:
L40:
	.dbline 184
; DDRA=0x0f;
	ldi R24,15
	out 0x1a,R24
	.dbline 185
; PORTA=0xf0;
	ldi R24,240
	out 0x1b,R24
	.dbline 186
; DelayUs(4000);
	ldi R16,4000
	ldi R17,15
	xcall _DelayUs
	.dbline 187
; if((~PINA)&0x10)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,4
	rjmp L47
	.dbline 188
; key_buf+=0;
	xjmp L48
L47:
	.dbline 189
; else if((~PINA)&0x20)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,5
	rjmp L49
	.dbline 190
; key_buf+=4;
	subi R20,252    ; addi 4
	xjmp L50
L49:
	.dbline 191
; else if((~PINA)&0x40)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,6
	rjmp L51
	.dbline 192
; key_buf+=8;
	subi R20,248    ; addi 8
	xjmp L52
L51:
	.dbline 193
; else if((~PINA)&0x80)
	in R2,0x19
	clr R3
	com R2
	com R3
	sbrs R2,7
	rjmp L53
	.dbline 194
; key_buf+=12;
	subi R20,244    ; addi 12
	xjmp L54
L53:
	.dbline 196
; else
; key_buf=16;
	ldi R20,16
L54:
L52:
L50:
L48:
	.dbline 198
; 
; if(key_buf!=16)
	cpi R20,16
	breq L55
	.dbline 199
; {
	.dbline 200
; key=key_buf;
	sts _key,R20
	.dbline 202
; 
; RfSendProc();
	xcall _RfSendProc
	.dbline 203
; key_buf=16;
	ldi R20,16
L57:
	.dbline 205
L58:
	.dbline 205
; 
; while((~PINA)&0xf0) ;//检测按键是否释放,若没有释放就一直循环
	in R24,0x19
	com R24
	andi R24,240
	brne L57
	.dbline 206
; }
L55:
	.dbline 208
; 
; DDRA=0xf0;
	ldi R24,240
	out 0x1a,R24
	.dbline 209
; PORTA=0x0f;
	ldi R24,15
	out 0x1b,R24
	.dbline 210
; GIFR=0x40;
	ldi R24,64
	out 0x3a,R24
	.dbline 211
; GICR=0x40; //中断复位
	out 0x3b,R24
	.dbline -2
L38:
	xcall pop_gset1
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym l i 1 c
	.dbsym r key_buf 20 c
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 222
; }
; 
; 
; ///////////////////////key over/////////////////////////////////////////
; 
; 
; 
; 
; 
; void main()
; {
	.dbline 223
;    init_devices();
	xcall _init_devices
	.dbline 224
;    SystemIni();
	xcall _SystemIni
	.dbline 225
;    nrf905_Init();
	xcall _nrf905_Init
	.dbline 226
;    GICR  = BIT(INT0);
	ldi R24,64
	out 0x3b,R24
	xjmp L62
L61:
	.dbline 229
	.dbline 230
	xcall _RfRecvProc
	.dbline 231
L62:
	.dbline 228
	xjmp L61
X0:
	.dbline -2
L60:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
_RfCnt::
	.blkb 1
	.dbsym e RfCnt _RfCnt c
_T0Cnt::
	.blkb 1
	.dbsym e T0Cnt _T0Cnt c
_bRfSend::
	.blkb 1
	.dbsym e bRfSend _bRfSend c
_bTimer::
	.blkb 1
	.dbsym e bTimer _bTimer c
_key:
	.blkb 1
	.dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
	.dbsym s key _key c

⌨️ 快捷键说明

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