Mercurial > public > mk2
annotate code_part1/OSTC_code_asm_part1/altimeter.asm @ 471:5546da23afab
BUGFIX infinite loop when deco table full.
author | JeanDo |
---|---|
date | Sun, 25 Sep 2011 17:39:44 +0200 |
parents | 6e57b5bb98ce |
children | ab2686087bce |
rev | line source |
---|---|
125 | 1 ;============================================================================= |
2 ; | |
3 ; File altimeter.asm | |
4 ; | |
5 ; Altimeter function prototype. | |
6 ; | |
7 ; This program is free software: you can redistribute it and/or modify | |
8 ; it under the terms of the GNU General Public License as published by | |
9 ; the Free Software Foundation, either version 3 of the License, or | |
10 ; (at your option) any later version. | |
11 ; | |
12 ; This program is distributed in the hope that it will be useful, | |
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 ; GNU General Public License for more details. | |
16 ; | |
17 ; You should have received a copy of the GNU General Public License | |
18 ; along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 ; | |
20 ; Copyright (c) 2010, JD Gascuel. | |
21 ;============================================================================= | |
22 ; HISTORY | |
23 ; 2010-12-15 : [jDG] First prototype with quadratic polynomial ant tp°. | |
24 ; 2010-12-28 : [jDG] Use MPLAB Math and C libraries for FP32 computations. | |
25 ; 2011-01-02 : [jDG] Edit reference pressure by 0.25 mbar. | |
214 | 26 ; 2011-01-31 : [jDG] Better menu: default 1013mbar, and editing by +/- 1mbar. |
27 ; 2011-02-23 : [jDG] Fix restart after sleepmode. | |
125 | 28 ; |
132
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
29 ; Known bug: Simulator reset altitude and reference... |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
30 |
125 | 31 altimeter_calc: |
214 | 32 movlb HIGH(pressureAvg) ; Altimeter data in bank 0. |
125 | 33 |
170 | 34 movlw HIGH(4*.900) ; Is presure ref bigger than 900mbar |
35 cpfsgt pressureRef+1 | |
214 | 36 bra altimeter_reset ; No: Should do a reset now. |
162 | 37 |
38 movlw HIGH(4*.1100) ; Is ref pressure bigger than 1100mbar ? | |
39 cpfsgt pressureRef+1 | |
40 bra altimeter_1 ; No: ok it is valid... | |
41 | |
213
d19445e0cb2f
BUGFIX Altimeter reset when exiting sleep mode (bug#&6).
JeanDo
parents:
199
diff
changeset
|
42 ; Reset calibration value to default. |
170 | 43 altimeter_reset: |
214 | 44 movlb HIGH(pressureAvg) ; Altimeter data in bank 0. |
125 | 45 movlw LOW(4*.1013+1) ; Init see level at 1013,25 mbar. |
46 movwf pressureRef+0 | |
47 movlw HIGH(4*.1013+1) | |
48 movwf pressureRef+1 | |
49 | |
213
d19445e0cb2f
BUGFIX Altimeter reset when exiting sleep mode (bug#&6).
JeanDo
parents:
199
diff
changeset
|
50 ; Restart averaging. Eg. after a sleep, enables to faster restart with correct |
d19445e0cb2f
BUGFIX Altimeter reset when exiting sleep mode (bug#&6).
JeanDo
parents:
199
diff
changeset
|
51 ; values... |
d19445e0cb2f
BUGFIX Altimeter reset when exiting sleep mode (bug#&6).
JeanDo
parents:
199
diff
changeset
|
52 altimeter_restart: |
214 | 53 movlb HIGH(pressureAvg) ; Altimeter data in bank 0. |
125 | 54 clrf pressureSum+0 ; Init averaging area |
55 clrf pressureSum+1 | |
56 clrf pressureCount | |
57 | |
341
2144f19fa1eb
BUGFIX protect against ISR changing pressure/temperature while reading it.
JeanDo
parents:
214
diff
changeset
|
58 SAFE_2BYTE_COPY amb_pressure, pressureAvg ; And init first average. |
125 | 59 |
60 movlw 4 ; And multiply AVG by 16 to be coherent. | |
61 altimeter_reset_1: | |
62 bcf STATUS,C | |
63 rlcf pressureAvg+0 | |
64 rlcf pressureAvg+1 | |
65 decfsz WREG | |
66 bra altimeter_reset_1 | |
132
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
67 |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
68 rcall compute_altitude |
125 | 69 |
70 movlb 1 ; Back to normal bank1. | |
71 return | |
72 | |
73 altimeter_1: | |
74 ;---- Do a bank-safe 16bit summing ----------------------------------- | |
341
2144f19fa1eb
BUGFIX protect against ISR changing pressure/temperature while reading it.
JeanDo
parents:
214
diff
changeset
|
75 SAFE_2BYTE_COPY amb_pressure, lo ; And init first average. |
2144f19fa1eb
BUGFIX protect against ISR changing pressure/temperature while reading it.
JeanDo
parents:
214
diff
changeset
|
76 |
2144f19fa1eb
BUGFIX protect against ISR changing pressure/temperature while reading it.
JeanDo
parents:
214
diff
changeset
|
77 movff lo,WREG |
125 | 78 addwf pressureSum+0,F |
341
2144f19fa1eb
BUGFIX protect against ISR changing pressure/temperature while reading it.
JeanDo
parents:
214
diff
changeset
|
79 movff hi,WREG |
125 | 80 addwfc pressureSum+1,F |
81 | |
82 incf pressureCount ; Increment count too. | |
83 movlw .32 ; Already 32 done ? | |
84 subwf pressureCount,W | |
85 bnz altimeter_4 ; NO: skip update. | |
86 | |
87 ;---- Update altitude every 32 pressure measures -------------------- | |
88 bcf STATUS,C ; Divide by 2, to store pressure x16 | |
89 rrcf pressureSum+1 | |
90 rrcf pressureSum+0 | |
91 | |
92 movff pressureSum+0,pressureAvg+0 | |
93 movff pressureSum+1,pressureAvg+1 | |
94 | |
95 rcall compute_altitude ; Compute from the averaged value... | |
96 | |
97 clrf pressureSum+0 ; And reset sum zone for next averaging. | |
98 clrf pressureSum+1 | |
99 clrf pressureCount | |
100 | |
101 altimeter_4: | |
102 movlb 1 ; make sure to be in normal bank1 | |
103 return | |
104 | |
105 ;---- Display result ------------------------------------------------- | |
106 altimeter_display: | |
107 GETCUSTOM8 .49 ; Check CF#49 | |
108 btfss WREG,0 ; Enabled ? | |
109 return ; NO: return | |
110 | |
111 WIN_TOP .35 ; Custom view drawing zone... | |
112 WIN_LEFT .90 | |
113 WIN_INVERT .0 | |
114 WIN_FONT .0 | |
115 call PLED_standard_color | |
116 | |
445 | 117 STRCPY TXT_ALT5 |
125 | 118 |
119 movff altitude+0,lo ; BANK-SAFE read altitude | |
120 movff altitude+1,hi | |
166 | 121 btfss hi,7 ; Is altitude negativ ? |
122 bra altimeter_2 ; No: just print it | |
125 | 123 |
166 | 124 PUTC '-' ; Yes: print the minus sign |
125 comf hi ; And do a 16bit 2-complement. | |
126 comf lo | |
127 infsnz lo | |
128 incf hi | |
129 | |
130 altimeter_2: | |
125 | 131 bsf leftbind |
132 output_16 | |
133 bcf leftbind | |
134 | |
445 | 135 STRCAT_PRINT TXT_METER5 |
125 | 136 return |
137 | |
138 ;============================================================================= | |
139 ; Compute altitude, using the formula: | |
140 ; H(P) = 18.787 log10(P0/P) (Log base 10) | |
141 | |
142 ;---- Interface the the Mayh library ----------------------------------------- | |
143 extern __AARGB2 ; A float in fA2, fA1, fA0, fAExo | |
144 extern __BARGB2 ; B float in fB2, fB1, fB0, fBExo | |
145 extern FLO1632U ; convert uint16 fA+1 --> fp32 fA | |
146 extern FPD32 ; fp32 divide fA/fB --> fA | |
147 extern FPM32 ; fp32 multiply fA*fB --> fA | |
148 extern INT3216 ; convert fp32 fA --> int16 fA+1 | |
149 #define fA __AARGB2 | |
150 #define fB __BARGB2 | |
151 | |
152 ;---- Interface to the C library --------------------------------------------- | |
153 extern __AARGB3 | |
154 extern log10 ; float32 log(auto float32) | |
155 #define fRet __AARGB3 | |
156 | |
157 compute_altitude: | |
158 ; Setup C-code stack, to enable calling the log() function. | |
159 lfsr FSR1, c_code_data_stack | |
160 lfsr FSR2, c_code_data_stack | |
161 | |
162 ; Convert pressure to float, --> fB | |
163 movff pressureAvg+0, fA+1 | |
164 movff pressureAvg+1, fA+2 | |
165 call FLO1632U ; u16 fA[1:2] --> fp32 fA | |
166 movff fA+0, fB+0 | |
167 movff fA+1, fB+1 | |
168 movff fA+2, fB+2 | |
169 movff fA+3, fB+3 | |
170 | |
171 ; Convert sea-level reference pressure to float, --> fB | |
172 movff pressureRef+0, fA+1 ; Get sea level pressure. | |
173 movff pressureRef+1, fA+2 | |
174 bcf STATUS,C ; Multiply by 4. | |
175 rlcf fA+1 | |
176 rlcf fA+2 | |
177 bcf STATUS,C | |
178 rlcf fA+1 | |
179 rlcf fA+2 | |
180 call FLO1632U ; to float: u16 fA[1:2] --> fp32 fA | |
181 | |
182 ; Divide | |
183 call FPD32 ; fp32 X/Y --> X | |
184 | |
185 ; log10() | |
186 movff fA+0, POSTINC1 ; Push X to stack | |
187 movff fA+1, POSTINC1 | |
188 movff fA+2, POSTINC1 | |
189 movff fA+3, POSTINC1 | |
190 call log10 ; log(P0/P) | |
191 | |
192 movf POSTDEC1,F,ACCESS ; pop argument | |
193 movf POSTDEC1,F,ACCESS | |
194 movf POSTDEC1,F,ACCESS | |
195 movf POSTDEC1,F,ACCESS | |
196 | |
197 ; Move log10(P0/P) to fB | |
198 movff fRet+0,fB+0 ; move result to fB | |
199 movff fRet+1,fB+1 | |
200 movff fRet+2,fB+2 | |
201 movff fRet+3,fB+3 | |
202 | |
203 ; Multiply by scaling factor for meters, and standatd atmosphere. | |
204 movlw LOW(.18787) | |
205 movff WREG, fA+1 | |
206 movlw HIGH(.18787) | |
207 movff WREG, fA+2 | |
208 call FLO1632U ; u16 fA[1:2] --> fp32 fA | |
209 call FPM32 ; altitute --> fp32 fA | |
210 | |
211 ; Convert result to int16 --> altitude. | |
212 call INT3216 ; fp32 fA --> int16 fA+1 | |
213 movff fA+1, altitude+0 | |
214 movff fA+2, altitude+1 | |
215 | |
216 return | |
217 | |
218 ;============================================================================= | |
219 ; Altimeter menu | |
220 ; | |
221 ; Edit reference (where altitude = 0) pressure, while displaying corresponding | |
222 ; altitude. | |
223 ; | |
224 altimeter_menu: | |
132
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
225 movff pressureRef+0,WREG ; Make sure it is initialized... |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
226 movff pressureRef+1,fA |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
227 iorwf fA |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
228 bnz altimeter_menu_1 ; Yes: skip reset... |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
229 rcall altimeter_reset |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
230 |
49bb155ddfbf
Fix altimeter after simulator (zero divide -> 32767m)
JeanDo
parents:
125
diff
changeset
|
231 altimeter_menu_1: |
125 | 232 call PLED_ClearScreen ; Menu header. |
233 call PLED_standard_color | |
234 call PLED_topline_box | |
235 WIN_INVERT .1 ; Init new Wordprocessor | |
174 | 236 DISPLAYTEXTH .288 ; Title bar |
125 | 237 |
170 | 238 movlw 2 ; Start menu on line 2. |
125 | 239 movwf menupos |
240 | |
241 altimeter_menu_2: | |
174 | 242 WIN_INVERT 0 |
243 WIN_FONT 0 | |
125 | 244 WIN_LEFT .20 ; First line: |
245 WIN_TOP .35 | |
174 | 246 lfsr FSR2,letter |
247 OUTPUTTEXTH .289 ; Sea ref: | |
125 | 248 |
249 movff pressureRef+0, lo | |
250 movff pressureRef+1, hi | |
251 bcf STATUS,C ; Divide ref pressure by 4 | |
252 rrcf hi ; to get the integer part of it: | |
253 rrcf lo | |
254 bcf STATUS,C | |
255 rrcf hi | |
256 rrcf lo | |
257 bsf leftbind | |
258 output_16 | |
259 | |
445 | 260 STRCAT_PRINT TXT_MBAR7 |
125 | 261 |
170 | 262 WIN_TOP .65 ; Action enable |
174 | 263 lfsr FSR2, letter |
264 OUTPUTTEXTH .290 | |
125 | 265 GETCUSTOM8 .49 |
266 btfss WREG,0 | |
267 bra alt_menu_1 | |
199 | 268 OUTPUTTEXT .130 ; ON |
125 | 269 bra alt_menu_2 |
270 alt_menu_1: | |
199 | 271 OUTPUTTEXT .131 ; OFF |
125 | 272 alt_menu_2: |
199 | 273 call word_processor |
125 | 274 |
174 | 275 DISPLAYTEXTH .291 ; Action reset |
276 DISPLAYTEXTH .292 ; Action add | |
277 DISPLAYTEXTH .293 ; Action sub | |
278 DISPLAYTEXT .011 ; Action exit | |
125 | 279 |
174 | 280 WIN_LEFT .85 ; Bottom right. |
281 lfsr FSR2, letter | |
282 OUTPUTTEXTH .294 ; "Alt: " | |
283 | |
170 | 284 movff altitude+0, lo |
285 movff altitude+1, hi | |
286 btfss hi,7 ; Is altitude negativ ? | |
287 bra altimeter_menu_3 ; No: just print it | |
288 | |
289 PUTC '-' ; Yes: print the minus sign | |
290 comf hi ; And do a 16bit 2-complement. | |
291 comf lo | |
292 infsnz lo | |
293 incf hi | |
294 | |
295 altimeter_menu_3: | |
296 bsf leftbind | |
297 output_16 | |
298 bcf leftbind | |
445 | 299 STRCAT_PRINT TXT_METER5 |
170 | 300 |
125 | 301 alt_menu_loop: |
302 call PLED_menu_cursor ; Display cursor | |
303 bcf switch_left ; reset buttons state | |
304 bcf switch_right | |
305 | |
306 alt_menu_loop1: ; Wait for button. | |
337 | 307 btfsc uart_dump_screen ; Asked to dump screen contains ? |
308 call dump_screen ; Yes! | |
309 | |
125 | 310 btfsc switch_right ; [[MENU]] button |
311 bra alt_menu_next | |
312 | |
313 btfsc switch_left ;[[ENTER]] button | |
314 bra alt_menu_do_it | |
315 | |
316 btfsc divemode ; Diving stared ? | |
317 goto restart ; YES: quit this menu ! | |
318 | |
319 btfsc onesecupdate ; Check what should be every 1sec. | |
320 call timeout_surfmode | |
321 | |
322 btfsc onesecupdate | |
323 call set_dive_modes | |
324 | |
325 bcf onesecupdate ; end of 1sek. tasks | |
326 | |
327 btfsc sleepmode ; Sleep mode entered ? | |
328 bra alt_menu_exit | |
329 | |
330 bra alt_menu_loop1 | |
331 | |
332 ;---- Move to next line ------------------------------------------------------ | |
333 | |
334 alt_menu_next: | |
335 incf menupos ; next line. | |
336 movlw .7 | |
337 cpfseq menupos ; Below last line ? | |
338 bra alt_menu_loop | |
170 | 339 movlw .2 ; Yes: back to line no 2. |
125 | 340 movwf menupos |
341 bra alt_menu_loop | |
342 | |
343 ;----- Execute menu line ----------------------------------------------------- | |
344 | |
345 alt_menu_do_it: | |
346 movf menupos,W ; test line value | |
170 | 347 addlw -2 |
348 bz alt_menu_enable ; 2 --> reset | |
349 dcfsnz WREG | |
350 bra alt_menu_reset ; 3 --> +1 | |
125 | 351 dcfsnz WREG |
352 bra alt_menu_plus1 ; 4 --> +1 | |
353 dcfsnz WREG | |
354 bra alt_menu_minus1 ; 5 --> -1 | |
355 bra alt_menu_exit ; else --> exit | |
356 | |
357 ;---- Toggle altimeter (CF#49) ----------------------------------------------- | |
358 alt_menu_enable: | |
359 GETCUSTOM8 .49 ; Read CF#49 | |
360 btg WREG,0 ; Toggle boolean value | |
361 movwf EEDATA | |
362 movlw d'1' ; Upper EEPROM Bank | |
363 movwf EEADRH | |
364 movlw 4*(.49-.32) + 0x82 ; CF#49 low byte address in EEPROM | |
365 movwf EEADR | |
366 call write_eeprom | |
384
904863f96582
Work-Around for "Reset all" overwriting 0x00 to 0x04 in EEPROM Bank1
heinrichsweikamp
parents:
344
diff
changeset
|
367 clrf EEADRH ; Reset EEADRH for compatibility |
125 | 368 bra altimeter_menu_2 |
369 | |
170 | 370 ;---- Reset sea level pressure to reference ---------------------------------- |
371 alt_menu_reset: | |
372 rcall altimeter_reset | |
373 bra altimeter_menu_2 | |
374 | |
125 | 375 ;---- Increment sea level pressure ------------------------------------------- |
376 alt_menu_plus1: | |
377 movlb HIGH(pressureRef) ; Setup our own ram bank | |
170 | 378 movlw 4 |
379 addwf pressureRef+0,F ; 16bit inc. | |
380 movlw 0 | |
381 addwfc pressureRef+1,F | |
125 | 382 bra alt_menu_recompute ; then recompute altitude. |
383 | |
384 ;---- Decrement sea level pressure ------------------------------------------- | |
385 alt_menu_minus1: | |
386 movlb HIGH(pressureRef) ; Setup our own ram bank | |
170 | 387 movlw -4 |
388 addwf pressureRef+0,F ; 16bit decrement | |
389 movlw -1 | |
390 addwfc pressureRef+1,F | |
125 | 391 |
392 alt_menu_recompute: | |
393 rcall compute_altitude ; Recompute altitude | |
394 movlb 1 ; Go back to normal bank1 | |
395 bra altimeter_menu_2 | |
396 | |
397 ;---- Exit altimeter menu ---------------------------------------------------- | |
398 alt_menu_exit: | |
399 movlw .5 ; reset position to Altimeter line. | |
400 movwf menupos ; | |
401 goto more_menu2 ; in the More... menu. |