?? master.lst
字號:
__start:
__text_start:
002C E5CF LDI R28,0x5F
002D E0D4 LDI R29,4
002E BFCD OUT 0x3D,R28
002F BFDE OUT 0x3E,R29
0030 51C0 SUBI R28,0x10
0031 40D0 SBCI R29,0
0032 EA0A LDI R16,0xAA
0033 8308 STD Y+0,R16
0034 2400 CLR R0
0035 E6E4 LDI R30,0x64
0036 E0F0 LDI R31,0
0037 E011 LDI R17,1
0038 33E2 CPI R30,0x32
0039 07F1 CPC R31,R17
003A F011 BEQ 0x003D
003B 9201 ST R0,Z+
003C CFFB RJMP 0x0038
003D 8300 STD Z+0,R16
003E E5E4 LDI R30,0x54
003F E0F0 LDI R31,0
0040 E6A0 LDI R26,0x60
0041 E0B0 LDI R27,0
0042 E010 LDI R17,0
0043 35E8 CPI R30,0x58
0044 07F1 CPC R31,R17
0045 F021 BEQ 0x004A
0046 95C8 LPM
0047 9631 ADIW R30,1
0048 920D ST R0,X+
0049 CFF9 RJMP 0x0043
004A 940E0174 CALL _main
_exit:
004C CFFF RJMP _exit
FILE: C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
(0001) //master
(0002)
(0003) //最關鍵的是SPI的初始化,MSB首位和極性方式00,極性方式錯誤,數據則不正確
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "config.h"
(0009) #include "nrf905.h"
(0010)
(0011) #define MASTER //編譯控制是主機還是從機
(0012)
(0013)
(0014)
(0015) #define T0N 25
(0016) void DelayUs(uint);
(0017) void DelayMs(uchar);
(0018) //32字節數據包發送時間
(0019) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0020) #define RFTN 25 //發送測試間隔 10*20ms
(0021)
(0022)
(0023) bit bTimer,bRfSend;
(0024) uchar T0Cnt,RfCnt;
(0025)
(0026) void port_init(void)
(0027) {
(0028) PORTA = 0x0F;
_port_init:
004D E08F LDI R24,0xF
004E BB8B OUT 0x1B,R24
(0029) DDRA = 0xF0;
004F EF80 LDI R24,0xF0
0050 BB8A OUT 0x1A,R24
(0030) PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
0051 E48E LDI R24,0x4E
0052 BB88 OUT 0x18,R24
(0031) DDRB = BIT(CSN)|BIT(MOSI)|BIT(SCK);
0053 EB80 LDI R24,0xB0
0054 BB87 OUT 0x17,R24
(0032) PORTC = 0x00;
0055 2422 CLR R2
0056 BA25 OUT 0x15,R2
(0033) DDRC = 0x00;
0057 BA24 OUT 0x14,R2
(0034) PORTD = BIT(uPCLK)|BIT(2);
0058 E284 LDI R24,0x24
0059 BB82 OUT 0x12,R24
(0035) DDRD = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED);
005A ED88 LDI R24,0xD8
005B BB81 OUT 0x11,R24
005C 9508 RET
(0036) }
(0037)
(0038)
(0039) //TIMER0 initialize - prescale:1024
(0040) // WGM: Normal
(0041) // desired value: 20mSec
(0042) // actual value: 19.861mSec (0.7%)
(0043) void timer0_init(void)
(0044) {
(0045) TCCR0 = 0x00; //stop
_timer0_init:
005D 2422 CLR R2
005E BE23 OUT 0x33,R2
(0046) TCNT0 = 0x71; //set count
005F E781 LDI R24,0x71
0060 BF82 OUT 0x32,R24
(0047) OCR0 = 0x8F; //set compare
0061 E88F LDI R24,0x8F
0062 BF8C OUT 0x3C,R24
(0048) TCCR0 = 0x05; //start timer
0063 E085 LDI R24,5
0064 BF83 OUT 0x33,R24
0065 9508 RET
_timer0_ovf_isr:
0066 922A ST R2,-Y
0067 938A ST R24,-Y
0068 B62F IN R2,0x3F
0069 922A ST R2,-Y
(0049) }
(0050)
(0051) #pragma interrupt_handler timer0_ovf_isr:10
(0052) void timer0_ovf_isr(void)
(0053) {
(0054) TCNT0 = 0x29; //reload counter value
006A E289 LDI R24,0x29
006B BF82 OUT 0x32,R24
(0055)
(0056) if (--T0Cnt==0)
006C 91800065 LDS R24,T0Cnt
006E 5081 SUBI R24,1
006F 2E28 MOV R2,R24
0070 92200065 STS T0Cnt,R2
0072 2388 TST R24
0073 F431 BNE 0x007A
(0057) {T0Cnt=T0N;
0074 E189 LDI R24,0x19
0075 93800065 STS T0Cnt,R24
(0058) bTimer=1;
0077 E081 LDI R24,1
0078 93800067 STS bTimer,R24
(0059) }
(0060) if (--RfCnt==0)
007A 91800064 LDS R24,RfCnt
007C 5081 SUBI R24,1
007D 2E28 MOV R2,R24
007E 92200064 STS RfCnt,R2
0080 2388 TST R24
0081 F431 BNE 0x0088
(0061) {RfCnt=RFTN;
0082 E189 LDI R24,0x19
0083 93800064 STS RfCnt,R24
(0062) bRfSend=1;
0085 E081 LDI R24,1
0086 93800066 STS bRfSend,R24
(0063) }
0088 9029 LD R2,Y+
0089 BE2F OUT 0x3F,R2
008A 9189 LD R24,Y+
008B 9029 LD R2,Y+
008C 9518 RETI
(0064) }
(0065)
(0066) //SPI initialize
(0067) void spi_init(void)
(0068) {uchar temp;
(0069)
(0070) //SPCR = 0xD1; //SPI中斷允許,SPI允許,主機模式,MSB,極性方式00,1/16系統時鐘速率
(0071) SPCR = 0x51; //不使用SPI中斷,其它同上
_spi_init:
temp --> R16
008D E581 LDI R24,0x51
008E B98D OUT 0x0D,R24
(0072) SPSR = 0x00; //setup SPI
008F 2422 CLR R2
0090 B82E OUT 0x0E,R2
(0073)
(0074) temp = SPSR; //!!!
0091 B10E IN R16,0x0E
(0075) temp = SPDR; //清空SPI,和中斷標志,使SPI空閑
0092 B10F IN R16,0x0F
0093 9508 RET
(0076) }
(0077)
(0078)
(0079) //call this routine to initialize all peripherals
(0080) void init_devices(void)
(0081) {
(0082) //stop errant interrupts until set up
(0083) CLI(); //disable all interrupts
_init_devices:
0094 94F8 BCLR 7
(0084) port_init();
0095 DFB7 RCALL _port_init
(0085) timer0_init();
0096 DFC6 RCALL _timer0_init
(0086)
(0087) spi_init();
0097 DFF5 RCALL _spi_init
(0088)
(0089)
(0090) MCUCR = BIT(ISC01); //下降沿觸發
0098 E082 LDI R24,2
0099 BF85 OUT 0x35,R24
(0091) GICR = 0x00;
009A 2422 CLR R2
009B BE2B OUT 0x3B,R2
(0092) TIMSK = 0x05; //timer interrupt sources
009C E085 LDI R24,5
009D BF89 OUT 0x39,R24
(0093) SEI(); //re-enable interrupts
009E 9478 BSET 7
009F 9508 RET
_RfRecvProc:
i --> R20
00A0 940E028C CALL push_gset1
(0094) //all peripherals are now initialized
(0095) }
(0096)
(0097)
(0098)
(0099) //接收處理
(0100) void RfRecvProc()
(0101) {uchar i;
(0102)
(0103) if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配對
00A2 99B1 SBIC 0x16,1
00A3 C001 RJMP 0x00A5
00A4 C01D RJMP 0x00C2
(0104)
(0105) if ((PINB&(1<<DR))==0) return;//DR=1時表示數據接收對而且Crc正確
00A5 99B3 SBIC 0x16,3
00A6 C001 RJMP 0x00A8
00A7 C01A RJMP 0x00C2
(0106)
(0107) //已經接收到數據
(0108) nrf905_ReadData();//讀出...
00A8 940E0267 CALL _nrf905_ReadData
(0109) for (i=0;i<SIZE;i++)
00AA 2744 CLR R20
00AB C00D RJMP 0x00B9
(0110) { if (RxBuf[i]!=(i+i))
00AC 2E24 MOV R2,R20
00AD 0E24 ADD R2,R20
00AE E689 LDI R24,0x69
00AF E090 LDI R25,0
00B0 2FE4 MOV R30,R20
00B1 27FF CLR R31
00B2 0FE8 ADD R30,R24
00B3 1FF9 ADC R31,R25
00B4 8030 LDD R3,Z+0
00B5 1432 CP R3,R2
00B6 F009 BEQ 0x00B8
(0111) return;
00B7 C00A RJMP 0x00C2
00B8 9543 INC R20
00B9 3240 CPI R20,0x20
00BA F388 BCS 0x00AC
(0112) }
(0113)
(0114) //數據接收正確...燈指示
(0115) CPL(PORTD,LED);
00BB E880 LDI R24,0x80
00BC E090 LDI R25,0
00BD B222 IN R2,0x12
00BE 2433 CLR R3
00BF 2628 EOR R2,R24
00C0 2639 EOR R3,R25
00C1 BA22 OUT 0x12,R2
00C2 940E028F CALL pop_gset1
00C4 9508 RET
_RfSendProc:
i --> R20
00C5 940E028C CALL push_gset1
(0116)
(0117) //從機回送數據包,這樣雙方都能指示是否收到有效數據包
(0118) #ifndef MASTER
(0119) //RfSendProc();
(0120) #endif
(0121) }
(0122)
(0123) //發送測試
(0124) void RfSendProc()
(0125) {uchar i;
(0126) for (i=0;i<SIZE;i++) TxBuf[i]=key;
00C7 2744 CLR R20
00C8 C00A RJMP 0x00D3
00C9 EC8D LDI R24,0xCD
00CA E090 LDI R25,0
00CB 2FE4 MOV R30,R20
00CC 27FF CLR R31
00CD 0FE8 ADD R30,R24
00CE 1FF9 ADC R31,R25
00CF 90200068 LDS R2,key
00D1 8220 STD Z+0,R2
00D2 9543 INC R20
00D3 3240 CPI R20,0x20
00D4 F3A0 BCS 0x00C9
(0127) nrf905_SendData();//發送測試數據
00D5 940E025D CALL _nrf905_SendData
(0128) nrf905_RxOn();//重新回到接收狀態
00D7 940E01B2 CALL _nrf905_RxOn
00D9 940E028F CALL pop_gset1
00DB 9508 RET
(0129) }
(0130)
(0131) void TimerFunc()
(0132) {
(0133) bTimer=0;
_TimerFunc:
00DC 2422 CLR R2
00DD 92200067 STS bTimer,R2
(0134) //WDR();//clear WDT
(0135)
(0136) CPL(PORTD,LED);
00DF E880 LDI R24,0x80
00E0 E090 LDI R25,0
00E1 B222 IN R2,0x12
00E2 2433 CLR R3
00E3 2628 EOR R2,R24
00E4 2639 EOR R3,R25
00E5 BA22 OUT 0x12,R2
00E6 9508 RET
(0137) //SPDR=66;
(0138) }
(0139)
(0140) void SystemIni()
(0141) {
(0142) T0Cnt=T0N;
_SystemIni:
00E7 E189 LDI R24,0x19
00E8 93800065 STS T0Cnt,R24
(0143) RfCnt=RFTN;
00EA 93800064 STS RfCnt,R24
00EC 9508 RET
_DelayMs:
i --> R20
ms --> R22
00ED 940E028A CALL push_gset2
00EF 2F60 MOV R22,R16
(0144) }
(0145)
(0146) void DelayMs(uchar ms)
(0147) {char i;
(0148) for (i=0;i<ms;i++)
00F0 2744 CLR R20
00F1 C004 RJMP 0x00F6
(0149) {DelayUs(1000);
00F2 EE08 LDI R16,0xE8
00F3 E013 LDI R17,3
00F4 D006 RCALL _DelayUs
00F5 9543 INC R20
00F6 1746 CP R20,R22
00F7 F3D0 BCS 0x00F2
(0150) }
(0151) return;
00F8 940E027E CALL pop_gset2
00FA 9508 RET
_DelayUs:
i --> R20
us --> R16
00FB 940E028C CALL push_gset1
(0152) }
(0153)
(0154) void DelayUs(uint us)
(0155) {uint i;
(0156) for (i=0;i<us;i++)
00FD 2744 CLR R20
00FE 2755 CLR R21
00FF C008 RJMP 0x0108
(0157) {NOP();NOP();NOP();NOP();NOP();NOP();
0100 0000 NOP
0101 0000 NOP
0102 0000 NOP
0103 0000 NOP
0104 0000 NOP
0105 0000 NOP
0106 5F4F SUBI R20,0xFF
0107 4F5F SBCI R21,0xFF
0108 1740 CP R20,R16
0109 0751 CPC R21,R17
010A F3A8 BCS 0x0100
010B 940E028F CALL pop_gset1
010D 9508 RET
_int0_isr:
i --> Y+1
key_buf --> R20
010E 940E02A3 CALL push_lset
0110 940E028C CALL push_gset1
(0158) }
(0159) }
(0160)
(0161)
(0162)
(0163)
(0164) ////////////////////////////key interrupt/////////////////////////////////
(0165)
(0166)
(0167)
(0168) #pragma interrupt_handler int0_isr:iv_INT0
(0169)
(0170) void int0_isr(void)
(0171) {
(0172) uchar key_buf=16,i;
0112 E140 LDI R20,0x10
(0173) GICR=0x00; //關閉中斷使能
0113 2422 CLR R2
0114 BE2B OUT 0x3B,R2
(0174) DDRA=0xf0; //行列反轉讀取鍵盤的值
0115 EF80 LDI R24,0xF0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -