📄 ref_node.s51
字号:
ASEGN SFR_AN:DATA:NOROOT,0aeH
// unsigned char volatile __sfr FCTL
FCTL:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0c6H
// unsigned char volatile __sfr CLKCON
CLKCON:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0c7H
// unsigned char volatile __sfr MEMCTR
MEMCTR:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0c9H
// unsigned char volatile __sfr WDCTL
WDCTL:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0d1H
// unsigned char volatile __sfr DMAIRQ
DMAIRQ:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0d4H
// unsigned char volatile __sfr DMA0CFGL
DMA0CFGL:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0d5H
// unsigned char volatile __sfr DMA0CFGH
DMA0CFGH:
DS 1
ASEGN SFR_AN:DATA:NOROOT,0d6H
// unsigned char volatile __sfr DMAARM
DMAARM:
DS 1
// 45 #include "node.h"
// 46
// 47 // flags
// 48 extern BOOL msgReceived;
// 49
// 50 // node parameters
// 51 extern MSG_BUFFER buffer;
// 52 extern UINT16_2 x;
// 53 extern UINT16_2 y;
// 54 extern UINT8 z;
// 55 extern BOOL parametersReceived;
// 56 extern BOOL blinkLed;
// 57 extern UINT8 ledBlinkCounter;
// 58
// 59 // Flash storing
// 60 #define XYZ_FLASH_ADDRESS 0xF000
// 61 #define PAGE_NUMBER ((XYZ_FLASH_ADDRESS >> 11) + 32)
// 62 #define XYZ_BANK 3
// 63 #define FLASH_PAGE_SIZE 2048
// 64 #define NUMBER_OF_FLASH_ENTRIES (FLASH_PAGE_SIZE / sizeof(FLASH_ENTRY))
// 65 #define SET_MEMORY_BANK(bank) do{ MEMCTR = (MEMCTR & ~0x30) | (bank << 4); } while(0)
// 66
// 67
// 68 // Reference node states
// 69 enum {
// 70 AWAKE_STATE,
// 71 SLEEP_STATE,
// 72 BLINK_LED_STATE
RSEG XDATA_Z:XDATA:NOROOT(0)
REQUIRE __INIT_XDATA_Z
// 73 } refNodeState;
refNodeState:
DS 1
// 74
// 75
// 76 // Flash storage struct
// 77 typedef struct{
// 78 BYTE status[3];
// 79 struct{
// 80 UINT16_2 x;
// 81 UINT16_2 y;
// 82 UINT8 z;
// 83 }xyz_coordinates;
// 84 }FLASH_ENTRY;
// 85
// 86 // Pointers, arrays, variables
RSEG XDATA_Z:XDATA:NOROOT(0)
REQUIRE __INIT_XDATA_Z
// 87 FLASH_ENTRY __code* pFlashEntry;
pFlashEntry:
DS 2
RSEG XDATA_Z:XDATA:NOROOT(0)
REQUIRE __INIT_XDATA_Z
// 88 FLASH_ENTRY flashEntries[2];
flashEntries:
DS 16
RSEG XDATA_Z:XDATA:NOROOT(0)
REQUIRE __INIT_XDATA_Z
// 89 volatile DMA_DESC dmaChannel;
dmaChannel:
DS 8
RSEG PM0_XDATA:XDATA:REORDER:NOROOT(0)
// 90 __no_init BYTE pRamBuffer[10] @ "PM0_XDATA";
pRamBuffer:
DS 10
// 91
// 92
// 93 /******************************************************************************
// 94 *
// 95 * This function is the main loop for Reference Node
// 96 ******************************************************************************/
RSEG NEAR_CODE:CODE:NOROOT(0)
// 97 __near_func void RunRefNode(BOOL resetCoordinates){
RunRefNode:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function RunRefNode
FUNCALL RunRefNode, SendText
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, setUpDmaToFlash
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, getCoordinates
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, AddToSleepTimer
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, PrintXY
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, SendPosition
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, AddToSleepTimer
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, SendPosition
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, storeCoordinates
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, PrintXY
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, AddToSleepTimer
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, GetSleepTimer
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, SendPosition
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, mpmSetAndResumeMacAndCpuPowerMode
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
MOV A,#-0xf
LCALL ?FUNC_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-15)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 15)
; Saved register size: 15
; Auto size: 8
MOV A,#-0x8
LCALL ?ALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 23)
MOV A,R1
MOV R6,A
// 98 BYTE packetType;
// 99 UINT32 msgTimerValue, msgTimerValueNextSend, sleepTimerValue;
// 100
// 101 SendText("RefNode Powerup");
; Setup parameters for call to function SendText
MOV R2,#(`?<Constant "RefNode Powerup">` & 0xff)
MOV R3,#((`?<Constant "RefNode Powerup">` >> 8) & 0xff)
MOV DPTR,#(SendText & 0xffff)
MOV A,#((SendText >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 102
// 103 setUpDmaToFlash();
; Setup parameters for call to function setUpDmaToFlash
LCALL setUpDmaToFlash
// 104
// 105 if(resetCoordinates){
MOV A,R6
JZ ??RunRefNode_0
// 106 x = y = UNINITIALIZED_XY_VALUE;
??RunRefNode_1:
MOV DPTR,#y
MOV A,#-0x1
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
MOV DPTR,#x
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
// 107 z = UNINITIALIZED_Z_VALUE;
MOV DPTR,#z
MOVX @DPTR,A
SJMP ??RunRefNode_2
// 108 }
// 109 else{
// 110 if( !getCoordinates() )
??RunRefNode_0:
; Setup parameters for call to function getCoordinates
LCALL getCoordinates
MOV A,R1
JZ ??RunRefNode_1
// 111 {
// 112 x = y = UNINITIALIZED_XY_VALUE;
// 113 z = UNINITIALIZED_Z_VALUE;
// 114 }
// 115 }
// 116
// 117 // Setting up to sleep at the appropriate time
// 118 refNodeState = AWAKE_STATE;
??RunRefNode_2:
CLR A
MOV DPTR,#refNodeState
MOVX @DPTR,A
// 119 AddToSleepTimer(REF_NODE_POWER_UP_TIME);
; Setup parameters for call to function AddToSleepTimer
MOV R2,#-0x6
MOV R3,A
MOV DPTR,#(AddToSleepTimer & 0xffff)
MOV A,#((AddToSleepTimer >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 120 INT_SETFLAG(INUM_ST, INT_CLR);
CLR 0xc0.7
// 121 INT_ENABLE(INUM_ST, INT_ON);
SETB 0xa8.5
// 122 msgTimerValueNextSend = 0;
MOV DPTR,#__Constant_0
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
// 123
// 124 #ifdef CC2430EB
// 125 PrintXY();
; Setup parameters for call to function PrintXY
MOV DPTR,#(PrintXY & 0xffff)
MOV A,#((PrintXY >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 126 #endif
// 127
// 128 SET_BUFFER_EMPTY();
CLR A
MOV DPTR,#buffer
MOVX @DPTR,A
// 129
// 130 WDT_SET_TIMEOUT_PERIOD(SEC_1);
ANL 0xc9,#0xfc
MOV A,0xc9
MOV 0xc9,0xc9
// 131 WDT_ENABLE();
ORL 0xc9,#0x8
SJMP ??RunRefNode_3
// 132
// 133 while(TRUE) {
// 134 WDT_RESET();
// 135
// 136 if (msgReceived){
// 137 msgReceived = FALSE;
// 138 packetType = buffer.b.pMsdu[PACKET_INDEX_TYPE];
// 139
// 140 if (packetType == PACKET_TYPE_BLIND_NODE_REQ_SIGNAL){
// 141 if( x != UNINITIALIZED_XY_VALUE || y != UNINITIALIZED_XY_VALUE)
// 142 {
// 143 #ifdef USE_LED
// 144 LED1 = LED_ON;
// 145 #endif
// 146 SendPosition(buffer.b.srcAddr.Short);
// 147 #ifdef USE_LED
// 148 LED1 = LED_OFF;
// 149 #endif
// 150 // Avoiding to be in Power Down next time a packet is for me by increasing awake time
// 151 AddToSleepTimer(REF_NODE_EXTENSION_UP_TIME);
// 152 }
// 153 }
// 154 SET_BUFFER_EMPTY();
// 155 }
// 156
// 157 // Check if xyz coordinates are to be written to FLASH
// 158 if(parametersReceived){
// 159 INT_ENABLE(INUM_ST, INT_OFF);
// 160 parametersReceived = FALSE;
// 161 SendPosition(PC_SHORT);
// 162
// 163 storeCoordinates();
// 164 #ifdef CC2430EB
// 165 PrintXY();
// 166 #endif
// 167 INT_SETFLAG(INUM_ST, INT_CLR);
// 168 INT_ENABLE(INUM_ST, INT_ON);
// 169 AddToSleepTimer(REF_NODE_EXTENSION_UP_TIME);
// 170 }
// 171
// 172 // Check if a blink led message is received
// 173 if (blinkLed){
// 174 blinkLed = FALSE;
// 175 LED1 = LED_ON;
// 176 ledBlinkCounter = 0;
// 177 refNodeState = BLINK_LED_STATE;
// 178 }
// 179
// 180 // Check if the node should send a message to PC
// 181 GetSleepTimer(&sleepTimerValue);
// 182 if( ( (msgTimerValue < msgTimerValueNextSend) && (sleepTimerValue > msgTimerValueNextSend) ) ||
// 183 ( (msgTimerValue < msgTimerValueNextSend) && (sleepTimerValue < msgTimerValue ) ) ||
// 184 ( (msgTimerValueNextSend < msgTimerValue) && (sleepTimerValue > msgTimerValueNextSend) && (sleepTimerValue < msgTimerValue) ) )
// 185 {
// 186 SendPosition(PC_SHORT);
// 187 msgTimerValue = sleepTimerValue;
// 188 msgTimerValueNextSend = msgTimerValue + (UINT32)REF_NODE_MSG_INTERVALL;
// 189 msgTimerValueNextSend &= ~0xFF000000;
// 190 }
// 191
// 192 if(refNodeState == AWAKE_STATE)
// 193 {
// 194 #if defined CC2430EB && defined USE_LED
// 195 LED3 = LED_ON;
??RunRefNode_4:
CLR 0x90.3
// 196 #elif defined CC2430DB && defined USE_LED
// 197 LED2 = LED_ON;
// 198 #endif
// 199 }
??RunRefNode_3:
MOV A,#0xf
ANL A,0xc9
ORL A,#0xa0
MOV 0xc9,A
MOV A,#0xf
ANL A,0xc9
ORL A,#0x50
MOV 0xc9,A
MOV DPTR,#msgReceived
MOVX A,@DPTR
JZ ??RunRefNode_5
CLR A
MOVX @DPTR,A
MOV DPTR,#(buffer + 27)
MOVX A,@DPTR
XRL A,#0x11
JNZ ??RunRefNode_6
MOV DPTR,#x
MOVX A,@DPTR
XRL A,#0xff
JNZ ??RunRefNode_7
INC DPTR
MOVX A,@DPTR
XRL A,#0xff
??RunRefNode_7:
JNZ ??RunRefNode_8
MOV DPTR,#y
MOVX A,@DPTR
XRL A,#0xff
JNZ ??RunRefNode_9
INC DPTR
MOVX A,@DPTR
XRL A,#0xff
??RunRefNode_9:
JZ ??RunRefNode_6
??RunRefNode_8:
CLR 0x90.0
; Setup parameters for call to function SendPosition
MOV DPTR,#(buffer + 4)
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPTR,#(SendPosition & 0xffff)
MOV A,#((SendPosition >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
SETB 0x90.0
; Setup parameters for call to function AddToSleepTimer
MOV R2,#-0x12
MOV R3,#0x2
MOV DPTR,#(AddToSleepTimer & 0xffff)
MOV A,#((AddToSleepTimer >> 16) & 0xff)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -