annotate src/sleepmode.asm @ 77:131e6dd9e201

BUGFIX: Potential bug to freeze the OSTC3 after battery change or update
author heinrichsweikamp
date Thu, 20 Feb 2014 10:12:45 +0100
parents ec4d8503ec45
children e2f04bb2539c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
heinrichsweikamp
parents:
diff changeset
1 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
2 ;
heinrichsweikamp
parents:
diff changeset
3 ; File sleepmode.asm
heinrichsweikamp
parents:
diff changeset
4 ;
heinrichsweikamp
parents:
diff changeset
5 ; Sleepmode
heinrichsweikamp
parents:
diff changeset
6 ;
heinrichsweikamp
parents:
diff changeset
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
heinrichsweikamp
parents:
diff changeset
8 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
9 ; HISTORY
heinrichsweikamp
parents:
diff changeset
10 ; 2011-08-12 : [mH] moving from OSTC code
heinrichsweikamp
parents:
diff changeset
11
heinrichsweikamp
parents:
diff changeset
12 #include "ostc3.inc" ; Mandatory header
heinrichsweikamp
parents:
diff changeset
13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c
heinrichsweikamp
parents:
diff changeset
14 #include "surfmode.inc"
heinrichsweikamp
parents:
diff changeset
15 #include "tft.inc"
heinrichsweikamp
parents:
diff changeset
16 #include "isr.inc"
heinrichsweikamp
parents:
diff changeset
17 #include "start.inc"
heinrichsweikamp
parents:
diff changeset
18 #include "adc_lightsensor.inc"
heinrichsweikamp
parents:
diff changeset
19 #include "math.inc"
heinrichsweikamp
parents:
diff changeset
20 #include "ms5541.inc"
heinrichsweikamp
parents:
diff changeset
21 #include "wait.inc"
heinrichsweikamp
parents:
diff changeset
22 #include "eeprom_rs232.inc"
heinrichsweikamp
parents:
diff changeset
23 #include "external_flash.inc"
heinrichsweikamp
parents:
diff changeset
24 #include "ghostwriter.inc"
heinrichsweikamp
parents:
diff changeset
25 #include "i2c.inc"
28
heinrichsweikamp
parents: 0
diff changeset
26 #include "mcp.inc"
0
heinrichsweikamp
parents:
diff changeset
27
heinrichsweikamp
parents:
diff changeset
28 gui CODE
heinrichsweikamp
parents:
diff changeset
29
heinrichsweikamp
parents:
diff changeset
30 global sleeploop
heinrichsweikamp
parents:
diff changeset
31 sleeploop: ; enter sleepmode!
heinrichsweikamp
parents:
diff changeset
32 call disable_ir ; IR off
28
heinrichsweikamp
parents: 0
diff changeset
33 call mcp_sleep
0
heinrichsweikamp
parents:
diff changeset
34 bcf LEDg
heinrichsweikamp
parents:
diff changeset
35 bcf LEDr
39
e4e91fe8b09d remember last customview in dive and surface mode
mh@mh-THINK.fritz.box
parents: 28
diff changeset
36 movff menupos3,customview_surfmode; save last customview
0
heinrichsweikamp
parents:
diff changeset
37 call TFT_Display_FadeOut
heinrichsweikamp
parents:
diff changeset
38 call TFT_DisplayOff ; display off
heinrichsweikamp
parents:
diff changeset
39 call disable_rs232 ; USB off
heinrichsweikamp
parents:
diff changeset
40 call I2C_sleep_accelerometer
heinrichsweikamp
parents:
diff changeset
41 call I2C_sleep_compass
heinrichsweikamp
parents:
diff changeset
42 call ext_flash_enable_protection ; enable write protection for external flash
heinrichsweikamp
parents:
diff changeset
43 call update_battery_registers ; update battery registers into EEPROM
heinrichsweikamp
parents:
diff changeset
44 clrf divemins+0
heinrichsweikamp
parents:
diff changeset
45 clrf divemins+1
heinrichsweikamp
parents:
diff changeset
46 call speed_normal
heinrichsweikamp
parents:
diff changeset
47 bsf no_sensor_int ; No sensor interrupt
heinrichsweikamp
parents:
diff changeset
48 bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
heinrichsweikamp
parents:
diff changeset
49 clrf ADCON0 ; Power-Down ADC Module
heinrichsweikamp
parents:
diff changeset
50 sleeploop_loop:
heinrichsweikamp
parents:
diff changeset
51 btfsc onehourupdate ; one hour in sleep?
heinrichsweikamp
parents:
diff changeset
52 call update_battery_registers;update battery registers into EEPROM
heinrichsweikamp
parents:
diff changeset
53
heinrichsweikamp
parents:
diff changeset
54 btfsc oneminupdate ; one minute in sleep?
heinrichsweikamp
parents:
diff changeset
55 rcall onemin_sleep ; do oneminute tasks, e.g. calculate desaturation
heinrichsweikamp
parents:
diff changeset
56
heinrichsweikamp
parents:
diff changeset
57 btfsc onesecupdate ; one second in sleep?
heinrichsweikamp
parents:
diff changeset
58 rcall onesec_sleep ; check switches, check pressure sensor, etc.
heinrichsweikamp
parents:
diff changeset
59
heinrichsweikamp
parents:
diff changeset
60 btfss sleepmode ; wake up? (This bit will be set in other routines)
heinrichsweikamp
parents:
diff changeset
61 goto restart ; yes
heinrichsweikamp
parents:
diff changeset
62
heinrichsweikamp
parents:
diff changeset
63 rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup)
heinrichsweikamp
parents:
diff changeset
64
heinrichsweikamp
parents:
diff changeset
65 ; Any button pressed in sleep?
heinrichsweikamp
parents:
diff changeset
66 btfsc switch_left
heinrichsweikamp
parents:
diff changeset
67 rcall onesec_sleep1a
heinrichsweikamp
parents:
diff changeset
68 btfsc switch_right
heinrichsweikamp
parents:
diff changeset
69 rcall onesec_sleep1a
heinrichsweikamp
parents:
diff changeset
70
heinrichsweikamp
parents:
diff changeset
71 btfss sleepmode ; wake up? (This bit will be set in other routines)
heinrichsweikamp
parents:
diff changeset
72 goto restart ; yes
heinrichsweikamp
parents:
diff changeset
73
heinrichsweikamp
parents:
diff changeset
74 bra sleeploop_loop ; do loop until someting happens
heinrichsweikamp
parents:
diff changeset
75
heinrichsweikamp
parents:
diff changeset
76
heinrichsweikamp
parents:
diff changeset
77 onemin_sleep:
heinrichsweikamp
parents:
diff changeset
78 ;---- adjust airpressure compensation any 15 minutes
heinrichsweikamp
parents:
diff changeset
79 incf divemins+1,F ; counts to 14...
heinrichsweikamp
parents:
diff changeset
80 movlw d'14'
heinrichsweikamp
parents:
diff changeset
81 cpfsgt divemins+1
heinrichsweikamp
parents:
diff changeset
82 bra onemin_sleep2 ; 15 minutes not done!
heinrichsweikamp
parents:
diff changeset
83
heinrichsweikamp
parents:
diff changeset
84 ; Tasks every 15 minutes in sleep
heinrichsweikamp
parents:
diff changeset
85 clrf divemins+1 ; reset counter
heinrichsweikamp
parents:
diff changeset
86
heinrichsweikamp
parents:
diff changeset
87 call deco_calc_CNS_decrease_15min ; compute CNS decay in sleep only
heinrichsweikamp
parents:
diff changeset
88 banksel common
heinrichsweikamp
parents:
diff changeset
89
heinrichsweikamp
parents:
diff changeset
90 SAFE_2BYTE_COPY last_surfpressure_15min, last_surfpressure_30min ; save older airpressure
heinrichsweikamp
parents:
diff changeset
91 SAFE_2BYTE_COPY amb_pressure, last_surfpressure_15min ; save new airpressure
heinrichsweikamp
parents:
diff changeset
92
heinrichsweikamp
parents:
diff changeset
93 movlw LOW max_surfpressure
heinrichsweikamp
parents:
diff changeset
94 movff WREG,sub_a+0 ; max. "allowed" airpressure in mbar
heinrichsweikamp
parents:
diff changeset
95 movlw HIGH max_surfpressure
heinrichsweikamp
parents:
diff changeset
96 movff WREG,sub_a+1 ; max. "allowed" airpressure in mbar
heinrichsweikamp
parents:
diff changeset
97 movff last_surfpressure_15min+0,sub_b+0
heinrichsweikamp
parents:
diff changeset
98 movff last_surfpressure_15min+1,sub_b+1
heinrichsweikamp
parents:
diff changeset
99 call subU16 ; sub_c = sub_a - sub_b
heinrichsweikamp
parents:
diff changeset
100 btfss neg_flag ; Is 1080mbar < amb_pressure ?
heinrichsweikamp
parents:
diff changeset
101 bra onemin_sleep2 ; NO: current airpressure is lower then "allowed" airpressure, ok!
heinrichsweikamp
parents:
diff changeset
102
heinrichsweikamp
parents:
diff changeset
103 ; not ok! Overwrite with max. "allowed" airpressure
heinrichsweikamp
parents:
diff changeset
104 movlw LOW max_surfpressure
heinrichsweikamp
parents:
diff changeset
105 movff WREG,last_surfpressure_15min+0 ; max. "allowed" airpressure in mbar
heinrichsweikamp
parents:
diff changeset
106 movlw HIGH max_surfpressure
heinrichsweikamp
parents:
diff changeset
107 movff WREG,last_surfpressure_15min+1 ; max. "allowed" airpressure in mbar
heinrichsweikamp
parents:
diff changeset
108
heinrichsweikamp
parents:
diff changeset
109 onemin_sleep2:
heinrichsweikamp
parents:
diff changeset
110 ; Tasks every minute in sleep
heinrichsweikamp
parents:
diff changeset
111 SAFE_2BYTE_COPY amb_pressure, int_I_pres_respiration ; LOW copy pressure to deco routine
heinrichsweikamp
parents:
diff changeset
112 call deco_calc_wo_deco_step_1_min ; "calc_tissue_sleep"
heinrichsweikamp
parents:
diff changeset
113 banksel common
heinrichsweikamp
parents:
diff changeset
114
heinrichsweikamp
parents:
diff changeset
115 bcf oneminupdate ; all done
heinrichsweikamp
parents:
diff changeset
116 return
heinrichsweikamp
parents:
diff changeset
117
heinrichsweikamp
parents:
diff changeset
118 onesec_sleep:
heinrichsweikamp
parents:
diff changeset
119 incf divemins+0,F ; counts to #test_pressure_in_sleep (5)
heinrichsweikamp
parents:
diff changeset
120 movlw d'5'
heinrichsweikamp
parents:
diff changeset
121 cpfsgt divemins+0 ; here: temp variable
heinrichsweikamp
parents:
diff changeset
122 bra onesec_sleep1 ; #test_pressure_in_sleep not done yet
heinrichsweikamp
parents:
diff changeset
123
heinrichsweikamp
parents:
diff changeset
124 clrf divemins+0 ; clear counter
heinrichsweikamp
parents:
diff changeset
125 rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!)
heinrichsweikamp
parents:
diff changeset
126 ; compare current ambient pressure with wake_up_from_sleep
heinrichsweikamp
parents:
diff changeset
127 movlw LOW wake_up_from_sleep
heinrichsweikamp
parents:
diff changeset
128 movwf sub_a+0 ; power on if ambient pressure is greater threshold
heinrichsweikamp
parents:
diff changeset
129 movlw HIGH wake_up_from_sleep
heinrichsweikamp
parents:
diff changeset
130 movwf sub_a+1 ; power on if ambient pressure is greater threshold
heinrichsweikamp
parents:
diff changeset
131 SAFE_2BYTE_COPY amb_pressure, sub_b
heinrichsweikamp
parents:
diff changeset
132 call subU16 ; Is (1160mbar - averaged(amb_pressure)) < 0 ?
heinrichsweikamp
parents:
diff changeset
133 btfsc neg_flag ; Wake up from Sleep?
heinrichsweikamp
parents:
diff changeset
134 bra onesec_sleep1a ; Yes, skip button checks, wake up!
heinrichsweikamp
parents:
diff changeset
135
heinrichsweikamp
parents:
diff changeset
136 btfsc vusb_in ; USB plugged in?
heinrichsweikamp
parents:
diff changeset
137 bra onesec_sleep1a ; Yes, skip button checks, wake up!
heinrichsweikamp
parents:
diff changeset
138
heinrichsweikamp
parents:
diff changeset
139 onesec_sleep1:
heinrichsweikamp
parents:
diff changeset
140 bcf onesecupdate ; all done.
heinrichsweikamp
parents:
diff changeset
141 ; Check switches
heinrichsweikamp
parents:
diff changeset
142 btfsc switch_left
heinrichsweikamp
parents:
diff changeset
143 bra onesec_sleep1a
heinrichsweikamp
parents:
diff changeset
144 btfsc switch_right
heinrichsweikamp
parents:
diff changeset
145 bra onesec_sleep1a
heinrichsweikamp
parents:
diff changeset
146 ; No button pressed
heinrichsweikamp
parents:
diff changeset
147 bcf INTCON,INT0IF ; Clear flag
heinrichsweikamp
parents:
diff changeset
148 bcf INTCON3,INT1IF ; Clear flag
heinrichsweikamp
parents:
diff changeset
149 return
heinrichsweikamp
parents:
diff changeset
150
heinrichsweikamp
parents:
diff changeset
151 onesec_sleep1a: ; At least one button pressed or amb_pressure > wake_up_from_sleep
heinrichsweikamp
parents:
diff changeset
152 bcf INTCON,INT0IF ; Clear flag
heinrichsweikamp
parents:
diff changeset
153 bcf INTCON3,INT1IF ; Clear flag
heinrichsweikamp
parents:
diff changeset
154 bcf switch_right
heinrichsweikamp
parents:
diff changeset
155 bcf switch_left
heinrichsweikamp
parents:
diff changeset
156 bcf sleepmode ; wake up!
heinrichsweikamp
parents:
diff changeset
157 SAFE_2BYTE_COPY last_surfpressure_30min, amb_pressure ; copy for compatibility
heinrichsweikamp
parents:
diff changeset
158 movlw .0
heinrichsweikamp
parents:
diff changeset
159 movff WREG,sensor_state_counter ; Reset sensor state counter
heinrichsweikamp
parents:
diff changeset
160 bcf no_sensor_int ; normal sensor interrupt mode
heinrichsweikamp
parents:
diff changeset
161 return
heinrichsweikamp
parents:
diff changeset
162
heinrichsweikamp
parents:
diff changeset
163 pressuretest_sleep_fast: ; Get pressure without averaging (Faster to save some power in sleep mode)
heinrichsweikamp
parents:
diff changeset
164 banksel isr_backup ; Back to Bank0 ISR data
heinrichsweikamp
parents:
diff changeset
165 clrf amb_pressure_avg+0 ; pressure average registers
heinrichsweikamp
parents:
diff changeset
166 clrf amb_pressure_avg+1
heinrichsweikamp
parents:
diff changeset
167 clrf temperature_avg+0
heinrichsweikamp
parents:
diff changeset
168 clrf temperature_avg+1
heinrichsweikamp
parents:
diff changeset
169 call get_temperature_start ; and start temperature integration (73,5us)
heinrichsweikamp
parents:
diff changeset
170 banksel common
heinrichsweikamp
parents:
diff changeset
171 rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup)
heinrichsweikamp
parents:
diff changeset
172 rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup)
heinrichsweikamp
parents:
diff changeset
173 banksel isr_backup ; Back to Bank0 ISR data
heinrichsweikamp
parents:
diff changeset
174 call get_temperature_value ; State 1: Get temperature
heinrichsweikamp
parents:
diff changeset
175 call get_pressure_start ; Start pressure integration.
heinrichsweikamp
parents:
diff changeset
176 banksel common
heinrichsweikamp
parents:
diff changeset
177 rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup)
heinrichsweikamp
parents:
diff changeset
178 rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup)
50
ec4d8503ec45 NEW: user-selectable color schemes
heinrichsweikamp
parents: 39
diff changeset
179 bsf LEDg ; Show some activity
0
heinrichsweikamp
parents:
diff changeset
180 banksel isr_backup ; Back to Bank0 ISR data
heinrichsweikamp
parents:
diff changeset
181 call get_pressure_value ; State2: Get pressure (51us)
heinrichsweikamp
parents:
diff changeset
182 call calculate_compensation ; calculate temperature compensated pressure (27us)
heinrichsweikamp
parents:
diff changeset
183 banksel common
heinrichsweikamp
parents:
diff changeset
184 SAFE_2BYTE_COPY amb_pressure_avg, amb_pressure ; copy for compatibility
50
ec4d8503ec45 NEW: user-selectable color schemes
heinrichsweikamp
parents: 39
diff changeset
185 bcf LEDg
0
heinrichsweikamp
parents:
diff changeset
186 return
heinrichsweikamp
parents:
diff changeset
187
heinrichsweikamp
parents:
diff changeset
188 sleepmode_sleep:
heinrichsweikamp
parents:
diff changeset
189 banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
heinrichsweikamp
parents:
diff changeset
190 clrf T7GCON ; Reset Timer7 Gate Control register
heinrichsweikamp
parents:
diff changeset
191 movlw b'10001101' ; 1:1 Prescaler -> 2seconds@32768Hz, not synced
heinrichsweikamp
parents:
diff changeset
192 movwf T7CON
heinrichsweikamp
parents:
diff changeset
193 banksel common ; Bank1
heinrichsweikamp
parents:
diff changeset
194 sleep
heinrichsweikamp
parents:
diff changeset
195 nop
heinrichsweikamp
parents:
diff changeset
196 banksel 0xF16 ; Addresses, F16h through F5Fh, are also used by SFRs, but are not part of the Access RAM.
heinrichsweikamp
parents:
diff changeset
197 clrf T7GCON ; Reset Timer7 Gate Control register
heinrichsweikamp
parents:
diff changeset
198 movlw b'10001001' ; 1:1 Prescaler -> 2seconds@32768Hz, synced
heinrichsweikamp
parents:
diff changeset
199 movwf T7CON
heinrichsweikamp
parents:
diff changeset
200 banksel common ; Bank1
heinrichsweikamp
parents:
diff changeset
201 return
heinrichsweikamp
parents:
diff changeset
202
heinrichsweikamp
parents:
diff changeset
203 END