0
|
1 ; OSTC - diving computer code
|
|
2 ; Copyright (C) 2008 HeinrichsWeikamp GbR
|
|
3 ; This program is free software: you can redistribute it and/or modify
|
|
4 ; it under the terms of the GNU General Public License as published by
|
|
5 ; the Free Software Foundation, either version 3 of the License, or
|
|
6 ; (at your option) any later version.
|
|
7 ; This program is distributed in the hope that it will be useful,
|
|
8 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10 ; GNU General Public License for more details.
|
|
11 ; You should have received a copy of the GNU General Public License
|
|
12 ; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
13 ; Routines for sleepmode
|
|
14 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com
|
|
15 ; written: 050520
|
|
16 ; last updated: 090507
|
|
17 ; known bugs:
|
|
18 ; ToDo:
|
|
19 sleeploop: ; enter sleepmode!
|
|
20 ; first check if the 16 hash char are=0
|
|
21 lfsr FSR2, char_O_hash
|
|
22 movlw d'16'
|
|
23 movwf temp1
|
|
24 sleeploop1:
|
|
25 tstfsz POSTINC2 ; Test hash values
|
|
26 bra sleeploop2 ; At least one char is not zero -> Do not build hash
|
|
27 decfsz temp1,F
|
|
28 bra sleeploop1
|
|
29 ; build hash (about 90sek @ 16MHz)
|
|
30 call PLED_ClearScreen ; clear
|
|
31 DISPLAYTEXT .1 ; "Building MD2 hash"
|
|
32 DISPLAYTEXT .2 ; "Please wait..."
|
|
33 call deco_main_hash ; calculate MD2 hash
|
|
34 movlb b'00000001' ; Back to Bank1
|
|
35 sleeploop2:
|
|
36 call PLED_DisplayOff ; display off
|
|
37 call disable_rs232 ; disable UART module
|
|
38 clrf divemins+0
|
|
39 clrf divemins+1
|
|
40 bcf TRISB,6
|
|
41 bcf TRISB,7
|
|
42 bcf PORTB,6
|
|
43 bcf PORTB,7 ; Disable UART
|
|
44 sleeploop_loop:
|
|
45 btfsc oneminupdate ; one minute in sleep?
|
|
46 rcall onemin_sleep ; do oneminute tasks, e.g. calculate desaturation
|
|
47
|
|
48 btfsc onesecupdate ; one second in sleep?
|
|
49 rcall onesec_sleep ; check switches, check pressure sensor, etc.
|
|
50
|
|
51 btfss sleepmode ; wake up? (This bit will be set in other routines)
|
|
52 goto restart ; yes
|
|
53 nop
|
|
54 sleep ; Sleep until Timer1 will wake up the device
|
|
55 nop
|
|
56 bra sleeploop_loop ; do loop until someting happens
|
|
57
|
|
58
|
|
59 onemin_sleep:
|
|
60 call get_battery_voltage ; get battery voltage
|
|
61 btfsc enter_error_sleep ; Enter Fatal Error Routine?
|
16
|
62 call fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!)
|
0
|
63
|
|
64 call calc_surface_interval ; Increases Surface-Interval time
|
|
65 call nofly_timeout60 ; check for no fly time
|
|
66 ; adjust airpressure compensation any 15 minutes
|
|
67 incf divemins+1,F ; counts to 14...
|
|
68 movlw d'14'
|
|
69 cpfsgt divemins+1
|
|
70 bra onemin_sleep2 ; 15 minutes not done!
|
|
71
|
|
72 rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
|
|
73
|
|
74 call check_temp_extrema ; Check for temperature extremas
|
|
75
|
|
76 call main_calc_CNS_decrease_15min ; compute CNS decay in sleep only
|
|
77 movlb b'00000001'
|
|
78 movff last_surfpressure_15min+0,last_surfpressure_30min+0 ; save older airpressure
|
|
79 movff last_surfpressure_15min+1,last_surfpressure_30min+1 ; save older airpressure
|
|
80 movff amb_pressure+0,last_surfpressure_15min+0 ; save new airpressure
|
|
81 movff amb_pressure+1,last_surfpressure_15min+1 ; save new airpressure
|
|
82
|
|
83 clrf divemins+1 ; reset counter
|
|
84 GETCUSTOM15 d'7' ; loads max_sufpressure into lo, hi
|
|
85 movff lo,sub_a+0 ; max. "allowed" airpressure in mBar
|
|
86 movff hi,sub_a+1
|
|
87 movff last_surfpressure_15min+0,sub_b+0
|
|
88 movff last_surfpressure_15min+1,sub_b+1
|
|
89 call sub16 ; sub_c = sub_a - sub_b
|
|
90 btfsc neg_flag
|
|
91 bra onemin_sleep1
|
|
92 bra onemin_sleep2 ; current airpressure is lower then "allowed" airpressure, ok!
|
|
93 onemin_sleep1: ; not ok! Overwrite with max. "allowed" airpressure
|
|
94 GETCUSTOM15 d'7' ; loads max_sufpressure into lo, hi
|
|
95 movff lo,last_surfpressure_15min+0 ; max. "allowed" airpressure in mBar
|
|
96 movff hi,last_surfpressure_15min+1 ; max. "allowed" airpressure in mBar
|
|
97
|
|
98 onemin_sleep2:
|
|
99 ;calc_deko_sleepmode:
|
|
100 movff amb_pressure+0,int_I_pres_respiration+0 ; LOW copy pressure to deco routine
|
|
101 movff amb_pressure+1,int_I_pres_respiration+1 ; HIGH
|
|
102 GETCUSTOM8 d'11' ; Saturation multiplier %
|
|
103 movwf wait_temp
|
|
104 movff wait_temp,char_I_saturation_multiplier
|
|
105 GETCUSTOM8 d'12' ; Desaturation multiplier %
|
|
106 movwf wait_temp
|
|
107 movff wait_temp,char_I_desaturation_multiplier
|
|
108 call deco_main_calc_wo_deco_step_1_m ; "calc_tissue_sleep"
|
|
109 movlb b'00000001' ; RAM Bank1 selected
|
|
110
|
|
111 bcf oneminupdate ; all done
|
|
112 return
|
|
113
|
|
114 onesec_sleep:
|
|
115 call test_charger ; charger on?
|
|
116
|
|
117 btfss nofly_active
|
|
118 bra onesec_sleep_nonofly
|
|
119
|
|
120 call set_LEDnofly ; Set nofly LED
|
|
121
|
|
122 nop
|
|
123 sleep
|
|
124 nop
|
|
125
|
|
126 onesec_sleep_nonofly:
|
|
127 call clear_LEDnofly ; Clear nofly LED
|
|
128 incf divemins+0,F ; counts to #test_pressure_in_sleep (5)
|
|
129 movlw d'5'
|
|
130 cpfsgt divemins+0 ; here: temp variable
|
|
131 bra onesec_sleep1 ; #test_pressure_in_sleep not done yet
|
|
132 rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
|
|
133
|
|
134 ; compare current ambient pressure with threshold
|
|
135 GETCUSTOM15 d'6' ; loads pressure threshold into lo,hi
|
|
136 movff lo,sub_a+0 ; power on if ambient pressure is greater threshold
|
|
137 movff hi,sub_a+1
|
|
138 movff amb_pressure+0,sub_b+0
|
|
139 movff amb_pressure+1,sub_b+1
|
|
140 call sub16 ; sub_c = sub_a - sub_b
|
|
141 bsf sleepmode
|
|
142 btfsc neg_flag ; Wake up from Sleep?
|
|
143 bcf sleepmode ; amb_pressure>pressure_offset_divemode: wake up!
|
|
144 clrf divemins+0
|
|
145 onesec_sleep1:
|
|
146 bcf onesecupdate ; all done.
|
|
147 btfsc switch_left
|
|
148 bra onesec_sleep1a
|
|
149 btfsc switch_right
|
|
150 bra onesec_sleep1a
|
|
151 ; No button pressed
|
|
152 bcf INTCON,INT0IF ; Clear flag
|
|
153 bcf INTCON3,INT1IF ; Clear flag
|
|
154 bcf switch_right_isr
|
|
155 bcf switch_left_isr
|
|
156 bcf switch_right
|
|
157 bcf switch_left
|
|
158 bcf T0CON,TMR0ON ; Stop Timer 0
|
|
159 return
|
|
160 onesec_sleep1a: ; At least one button pressed....
|
|
161 bcf INTCON,INT0IF ; Clear flag
|
|
162 bcf INTCON3,INT1IF ; Clear flag
|
|
163 bcf switch_right_isr
|
|
164 bcf switch_left_isr
|
|
165 bcf switch_right
|
|
166 bcf switch_left
|
|
167 bcf T0CON,TMR0ON ; Stop Timer 0
|
|
168 bcf sleepmode ; wake up!
|
|
169 bsf show_startup_screen ;
|
|
170 return
|
|
171
|
|
172 pressuretest_sleep_fast: ; Get pressure without averaging (Faster to save some power in sleep mode)
|
|
173 call get_temperature_start ; and start temperature integration (73,5us)
|
|
174 sleep
|
|
175 nop
|
|
176 sleep
|
|
177 nop
|
|
178 sleep ; Wait at least 35ms (every 16.5ms Timer1 wakeup)
|
|
179 call get_temperature_value ; State 1: Get temperature
|
|
180 call get_pressure_start ; Start pressure integration.
|
|
181 sleep
|
|
182 nop
|
|
183 sleep
|
|
184 nop
|
|
185 sleep ; Wait at least 35ms (every 16.5ms Timer1 wakeup)
|
|
186 call get_pressure_value ; State2: Get pressure (51us)
|
|
187 call calculate_compensation ; calculate temperature compensated pressure (233us)
|
|
188 return
|
|
189
|
|
190 fatal_error_sleep:
|
16
|
191 WAITMS d'250'
|
|
192 WAITMS d'250'
|
|
193 WAITMS d'250'
|
|
194 WAITMS d'250'
|
|
195 call get_battery_voltage ; get battery voltage
|
|
196 btfss enter_error_sleep ; REALLY enter Fatal Error Routine?
|
|
197 return ; No!
|
|
198
|
0
|
199 clrf INTCON
|
|
200 clrf INTCON2
|
|
201 clrf INTCON3
|
|
202 bcf ADCON0,0 ; AD converter off
|
|
203 call disable_rs232 ; disable UART module
|
|
204 movlw b'00010000'
|
|
205 movwf TRISA
|
|
206 clrf PORTA ; And pulled to GND
|
|
207 clrf TRISB ; All output
|
|
208 clrf PORTB ; And pulled to GND
|
|
209 movlw b'00011101' ; UART
|
|
210 movwf TRISC
|
|
211 clrf PORTC ; And pulled to GND
|
|
212 clrf TRISD ; All output
|
|
213 clrf PORTD ; And pulled to GND
|
|
214 clrf TRISE ; All output
|
|
215 clrf PORTE ; And pulled to GND
|
|
216 clrf T0CON ; Timer OFF
|
|
217 clrf T1CON ; Timer OFF
|
|
218 clrf T2CON ; Timer OFF
|
|
219 clrf OSCTUNE
|
|
220 movlw b'00000010' ; 31kHz
|
|
221 movwf OSCCON
|
|
222 bsf WDTCON,0 ; Watchdog timer on...
|
|
223 fatal_error_sleep_loop: ; Device will never quit this loop!
|
|
224 movff fatal_error_code,temp4
|
|
225 movlw d'15'
|
|
226 movwf temp1
|
|
227 fatal_error_sleep_loop1:
|
|
228 sleep
|
|
229 nop
|
|
230 decfsz temp1,F
|
|
231 bra fatal_error_sleep_loop1
|
|
232 fatal_error_sleep_loop2:
|
|
233 call set_LEDy
|
|
234 clrwdt
|
|
235 WAIT10US d'5'
|
|
236 call clear_LEDy
|
|
237 sleep
|
|
238 nop
|
|
239 decfsz temp4,F
|
|
240 bra fatal_error_sleep_loop2
|
|
241 bra fatal_error_sleep_loop |