📄 ref_node.s51
字号:
FADDRH:
DS 1
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, SendPosition
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, mpmSetAndResumeMacAndCpuPowerMode
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, AddToSleepTimer
LOCFRAME XSTACK, 23, STACK
ARGFRAME XSTACK, 23, STACK
FUNCALL RunRefNode, GetSleepTimer
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();
// 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
LJMP ??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) ) )
??RunRefNode_4:
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOV R0,#?V0 + 4
LCALL ?L_MOV_X
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?UL_GT
JNC ??RunRefNode_5
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOV R0,#?V0 + 4
LCALL ?L_MOV_X
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?UL_GT
JNC ??RunRefNode_5
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
PUSH DPL
CFI CFA_SP SP+-1
PUSH DPH
CFI CFA_SP SP+-2
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOV R0,#?V0 + 4
LCALL ?L_MOV_X
POP DPH
CFI CFA_SP SP+-1
POP DPL
CFI CFA_SP SP+0
MOV R0,#?V0 + 4
LCALL ?UL_GT_X
JNC ??RunRefNode_5
// 185 {
// 186 SendPosition(PC_SHORT);
??RunRefNode_6:
; Setup parameters for call to function SendPosition
MOV R2,#0x34
MOV R3,#0x12
MOV DPTR,#(SendPosition & 0xffff)
MOV A,#((SendPosition >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 187 msgTimerValue = sleepTimerValue;
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOV R0,#?V0 + 0
LCALL ?L_MOV_TO_X
// 188 msgTimerValueNextSend = msgTimerValue + (UINT32)REF_NODE_MSG_INTERVALL;
// 189 msgTimerValueNextSend &= ~0xFF000000;
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
PUSH DPL
CFI CFA_SP SP+-1
PUSH DPH
CFI CFA_SP SP+-2
MOV DPTR,#__Constant_28488
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
POP DPH
CFI CFA_SP SP+-1
POP DPL
CFI CFA_SP SP+0
MOV R0,#?V0 + 0
LCALL ?L_ADD_X
MOV DPTR,#__Constant_ffffff
MOV R0,#?V0 + 0
LCALL ?L_AND_X
// 190 }
// 191
// 192 if(refNodeState == AWAKE_STATE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -