Mercurial > public > hwos_code
annotate src/eeprom_rs232.asm @ 631:185ba2f91f59
3.09 beta 1 release
author | heinrichsweikamp |
---|---|
date | Fri, 28 Feb 2020 15:45:07 +0100 |
parents | 237931377539 |
children | 4050675965ea |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
631 | 3 ; File eeprom_rs232.asm combined next generation V3.08.8 |
0 | 4 ; |
5 ; Internal EEPROM, RS232 | |
6 ; | |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 ; HISTORY | |
10 ; 2011-08-06 : [mH] moving from OSTC code | |
11 | |
275 | 12 #include "hwos.inc" |
0 | 13 #include "wait.inc" |
582 | 14 #include "shared_definitions.h" |
15 #include "rtc.inc" | |
631 | 16 #include "external_flash.inc" |
17 | |
18 #DEFINE INSIDE_EEPROM_RS232 | |
19 #include "eeprom_rs232.inc" | |
20 | |
582 | 21 |
623 | 22 extern lt2942_charge_done |
23 | |
24 ;----------------------------------------------------------------------------- | |
631 | 25 ; |
26 ; for EEPROM Macros and Memory Map, see eeprom_rs232.inc | |
27 ; | |
28 ;----------------------------------------------------------------------------- | |
623 | 29 |
631 | 30 ee_rs232 CODE |
582 | 31 |
631 | 32 ;============================================================================= |
33 ; EEPROM Functions | |
34 ;============================================================================= | |
582 | 35 |
623 | 36 ;----------------------------------------------------------------------------- |
37 ; read from internal EEPROM | |
38 ; | |
604 | 39 ; Input: EEADRH:EEADR = EEPROM address |
40 ; Output: EEDATA | |
41 ; Trashed: NONE | |
623 | 42 ; |
0 | 43 global read_eeprom |
582 | 44 read_eeprom: |
631 | 45 bcf EECON1,EEPGD ; |
46 bcf EECON1,CFGS ; | |
47 bsf EECON1,RD ; | |
0 | 48 return |
49 | |
631 | 50 ;----------------------------------------------------------------------------- |
623 | 51 ; write into internal EEPROM |
52 ; | |
604 | 53 ; Input: EEADRH:EEADR = EEPROM address |
54 ; EEDATA = byte to write | |
55 ; Trashed: WREG | |
623 | 56 ; |
604 | 57 global write_eeprom |
58 write_eeprom: | |
631 | 59 bcf EECON1,EEPGD ; |
60 bcf EECON1,CFGS ; | |
61 bsf EECON1,WREN ; | |
62 bcf INTCON,GIE ; disable interrupts for the next 5 instructions | |
63 movlw 0x55 ; unlock sequence | |
64 movwf EECON2 ; ... | |
65 movlw 0xAA ; ... | |
66 movwf EECON2 ; ... | |
67 bsf EECON1,WR ; start write operation | |
68 write_eeprom_loop: | |
69 btfsc EECON1,WR ; write completed? | |
70 bra write_eeprom_loop ; NO - loop waiting | |
71 bcf EECON1,WREN ; | |
72 bsf INTCON,GIE ; ...but the flag for the ISR routines were still set, so they will interrupt now! | |
73 return | |
74 | |
75 ;----------------------------------------------------------------------------- | |
76 ; these 2 functions are meant to be used through the macros, see eeprom_rs232! | |
77 ; | |
78 global eeprom_read_common | |
79 eeprom_read_common: | |
80 movwf eeprom_loop ; initialize loop counter | |
81 eeprom_read_common_loop: | |
82 rcall read_eeprom ; execute read | |
83 movff EEDATA,POSTINC1 ; copy byte from EEPROM data register to memory | |
84 incf EEADR,F ; advance to next EEPROM cell | |
85 decfsz eeprom_loop,F ; decrement loop counter, all done? | |
86 bra eeprom_read_common_loop ; NO - loop | |
87 return ; YES - done | |
604 | 88 |
631 | 89 global eeprom_write_common |
90 eeprom_write_common: | |
91 movwf eeprom_loop ; initialize loop counter | |
92 eeprom_write_common_loop: | |
93 movff POSTINC1,EEDATA ; copy byte from memory to EEPROM data register | |
94 rcall write_eeprom ; execute write | |
95 incf EEADR,F ; advance to next EEPROM cell | |
96 decfsz eeprom_loop,F ; decrement loop counter, all done? | |
97 bra eeprom_write_common_loop ; NO - loop | |
98 return ; YES - done | |
99 | |
100 ;----------------------------------------------------------------------------- | |
101 ; REad OSTC serial number | |
102 ; | |
103 global eeprom_serial_number_read | |
104 eeprom_serial_number_read: | |
105 EEPROM_II_READ eeprom_ostc_serial,mpr | |
106 return | |
604 | 107 |
631 | 108 ;----------------------------------------------------------------------------- |
109 ; Read and write dive number offset | |
110 ; | |
111 global eeprom_log_offset_read | |
112 eeprom_log_offset_read: | |
113 EEPROM_II_READ eeprom_log_offset,mpr | |
114 return | |
115 | |
116 global eeprom_log_offset_write | |
117 eeprom_log_offset_write: | |
118 EEPROM_II_WRITE mpr,eeprom_log_offset | |
119 return | |
120 | |
121 | |
122 ;----------------------------------------------------------------------------- | |
123 ; Read and write total number of dives | |
124 ; | |
125 global eeprom_total_dives_read | |
126 eeprom_total_dives_read: | |
127 EEPROM_II_READ eeprom_num_dives,mpr | |
128 return | |
129 | |
130 global eeprom_total_dives_write | |
131 eeprom_total_dives_write: | |
132 EEPROM_II_WRITE mpr,eeprom_num_dives | |
604 | 133 return |
134 | |
631 | 135 |
136 ;----------------------------------------------------------------------------- | |
137 ; Read and write the battery gauge and type | |
138 ; | |
139 global eeprom_battery_gauge_read | |
140 eeprom_battery_gauge_read: | |
141 ; retrieve battery gauge from EEPROM 0x07-0x0C | |
142 bsf block_battery_gauge ; suspend ISR from accessing the battery gauge | |
143 EEPROM_CC_READ eeprom_battery_type, battery_type ; 1 byte read from EEPROM | |
144 EEPROM_RR_READ eeprom_battery_gauge,battery_gauge,.6 ; 6 byte read from EEPROM | |
145 bcf block_battery_gauge ; allow ISR to access the battery gauge again | |
146 return | |
147 | |
148 global eeprom_battery_gauge_write | |
149 eeprom_battery_gauge_write: | |
150 bsf block_battery_gauge ; suspend ISR from accessing the battery gauge | |
151 EEPROM_CC_WRITE battery_type, eeprom_battery_type ; 1 byte write to EEPROM | |
152 update_battery_gauge: | |
153 EEPROM_RR_WRITE battery_gauge,eeprom_battery_gauge,.6 ; 6 byte write to EEPROM | |
154 bcf block_battery_gauge ; allow ISR to access the battery gauge again | |
155 return | |
156 | |
157 | |
158 ;----------------------------------------------------------------------------- | |
159 ; Read and write the deco status | |
160 ; | |
161 global eeprom_deco_data_read | |
162 eeprom_deco_data_read: | |
163 | |
164 btfsc RCON,POR ; was there a power outage ? | |
165 bra eeprom_deco_data_read_1 ; NO - RTC is up-to-date | |
166 | |
167 EEPROM_RR_READ eeprom_deco_data_timestamp,rtc_latched_year,.6 ; 6 byte read from EEPROM | |
168 call rtc_set_rtc ; recover RTC to last known time & date | |
169 | |
170 eeprom_deco_data_read_1: | |
171 | |
172 ; restore surface interval | |
173 EEPROM_II_READ eeprom_deco_data_surfinterval,mpr ; 2 byte read from EEPROM | |
174 SMOVII mpr,surface_interval_mins ; ISR-safe copy of surface interval | |
175 | |
176 ; bank 3: restore desaturation status | |
177 EEPROM_RR_READ eeprom_deco_data_bank3,0x300,.9 ; 9 byte read from EEPROM | |
178 | |
179 ; bank 5: restore CNS | |
180 EEPROM_RR_READ eeprom_deco_data_bank5,0x500,.4 ; 4 byte read from EEPROM | |
181 | |
182 ; bank 7: restore tissue pressures | |
183 EEPROM_RR_READ eeprom_deco_data_bank7,0x700,.128 ; 128 byte read from EEPROM | |
184 | |
185 return ; done | |
186 | |
187 | |
188 global eeprom_deco_data_write | |
189 eeprom_deco_data_write: | |
190 | |
191 ; invalidate current data in vault | |
192 movlw DECO_DATA_INVALID_TOKEN ; deco data invalid token | |
193 EEPROM_CC_WRITE WREG,eeprom_deco_data_validity ; 1 byte write to EEPROM | |
194 | |
195 ; store vault version | |
196 movlw eeprom_vault_version ; deco data format version | |
197 EEPROM_CC_WRITE WREG,eeprom_deco_data_version ; 1 byte write to EEPROM | |
198 | |
199 ; store date/time | |
200 SMOVSS rtc_year,rtc_latched_year ; ISR-safe 6 byte copy of date and time | |
201 EEPROM_RR_WRITE rtc_latched_year,eeprom_deco_data_timestamp,.6 ; 6 byte write to EEPROM | |
202 | |
203 ; store surface interval | |
204 SMOVII surface_interval_mins,mpr ; ISR-safe copy of surface interval | |
205 EEPROM_II_WRITE mpr,eeprom_deco_data_surfinterval ; 2 byte write to EEPROM | |
206 | |
207 ; bank 3: store desaturation status | |
208 EEPROM_RR_WRITE 0x300,eeprom_deco_data_bank3,.9 ; 9 byte write to EEPROM | |
209 | |
210 ; bank 5: store CNS | |
211 EEPROM_RR_WRITE 0x500,eeprom_deco_data_bank5,.4 ; 4 byte write to EEPROM | |
212 | |
213 ; bank 7: store tissue pressures | |
214 EEPROM_RR_WRITE 0x700,eeprom_deco_data_bank7,.128 ; 128 byte write to EEPROM | |
215 | |
216 ; indicate new valid data in vault | |
217 movlw DECO_DATA_VALID_TOKEN ; deco data valid token | |
218 EEPROM_CC_WRITE WREG,eeprom_deco_data_validity ; 1 byte write to EEPROM | |
219 | |
220 return ; done | |
221 | |
222 | |
223 | |
224 ;============================================================================= | |
225 ; RS232 Functions | |
623 | 226 ;============================================================================= |
227 | |
582 | 228 global disable_ir_s8 |
229 disable_ir_s8: | |
623 | 230 banksel TXSTA2 ; select bank for IO register access |
582 | 231 clrf TXSTA2 |
232 clrf RCSTA2 | |
623 | 233 banksel common ; back to bank common |
629 | 234 bcf PIE3,RC2IE ; disable RC2 INT |
235 bcf ir_power ; IR off | |
236 bcf mcp_power ; power-down instrumentation amp | |
237 bsf s8_npower ; power-down S8 digital interface | |
238 bcf s8_digital_avail ; digital S8 interface not available | |
0 | 239 return |
240 | |
241 | |
582 | 242 global enable_ir_s8 |
187
669b5d00706d
CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents:
151
diff
changeset
|
243 enable_ir_s8: |
623 | 244 ;initialize serial port2 (TRISG2) |
245 btfsc analog_o2_input ; do we have an analog input? | |
246 bra enable_s8 ; YES - search for S8 digital input | |
247 ; NO - start IR digital input | |
248 banksel BAUDCON2 ; - select bank for IO register access | |
249 movlw b'00100000' ; - BRG16=0, inverted for IR | |
113 | 250 movwf BAUDCON2 |
623 | 251 movlw b'00100000' ; - BRGH=0, SYNC=0 |
582 | 252 movwf TXSTA2 |
623 | 253 movlw .102 ; - SPBRGH:SPBRG = .102 : 2403 BAUD @ 16 MHz |
582 | 254 movwf SPBRG2 |
623 | 255 clrf SPBRGH2 |
582 | 256 movlw b'10010000' |
257 movwf RCSTA2 | |
623 | 258 banksel common ; - back to bank common |
259 bsf ir_power ; - power-up IR | |
629 | 260 btfss ir_power ; - power-up confirmed? |
261 bra $-6 ; NO - loop and wait | |
262 bsf PIE3,RC2IE ; - enable RC2 INT | |
263 return ; - done | |
0 | 264 |
113 | 265 enable_s8: |
629 | 266 banksel TXSTA2 ; select bank for IO register access |
631 | 267 clrf TXSTA2 ; reset UART 2 TX function |
268 clrf RCSTA2 ; reset UART 2 RX function | |
623 | 269 banksel common ; back to bank common |
631 | 270 |
271 bsf mcp_power ; power-up instrumentation amp (for analog AND digital) | |
272 btfss mcp_power ; power-up completed? | |
273 bra $-4 ; NO - loop | |
113 | 274 |
631 | 275 ; toggle for digital/analog |
276 TSTOSS opt_s8_mode ; =0: analog, =1: digital RS232 | |
277 bra enable_s8_analog ; -> analog | |
278 | |
279 ; configure S8 digital interface | |
280 bcf s8_npower ; power S8 HUD (inverted via P-MOS transistor) | |
623 | 281 WAITMS d'30' ; NO - wait 30 ms |
631 | 282 banksel BAUDCON2 ; select bank for IO register access |
623 | 283 movlw b'00000000' ; BRG16=0, normal for S8 |
113 | 284 movwf BAUDCON2 |
582 | 285 movlw b'00100000' ; BRGH=0, SYNC=0 |
286 movwf TXSTA2 | |
604 | 287 movlw .25 ; SPBRGH:SPBRG = .25 : 9615 BAUD @ 16 MHz |
582 | 288 movwf SPBRG2 |
289 movlw b'10010000' | |
290 movwf RCSTA2 | |
623 | 291 banksel common ; back to bank common |
631 | 292 bsf PIE3,RC2IE ; enable RC2 INT |
623 | 293 bsf s8_digital_avail ; digital S8 interface available |
582 | 294 return |
113 | 295 |
631 | 296 enable_s8_analog: |
297 ; S8 analog interface | |
298 bcf PIE3,RC2IE ; disable RC2 INT | |
299 bsf s8_npower ; power-down S8 HUD | |
300 bcf s8_digital_avail ; digital S8 interface not available | |
301 return | |
302 | |
303 | |
304 global ir_s8_wait_tx | |
305 ir_s8_wait_tx: | |
306 banksel TXSTA2 ; select bank for IO register access | |
307 rs232_wait_tx2_loop: | |
308 btfss TXSTA2,TRMT ; RS232 busy? | |
309 bra rs232_wait_tx2_loop ; YES - wait... | |
310 banksel common ; NO - back to bank common | |
311 return ; - done | |
312 | |
313 ;----------------------------------------------------------------------------- | |
582 | 314 |
0 | 315 global enable_rs232 |
316 enable_rs232: | |
623 | 317 call request_speed_normal ; request CPU speed change to normal speed |
318 enable_rs232_1: | |
319 btfss speed_is_normal ; speed = normal? | |
631 | 320 bra enable_rs232_1 ; NO - loop waiting for ISR to have adjusted the speed |
321 bcf PORTE,0 ; YES - switch port to comm | |
322 bsf PORTJ,2 ; - /Reset (required for very old OSTC sport) | |
323 movlw b'00100100' ; - TX configuration: TX enabled, async, high speed | |
324 movwf TXSTA1 ; - ... | |
325 movlw b'10010000' ; - RX configuration: port enabled, RX enabled | |
326 movwf RCSTA1 ; - ... | |
327 movlw HIGH(.65536-rx_timeout*.32) ; - define TMR5H initialization value for RX timeout | |
328 movwf rx_timoeut_tmr5h_load ; - store for later use | |
329 return ; - done | |
0 | 330 |
582 | 331 |
0 | 332 global disable_rs232 |
333 disable_rs232: | |
631 | 334 clrf RCSTA1 ; disable RX |
335 clrf TXSTA1 ; disable TX | |
336 bcf PORTC,6 ; switch TX pin hard to GND | |
623 | 337 bsf PORTE,0 ; stop comm |
631 | 338 bcf PORTJ,2 ; /Reset (required for very old OSTC sport) |
582 | 339 return |
340 | |
341 | |
631 | 342 global rs232_wait_tx ; ++++ do not touch WREG here! ++++ |
343 rs232_wait_tx: | |
344 btfss TXSTA1,TRMT ; last byte completely shifted out on TX pin? | |
345 bra rs232_wait_tx ; NO - wait... | |
346 btfss ble_available ; YES - OSTC running with Bluetooth? | |
347 return ; NO - done | |
348 btfsc NRTS ; YES - Bluetooth module also completed TX? | |
349 bra rs232_wait_tx ; NO - wait... | |
350 return ; YES - done | |
623 | 351 |
352 | |
631 | 353 ; ++++ make this code as fast as possible! ++++ |
354 global rs232_get_byte ; ++++ do not touch WREG here! ++++ | |
355 rs232_get_byte: | |
356 bcf rs232_rx_timeout ; clear timeout flag | |
357 btfsc PIR1,RCIF ; received a data byte? (bit is set on RX complete and reset on reading RCREG1) | |
358 return ; YES - done, received a byte (fast path) | |
359 movff rx_timoeut_tmr5h_load,TMR5H ; - load TMR5 high with timeout value | |
360 clrf TMR5L ; - load TMR5 low with a zero, writing low starts the timer | |
361 bcf PIR5,TMR5IF ; - clear timer overflow flag | |
362 rs232_get_byte_loop: | |
363 btfsc PIR1,RCIF ; received a data byte? | |
364 return ; YES - done, received a byte | |
365 btfss PIR5,TMR5IF ; NO - timer overflow (timeout)? | |
366 bra rs232_get_byte_loop ; NO - continue looping | |
367 ;bra rs232_rx_get_timeout ; YES - give up | |
623 | 368 |
631 | 369 rs232_rx_get_timeout: |
370 bsf rs232_rx_timeout ; set timeout flag | |
371 bcf RCSTA1,CREN ; clear receiver status by toggling CREN | |
372 bsf RCSTA1,CREN ; ... | |
373 return ; done, given up | |
623 | 374 |
582 | 375 |
631 | 376 ;----------------------------------------------------------------------------- |
377 ; Send and Receive functions to be used through the macros | |
623 | 378 |
631 | 379 ; send a range of 1-256 bytes from memory to the RS232 interface |
380 ; | |
381 global serial_tx_ram | |
382 serial_tx_ram: | |
383 movwf eeprom_loop ; initialize loop counter (eeprom variable used here) | |
384 serial_tx_ram_loop: | |
385 rcall rs232_wait_tx ; wait for completion of last transmit | |
386 movff POSTINC2,TXREG1 ; send a byte from memory to serial | |
387 decfsz eeprom_loop,F ; decrement loop counter, became zero? | |
388 bra serial_tx_ram_loop ; NO - loop | |
389 return ; YES - done | |
582 | 390 |
623 | 391 |
631 | 392 ; receive a range of 1-256 byte from the RS232 interface and write them to memory |
393 ; | |
394 global serial_rx_stream_ram ; ++++ make this code as fast as possible! ++++ | |
395 serial_rx_stream_ram: | |
396 movwf eeprom_loop ; initialize loop counter (eeprom variable used here) | |
397 serial_rx_stream_ram_loop_1: | |
398 btfss PIR1,RCIF ; received a data byte? (bit is set on RX complete and reset on reading RCREG1) | |
399 bra serial_rx_stream_ram_tmr ; NO - enter loop with timeout | |
400 movff RCREG1,POSTINC2 ; YES - copy received byte to memory | |
401 decfsz eeprom_loop,F ; - decrement loop counter, became zero? | |
402 bra serial_rx_stream_ram_loop_1 ; NO - loop | |
403 bcf rs232_rx_timeout ; YES - clear timeout flag | |
404 return ; - all bytes received, done | |
405 serial_rx_stream_ram_tmr: | |
406 movff rx_timoeut_tmr5h_load,TMR5H ; load TMR5 high with timeout value | |
407 clrf TMR5L ; load TMR5 low with a zero, writing low starts the timer | |
408 bcf PIR5,TMR5IF ; clear timer overflow flag | |
409 serial_rx_stream_ram_loop_2a: | |
410 clrf TMR5L ; restart timer (see above) | |
411 serial_rx_stream_ram_loop_2b: | |
412 btfss PIR1,RCIF ; received a data byte? (bit is set on RX complete and reset on reading RCREG1) | |
413 bra serial_rx_stream_ram_chk ; NO - check timeout | |
414 movff RCREG1,POSTINC2 ; YES - copy received byte to memory | |
415 decfsz eeprom_loop,F ; - decrement loop counter, became zero? | |
416 bra serial_rx_stream_ram_loop_2a; NO - loop | |
417 bcf rs232_rx_timeout ; YES - clear timeout flag | |
418 return ; - all bytes received, done | |
419 serial_rx_stream_ram_chk: | |
420 btfss PIR5,TMR5IF ; timer overflow (timeout)? | |
421 bra serial_rx_stream_ram_loop_2b; NO - continue looping | |
422 bra rs232_rx_get_timeout ; YES - give up | |
623 | 423 |
631 | 424 ;----------------------------------------------------------------------------- |
582 | 425 END |