annotate code_part1/OSTC_code_asm_part1/altimeter.asm @ 132:49bb155ddfbf

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