📄 adc.lst
字号:
1 .file "adc.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
90 ADCHPLInitPortmap:
1:adc.c **** /*
2:adc.c **** ****************************************************************************
3:adc.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
4:adc.c **** * http:\\www.nbicc.com
5:adc.c **** *文件名: adc.c
6:adc.c **** *程序员: 夏鹏 xpsonny@nbicc.com
7:adc.c **** *主要内容:adc驱动相关
8:adc.c **** *
9:adc.c **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
10:adc.c **** ****************************************************************************
11:adc.c **** */
12:adc.c ****
13:adc.c **** #include "adc.h"
14:adc.c **** #include "os.h"
15:adc.c **** #include "radiocontrol.h"
16:adc.c **** #include "sensor.h"
17:adc.c **** static result_t ADCDataReady(uint8_t port, uint16_t value); // 加入对应port的数据接收处理调用
18:adc.c ****
19:adc.c **** static result_t ADCHPLDataReady(uint16_t data);
20:adc.c **** static result_t ADCStartGet(uint8_t newState, uint8_t port);
21:adc.c **** static void ADCHPLInitPortmap(void);
22:adc.c **** static result_t ADCHPLInit(void);
23:adc.c **** static result_t ADCHPLSamplePort(uint8_t port);
24:adc.c **** static uint16_t ADCM_ReqPort;
25:adc.c **** static uint16_t ADCM_ReqVector;
26:adc.c **** static uint16_t ADCM_ContReqMask;
27:adc.c **** static bool HPLADCM_init_portmap_done;
28:adc.c **** static uint8_t adcPortmap[OSH_ADC_PORTMAPSIZE];
29:adc.c ****
30:adc.c ****
31:adc.c **** result_t ADCHPLInit(void)
32:adc.c **** {
33:adc.c **** ADCHPLInitPortmap();
34:adc.c ****
35:adc.c **** { uint8_t atomicState = AtomicStart();
36:adc.c **** {
37:adc.c **** * (volatile unsigned char *)(0x06 + 0x20) = (1 << 3) | (6 << 0);
38:adc.c ****
39:adc.c **** * (volatile unsigned char *)(0x07 + 0x20) = 0;
40:adc.c **** }
41:adc.c **** AtomicEnd(atomicState); }
42:adc.c **** return SUCCESS;
43:adc.c **** }
44:adc.c ****
45:adc.c **** result_t ADCControlInit(void)
46:adc.c **** {
47:adc.c **** { uint8_t atomicState = AtomicStart();
48:adc.c **** {
49:adc.c **** ADCM_ReqPort = 0;
50:adc.c **** ADCM_ReqVector = ADCM_ContReqMask = 0;
51:adc.c **** }
52:adc.c **** AtomicEnd(atomicState); }
53:adc.c ****
54:adc.c **** return ADCHPLInit();
55:adc.c **** }
56:adc.c ****
57:adc.c **** result_t ADCBindPort(uint8_t port, uint8_t adcPort)
58:adc.c **** {
59:adc.c **** if (
60:adc.c **** port < OSH_ADC_PORTMAPSIZE &&
61:adc.c **** port != OS_ADC_BANDGAP_PORT &&
62:adc.c **** port != OS_ADC_GND_PORT) {
63:adc.c **** ADCHPLInitPortmap();
64:adc.c **** { uint8_t atomicState = AtomicStart();
65:adc.c **** adcPortmap[port] = adcPort;
66:adc.c **** AtomicEnd(atomicState); }
67:adc.c **** return SUCCESS;
68:adc.c **** }
69:adc.c **** else {
70:adc.c **** return FAIL;
71:adc.c **** }
72:adc.c **** }
73:adc.c ****
74:adc.c **** static result_t ADCDataReady(uint8_t port, uint16_t value){
75:adc.c **** unsigned char result;
76:adc.c ****
77:adc.c **** switch (port) {
78:adc.c ****
79:adc.c **** case OS_ADC_CC_RSSI_PORT:
80:adc.c **** result = RadiocontrolRSSIADCDataReady(value);
81:adc.c **** break;
82:adc.c ****
83:adc.c **** case OS_ADC_PHOTO_PORT:
84:adc.c **** result = SensorInternalPhotoADCDataReady(value);
85:adc.c **** break;
86:adc.c ****
87:adc.c **** case OS_ADC_TEMP_PORT:
88:adc.c **** result = SensorInternalTempADCDataReady(value);
89:adc.c **** break;
90:adc.c ****
91:adc.c **** default:
92:adc.c **** result = 0;
93:adc.c **** }
94:adc.c ****
95:adc.c **** return result;
96:adc.c **** }
97:adc.c ****
98:adc.c **** static result_t ADCHPLDataReady(uint16_t data)
99:adc.c **** {
100:adc.c **** uint16_t doneValue = data;
101:adc.c **** uint8_t donePort;
102:adc.c **** result_t Result;
103:adc.c ****
104:adc.c ****
105:adc.c **** { uint8_t atomicState = AtomicStart();
106:adc.c **** {
107:adc.c **** donePort = ADCM_ReqPort;
108:adc.c ****
109:adc.c **** if (((1 << donePort) & ADCM_ContReqMask) == 0) {
110:adc.c **** ADCM_ReqVector &= ~(1 << donePort);
111:adc.c **** }
112:adc.c ****
113:adc.c **** if (ADCM_ReqVector) {
114:adc.c **** do {
115:adc.c **** ADCM_ReqPort++;
116:adc.c **** ADCM_ReqPort = ADCM_ReqPort == OSH_ADC_PORTMAPSIZE ? 0 : ADCM_ReqPort;
117:adc.c **** }
118:adc.c **** while (((
119:adc.c **** 1 << ADCM_ReqPort) & ADCM_ReqVector) == 0);
120:adc.c **** ADCHPLSamplePort(ADCM_ReqPort);
121:adc.c **** }
122:adc.c **** }
123:adc.c **** AtomicEnd(atomicState); }
124:adc.c ****
125:adc.c ****
126:adc.c **** Result = ADCDataReady(donePort, doneValue);
127:adc.c ****
128:adc.c **** { uint8_t atomicState = AtomicStart();
129:adc.c **** {
130:adc.c **** if (Result == FAIL && ADCM_ContReqMask & (1 << donePort)) {
131:adc.c **** ADCM_ContReqMask &= ~(1 << donePort);
132:adc.c **** }
133:adc.c **** }
134:adc.c **** AtomicEnd(atomicState); }
135:adc.c ****
136:adc.c **** return SUCCESS;
137:adc.c **** }
138:adc.c ****
139:adc.c **** static result_t ADCStartGet(uint8_t newState, uint8_t port)
140:adc.c **** {
141:adc.c **** uint16_t PortMask;
142:adc.c **** uint16_t oldReqVector;
143:adc.c **** result_t Result = SUCCESS;
144:adc.c ****
145:adc.c **** if (port > OSH_ADC_PORTMAPSIZE) {
146:adc.c **** return FAIL;
147:adc.c **** }
148:adc.c ****
149:adc.c **** PortMask = 1 << port;
150:adc.c ****
151:adc.c **** { uint8_t atomicState = AtomicStart();
152:adc.c **** {
153:adc.c **** if ((PortMask & ADCM_ReqVector) != 0) {
154:adc.c ****
155:adc.c **** Result = FAIL;
156:adc.c **** }
157:adc.c **** else {
158:adc.c **** oldReqVector = ADCM_ReqVector;
159:adc.c **** ADCM_ReqVector |= PortMask;
160:adc.c **** if (newState == ADCM_CONTINUOUS_CONVERSION) {
161:adc.c **** ADCM_ContReqMask |= PortMask;
162:adc.c **** }
163:adc.c **** if (oldReqVector == 0) {
164:adc.c ****
165:adc.c **** ADCM_ReqPort = port;
166:adc.c **** Result = ADCHPLSamplePort(port);
167:adc.c **** }
168:adc.c **** }
169:adc.c **** }
170:adc.c **** AtomicEnd(atomicState); }
171:adc.c ****
172:adc.c ****
173:adc.c **** return Result;
174:adc.c **** }
175:adc.c ****
176:adc.c **** result_t ADCGetData(uint8_t port)
177:adc.c **** {
178:adc.c **** return ADCStartGet(ADCM_SINGLE_CONVERSION, port);
179:adc.c **** }
180:adc.c ****
181:adc.c **** void ADCHPLInitPortmap(void)
182:adc.c **** {
92 .LM1:
93 /* prologue: frame size=0 */
94 /* prologue end (size=0) */
95 .LBB2:
183:adc.c ****
184:adc.c **** { uint8_t atomicState = AtomicStart();
97 .LM2:
98 0000 0E94 0000 call AtomicStart
99 0004 282F mov r18,r24
185:adc.c **** {
186:adc.c **** if (HPLADCM_init_portmap_done == FALSE) {
101 .LM3:
102 0006 8091 0000 lds r24,HPLADCM_init_portmap_done
103 000a 8823 tst r24
104 000c 91F4 brne .L2
105 .LBB3:
187:adc.c **** int i;
188:adc.c ****
189:adc.c **** for (i = 0; i < OSH_ADC_PORTMAPSIZE; i++)
107 .LM4:
108 000e 80E0 ldi r24,lo8(0)
109 0010 90E0 ldi r25,hi8(0)
110 0012 E0E0 ldi r30,lo8(adcPortmap)
111 0014 F0E0 ldi r31,hi8(adcPortmap)
112 .L6:
190:adc.c **** adcPortmap[i] = i;
114 .LM5:
115 0016 8193 st Z+,r24
117 .LM6:
118 0018 0196 adiw r24,1
119 001a 8C30 cpi r24,12
120 001c 9105 cpc r25,__zero_reg__
121 001e DCF3 brlt .L6
191:adc.c ****
192:adc.c ****
193:adc.c **** adcPortmap[OS_ADC_BANDGAP_PORT] = OSH_ACTUAL_BANDGAP_PORT;
123 .LM7:
124 0020 8EE1 ldi r24,lo8(30)
125 0022 8093 0000 sts adcPortmap+10,r24
194:adc.c **** adcPortmap[OS_ADC_GND_PORT] = OSH_ACTUAL_GND_PORT;
127 .LM8:
128 0026 8FE1 ldi r24,lo8(31)
129 0028 8093 0000 sts adcPortmap+11,r24
195:adc.c **** HPLADCM_init_portmap_done = TRUE;
131 .LM9:
132 002c 81E0 ldi r24,lo8(1)
133 002e 8093 0000 sts HPLADCM_init_portmap_done,r24
134 .L2:
135 .LBE3:
196:adc.c **** }
197:adc.c **** }
198:adc.c **** AtomicEnd(atomicState); }
137 .LM10:
138 0032 822F mov r24,r18
139 0034 0E94 0000 call AtomicEnd
140 .LBE2:
141 /* epilogue: frame size=0 */
142 0038 0895 ret
143 /* epilogue end (size=1) */
144 /* function ADCHPLInitPortmap size 29 (28) */
153 .global ADCControlInit
155 ADCControlInit:
157 .LM11:
158 /* prologue: frame size=0 */
159 /* prologue end (size=0) */
160 .LBB4:
162 .LM12:
163 003a 0E94 0000 call AtomicStart
165 .LM13:
166 003e 1092 0000 sts (ADCM_ReqPort)+1,__zero_reg__
167 0042 1092 0000 sts ADCM_ReqPort,__zero_reg__
169 .LM14:
170 0046 1092 0000 sts (ADCM_ContReqMask)+1,__zero_reg__
171 004a 1092 0000 sts ADCM_ContReqMask,__zero_reg__
172 004e 1092 0000 sts (ADCM_ReqVector)+1,__zero_reg__
173 0052 1092 0000 sts ADCM_ReqVector,__zero_reg__
175 .LM15:
176 0056 0E94 0000 call AtomicEnd
177 .LBE4:
178 .LBB5:
179 .LBB6:
181 .LM16:
182 005a 0E94 0000 call ADCHPLInitPortmap
183 .LBB7:
185 .LM17:
186 005e 0E94 0000 call AtomicStart
188 .LM18:
189 0062 9EE0 ldi r25,lo8(14)
190 0064 96B9 out 38-0x20,r25
192 .LM19:
193 0066 17B8 out 39-0x20,__zero_reg__
195 .LM20:
196 0068 0E94 0000 call AtomicEnd
197 .LBE7:
198 .LBE6:
199 .LBE5:
201 .LM21:
202 006c 81E0 ldi r24,lo8(1)
203 006e 90E0 ldi r25,hi8(1)
204 /* epilogue: frame size=0 */
205 0070 0895 ret
206 /* epilogue end (size=1) */
207 /* function ADCControlInit size 28 (27) */
212 .global ADCBindPort
214 ADCBindPort:
216 .LM22:
217 /* prologue: frame size=0 */
218 0072 1F93 push r17
219 0074 CF93 push r28
220 /* prologue end (size=2) */
221 0076 C82F mov r28,r24
222 0078 162F mov r17,r22
224 .LM23:
225 007a 8C30 cpi r24,lo8(12)
226 007c 90F4 brsh .L12
228 .LM24:
229 007e 8A30 cpi r24,lo8(10)
230 0080 81F0 breq .L12
231 0082 8B30 cpi r24,lo8(11)
232 0084 71F0 breq .L12
234 .LM25:
235 0086 0E94 0000 call ADCHPLInitPortmap
236 .LBB8:
238 .LM26:
239 008a 0E94 0000 call AtomicStart
241 .LM27:
242 008e EC2F mov r30,r28
243 0090 FF27 clr r31
244 0092 E050 subi r30,lo8(-(adcPortmap))
245 0094 F040 sbci r31,hi8(-(adcPortmap))
246 0096 1083 st Z,r17
248 .LM28:
249 0098 0E94 0000 call AtomicEnd
250 .LBE8:
252 .LM29:
253 009c 81E0 ldi r24,lo8(1)
254 009e 90E0 ldi r25,hi8(1)
255 00a0 02C0 rjmp .L11
256 .L12:
258 .LM30:
259 00a2 80E0 ldi r24,lo8(0)
260 00a4 90E0 ldi r25,hi8(0)
261 .L11:
262 /* epilogue: frame size=0 */
263 00a6 CF91 pop r28
264 00a8 1F91 pop r17
265 00aa 0895 ret
266 /* epilogue end (size=3) */
267 /* function ADCBindPort size 29 (24) */
272 ADCHPLSamplePort:
199:adc.c **** }
200:adc.c ****
201:adc.c **** void __attribute((signal)) __vector_21(void)
202:adc.c **** {
203:adc.c **** uint16_t data = * (volatile unsigned int *)(unsigned int )& * (volatile unsigned char *)(0x04 + 0x
204:adc.c ****
205:adc.c **** data &= 0x3ff;
206:adc.c **** * (volatile unsigned char *)(0x06 + 0x20) |= 1 << 4;
207:adc.c **** * (volatile unsigned char *)(0x06 + 0x20) &= ~(1 << 7);
208:adc.c **** EnableInterrupt();
209:adc.c **** ADCHPLDataReady(data);
210:adc.c **** }
211:adc.c ****
212:adc.c **** static result_t ADCHPLSamplePort(uint8_t port)
213:adc.c **** {
274 .LM31:
275 /* prologue: frame size=0 */
276 00ac 1F93 push r17
277 /* prologue end (size=1) */
278 00ae 182F mov r17,r24
279 .LBB9:
214:adc.c **** { uint8_t atomicState = AtomicStart();
281 .LM32:
282 00b0 0E94 0000 call AtomicStart
215:adc.c **** {
216:adc.c **** * (volatile unsigned char *)(0x07 + 0x20) = adcPortmap[port] & 0x1F;
284 .LM33:
285 00b4 E0E0 ldi r30,lo8(adcPortmap)
286 00b6 F0E0 ldi r31,hi8(adcPortmap)
287 00b8 E10F add r30,r17
288 00ba F11D adc r31,__zero_reg__
289 00bc 9081 ld r25,Z
290 00be 9F71 andi r25,lo8(31)
291 00c0 97B9 out 39-0x20,r25
217:adc.c **** }
218:adc.c **** AtomicEnd(atomicState); }
293 .LM34:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -