comparison code_part1/OSTC_code_asm_part1/sleepmode.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 01510acaeb11
comparison
equal deleted inserted replaced
-1:000000000000 0:96a35aeda5f2
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?
62 goto fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!)
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:
191 clrf INTCON
192 clrf INTCON2
193 clrf INTCON3
194 bcf ADCON0,0 ; AD converter off
195 call disable_rs232 ; disable UART module
196 movlw b'00010000'
197 movwf TRISA
198 clrf PORTA ; And pulled to GND
199 clrf TRISB ; All output
200 clrf PORTB ; And pulled to GND
201 movlw b'00011101' ; UART
202 movwf TRISC
203 clrf PORTC ; And pulled to GND
204 clrf TRISD ; All output
205 clrf PORTD ; And pulled to GND
206 clrf TRISE ; All output
207 clrf PORTE ; And pulled to GND
208 clrf T0CON ; Timer OFF
209 clrf T1CON ; Timer OFF
210 clrf T2CON ; Timer OFF
211 clrf OSCTUNE
212 movlw b'00000010' ; 31kHz
213 movwf OSCCON
214 bsf WDTCON,0 ; Watchdog timer on...
215 fatal_error_sleep_loop: ; Device will never quit this loop!
216 movff fatal_error_code,temp4
217 movlw d'15'
218 movwf temp1
219 fatal_error_sleep_loop1:
220 sleep
221 nop
222 decfsz temp1,F
223 bra fatal_error_sleep_loop1
224 fatal_error_sleep_loop2:
225 call set_LEDy
226 clrwdt
227 WAIT10US d'5'
228 call clear_LEDy
229 sleep
230 nop
231 decfsz temp4,F
232 bra fatal_error_sleep_loop2
233 bra fatal_error_sleep_loop