diff code_part1/OSTC_code_asm_part1/surfmode.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 3cf8af30b36e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/surfmode.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,452 @@
+
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+;    This program is free software: you can redistribute it and/or modify
+;    it under the terms of the GNU General Public License as published by
+;    the Free Software Foundation, either version 3 of the License, or
+;    (at your option) any later version.
+
+;    This program is distributed in the hope that it will be useful,
+;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;    GNU General Public License for more details.
+
+;    You should have received a copy of the GNU General Public License
+;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+; routines for Surface mode
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 10/01/05
+; last updated: 080905
+; known bugs:
+; ToDo:
+
+surfloop:
+; Boot tasks for all modes
+	call	restart_set_modes_and_flags	; Sets decomode flags
+	clrf	lo
+	movff	lo,char_I_const_ppO2			; reset to standard mode, OSTC assumes Air breathing at the surface!
+
+	call	PLED_brightness_full			;max. brightness
+	
+	call 	I2CReset
+	call	enable_rs232
+	call	PLED_boot
+	call	PLED_serial						; Show OSTC serial and firmware version
+	call	PLED_clock						; display time
+	call	update_date						; display date
+	movff	last_surfpressure_30min+0,int_I_pres_respiration+0		; copy surface air pressure to deco routine
+	movff	last_surfpressure_30min+1,int_I_pres_respiration+1		; 30min old values 
+	movff	last_surfpressure_30min+0,int_I_pres_surface+0			; copy surface air pressure to deco routine
+	movff	last_surfpressure_30min+1,int_I_pres_surface+1			; 30min old values 
+
+	btfsc	gauge_mode					; Ignore in gauge mode
+	bra		surfloop1
+	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
+	bra		surfloop1
+
+; Startup tasks for decompression modes
+	call	PLED_desaturation_time			; display desaturation time
+	call	PLED_nofly_time					; display nofly time
+	call	PLED_tissue_saturation_graph	; display saturation graph
+	call	PLED_active_gas_surfmode		; Show start gas
+	call	PLED_display_decotype_surface	; Show deco mode (ZH-L16, const. ppO2 or Multi-GF)
+
+surfloop1:
+	btfss	gauge_mode					; Display only in gauge mode	
+	bra		surfloop2
+	DISPLAYTEXT	d'103'					; Gauge mode
+surfloop2:
+	btfss	FLAG_apnoe_mode				; Display only in Apnoe mode
+	bra		surfloop3
+	DISPLAYTEXT	d'116'					; Apnoe mode
+
+surfloop3:
+; Startup tasks for all modes
+	clrf	timeout_counter2				
+	clrf 	timeout_counter3
+	bcf		premenu						; clear premenu flag
+	bcf		menubit						; clear menu flag
+	bcf		pressure_refresh
+	clrf	last_pressure+0
+	clrf	last_pressure+1
+	clrf	last_temperature+0
+	clrf	last_temperature+1
+
+	movlw	d'5'
+	movwf	timeout_counter			; reload counter
+
+	call	clear_LEDusb
+	call	clear_LEDy					
+	bcf		simulatormode_active		; Quit simulator mode (if active)
+	bcf		standalone_simulator		; Quit simulator mode (if active)
+	WIN_TOP		.0
+	WIN_LEFT	.0
+	WIN_FONT 	FT_SMALL
+	WIN_INVERT	.0					; Init new Wordprocessor
+	WIN_COLOR	color_white
+	bcf		switch_left
+	bcf		switch_right
+	call	PLED_custom_text			; Displays custom text
+	movlw	d'1'						; next cf to check
+	movwf	cf_checker_counter			; 
+	ostc_debug	'G'						; Sends debug-information to screen if debugmode active
+	GETCUSTOM8	d'12'					; Desaturation multiplier %
+	movwf	wait_temp
+	movff	wait_temp,char_I_desaturation_multiplier
+	GETCUSTOM8	d'11'					; Saturation multiplier %
+	movwf	wait_temp
+	movff	wait_temp,char_I_saturation_multiplier
+	call	deco_main_calc_desaturation_time; calculate desaturation time
+	movlb	b'00000001'					; select ram bank 1
+	ostc_debug	'H'						; Sends debug-information to screen if debugmode active
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+
+surfloop_loop:
+	btfss	onesecupdate				; do every second tasks?
+	bra		surfloop_loop2				; no, loop
+
+	btfss	FLAG_const_ppO2_mode		; are we in const. ppO2 mode?	
+	bra		surfloop_loop1				; No
+; One Second tasks for ppO2 modes
+
+	bra		surfloop_loop1				; Do not search for sensor in CC mode
+
+
+surfloop_loop1:
+; One Second tasks for all modes
+	call	PLED_clock					; update clock
+	call	test_charger				; check if charger IC is active
+	call	timeout_surfmode			; check timeout 
+	call	get_battery_voltage			; get battery voltage
+	call	update_batt_voltage			; display battery voltage
+	call	timeout_premenu				; timeout premenu
+	call	set_leds_surfmode			; Sets Warning and No-Fly LEDs
+	call	custom_functions_check_surfmode	; Checks CF functions and displays warning symbol if something critical is wrong
+	call	PLED_active_gas_surfmode	; Show start gas / SetPoint
+	call	PLED_display_decotype_surface	; Show deco mode
+	btfsc	enter_error_sleep			; Enter Fatal Error Routine?
+	goto	fatal_error_sleep			; Yes (In Sleepmode_vxx.asm!)
+	bcf		onesecupdate				; every second tasks done
+	
+surfloop_loop2:	
+; Tasks approx. every 50ms for all modes
+	call	test_switches_surfmode		; check switches
+
+; Sensor tasks for all modes
+	btfsc	pressure_refresh			; new pressure available?
+	call	update_surf_press			; display surface pressure
+	btfsc	pressure_refresh			; new temperature available?
+	call	PLED_temp_surfmode			; Displays temperature
+	btfsc	pressure_refresh			; new pressure available?
+	call	set_dive_modes				; tests if depth>threshold
+	bcf		pressure_refresh			; until new pressure is available
+
+; One minute tasks for all modes
+	btfsc	oneminupdate				; do every minute tasks
+	call	update_surfloop60			; yes, e.g. update time and date
+
+; Mode tasks
+	btfsc	menubit						; Menu?
+	goto	menu						; Menu!
+	btfsc	divemode					; Divemode active?
+	goto	diveloop					; Yes, switch into Divemode!
+	btfsc	sleepmode					; Sleepmode active?
+	goto	sleeploop					; Yes, switch into sleepmode!
+; Check for the different UART flags
+	btfsc	dump_external_eeprom		; Start interface (dumps EEPROM BANK 0 + additional data)?
+	goto	menu_interface				; Yes!
+	btfsc	uart_settime				; Sync clock with PC?
+	goto	sync_clock					; Yes!
+	btfsc	internal_eeprom_write		; Access internal EEPROM BANK 0 via UART module
+	goto	internal_eeprom_access_b0	; Yes!
+	btfsc	internal_eeprom_write2		; Access internal EEPROM BANK 1 via UART module
+	goto	internal_eeprom_access_b1	; Yes!
+	btfsc	uart_send_hash				; Send MD2 hash values
+	goto	send_md2_hash				; Yes!
+	btfsc	uart_compensate_temp		; Enter temp. compensation routine?
+	goto	compensate_temperature		; Yes!
+	btfsc	uart_send_int_eeprom		; Send internal EEPROM BANK 0
+	goto	send_int_eeprom_b0			; Yes!
+	btfsc	uart_reset_decodata			; Reset Deco Data?
+	goto	reset_decodata				; Yes!
+	btfsc	uart_send_int_eeprom2		; Send internal EEPROM BANK 1
+	goto	send_int_eeprom_b1			; Yes!
+	btfsc	uart_store_tissue_data		; Store tissue data?`
+	goto	uart_store_tissues			; Yes!
+
+	bra		surfloop_loop				; loop surfacemode
+
+
+update_surfloop60:
+; One minute tasks for all modes
+	call	update_date					; and date in divemode
+	call	calc_deko_surfmode			; calculate desaturation every minute
+	call	check_temp_extrema			; check for new temperature extremas
+	call	PLED_custom_text			; Displays custom text
+	call	calc_surface_interval		; Increases Surface-Interval time
+
+	btfsc	gauge_mode					; Ignore in gauge mode
+	bra		update_surfloop60_2
+	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
+	bra		update_surfloop60_2
+
+; One Minute tasks for deco modes
+	call	PLED_nofly_time				; display nofly time
+	call	PLED_desaturation_time		; display desaturation time
+	btfss	premenu						; Not when "Menu?" is displayed!
+	call	PLED_tissue_saturation_graph; display saturation graph
+
+update_surfloop60_2:
+	call	nofly_timeout60				; checks if nofly time is > 0
+	bcf		oneminupdate				
+	return
+
+nofly_timeout60:
+	bsf		nofly_active					; Set flag
+	movlw	d'1'
+	subwf	nofly_time+0,F
+	movlw	d'0'
+	subwfb	nofly_time+1,F					; reduce by one
+	tstfsz	nofly_time+0					; =0?
+	return			
+	tstfsz	nofly_time+1					; =0?
+	return
+	bcf		nofly_active					; Clear flag
+	call	clear_LEDnofly
+	incf	nofly_time+0,F					; =1
+	return
+
+calc_surface_interval:
+	movff		int_O_desaturation_time+0,lo			; divide by 60...
+	movff		int_O_desaturation_time+1,hi
+	tstfsz		lo							;=0?
+	bra			calc_surface_interval2		; No
+	tstfsz		hi							;=0?
+	bra			calc_surface_interval2		; No
+	clrf		surface_interval+0
+	clrf		surface_interval+1			; Clear surface interval timer
+	return
+
+calc_surface_interval2:						; Increase surface interval timer 
+	movlw		d'1'
+	addwf		surface_interval+0,F
+	movlw		d'0'
+	addwfc		surface_interval+1,F
+	return
+
+set_leds_surfmode:	
+	btfsc	nofly_active
+	call	toggle_LEDnofly
+	return	
+
+calc_deko_surfmode:
+	call	set_LEDg					
+	ostc_debug	'I'		; Sends debug-information to screen if debugmode active
+
+	movff	last_surfpressure+0,int_I_pres_surface+0	; copy surface air pressure to deco routine
+	movff	last_surfpressure+1,int_I_pres_surface+1		
+	clrf	wait_temp						; Use as buffer
+	movff	wait_temp,char_I_He_ratio		; No He at the Surface
+	movlw	d'79'							; 79% N2
+	movwf	wait_temp						; Use as buffer
+	movff	wait_temp,char_I_N2_ratio		; No He at the Surface
+
+	movff	amb_pressure+0,int_I_pres_respiration+0		; copy surface air pressure to deco routine
+	movff	amb_pressure+1,int_I_pres_respiration+1		
+	GETCUSTOM8	d'11'									; Saturation multiplier %
+	movwf	wait_temp
+	movff	wait_temp,char_I_saturation_multiplier
+	GETCUSTOM8	d'12'									; Desaturation multiplier %
+	movwf	wait_temp
+	movff	wait_temp,char_I_desaturation_multiplier
+
+	call	deco_main_calc_wo_deco_step_1_m				; calculate deco in surface mode 
+	movlb	b'00000001'									; select ram bank 1
+	ostc_debug	'J'		; Sends debug-information to screen if debugmode active
+	call	clear_LEDg					
+	return
+
+
+test_charger:
+	bcf		TRISC,1						; CHRG_OUT output
+	bsf		CHRG_OUT
+	
+	bcf		cc_active					; Constant Current mode active?
+	btfss	CHRG_IN						; If CHRG_IN=0 -> CC active
+	bsf		cc_active					; Constant Current mode Active!
+	
+	bcf		CHRG_OUT		
+	bsf		TRISC,1						; CHRG_OUT high impedance
+	
+	WAIT10US	d'10'
+	
+	bcf		cv_active					; Constant Voltage mode Active?
+	btfss	CHRG_IN						; If CHRG_IN=0 -> CV active
+	bsf		cv_active					; Constant Voltage mode active!
+
+	bcf		TRISC,1						; CHRG_OUT output
+	bcf		CHRG_OUT		
+
+	btfsc	cc_active
+	bra		show_cc_active
+	btfsc	cv_active
+	bra		show_cv_active
+
+	bsf		TRISC,1						; CHRG_OUT high impedance
+
+	; Charger inactive or ready
+	btfss	charge_done					; charge done?
+	bra		test_charger2				; No, add incomplete cycle!
+	
+	; Yes, store all data for complete cycle
+	bcf		charge_started				; Clear flag
+	bcf		charge_done					; Clear flag
+	; Store incomplete/total cycles
+	read_int_eeprom 	d'50'		; Read byte (stored in EEDATA)
+	movff	EEDATA,temp1				; Low byte
+	read_int_eeprom 	d'51'		; Read byte (stored in EEDATA)
+	movff	EEDATA,temp2				; high byte
+	bcf		STATUS,C
+	movlw	d'1'
+	addwf	temp1
+	movlw	d'0'
+	addwfc	temp2				
+	movff	temp1,EEDATA
+	write_int_eeprom	d'50'			; write byte stored in EEDATA
+	movff	temp2,EEDATA
+	write_int_eeprom	d'51'			; write byte stored in EEDATA
+
+	; Store complete cycles
+	read_int_eeprom 	d'52'		; Read byte (stored in EEDATA)
+	movff	EEDATA,temp1				; Low byte
+	read_int_eeprom 	d'53'		; Read byte (stored in EEDATA)
+	movff	EEDATA,temp2				; high byte
+	bcf		STATUS,C
+	movlw	d'1'
+	addwf	temp1
+	movlw	d'0'
+	addwfc	temp2				
+	movff	temp1,EEDATA
+	write_int_eeprom	d'52'			; write byte stored in EEDATA
+	movff	temp2,EEDATA
+	write_int_eeprom	d'53'			; write byte stored in EEDATA
+	; Store date of complete cycle
+	movff	month,EEDATA
+	write_int_eeprom	d'47'
+	movff	day,EEDATA
+	write_int_eeprom	d'48'
+	movff	year,EEDATA
+	write_int_eeprom	d'49'
+
+	return
+
+test_charger2:
+	btfss	charge_started				; Did the charger ever start?
+	return								; No, quit!
+
+	bcf		charge_started				; Clear flag
+	; Store incomplete/total cycles
+	read_int_eeprom 	d'50'			; Read byte (stored in EEDATA)
+	movff	EEDATA,temp1				; Low byte
+	read_int_eeprom 	d'51'			; Read byte (stored in EEDATA)
+	movff	EEDATA,temp2				; high byte
+	bcf		STATUS,C
+	movlw	d'1'
+	addwf	temp1
+	movlw	d'0'
+	addwfc	temp2				
+	movff	temp1,EEDATA
+	write_int_eeprom	d'50'			; write byte stored in EEDATA
+	movff	temp2,EEDATA
+	write_int_eeprom	d'51'			; write byte stored in EEDATA
+	return	
+
+show_cv_active:							; CV mode
+	call	set_LEDr					
+	WAITMS	d'100'
+	call	clear_LEDr					
+	WAITMS	d'100'
+	call	set_LEDr					
+	bsf		charge_done					; Charge cycle finished
+	return
+
+show_cc_active:							; CC mode
+	call	set_LEDr					
+	bsf		charge_started				; Charger started in CC mode
+	bcf		charge_done					; Charge cycle not finished
+	return
+
+	
+timeout_premenu:
+	btfss	premenu					; is "Menu?" displayed?
+	return							; No
+	incf	timeout_counter3,F		; Yes...
+	GETCUSTOM8	d'4'				; loads premenu_timeout into WREG
+	cpfsgt	timeout_counter3		; ... longer then premenu_timeout
+	return							; No!
+	bcf		premenu					; Yes, so clear "Menu?" and clear pre_menu bit
+
+	call	PLED_topline_box_clear	; Clears Bar at the top
+
+	btfsc	gauge_mode
+	bra		timeout_premenu2		; Skip in Gauge mode
+	btfsc	FLAG_apnoe_mode
+	bra		timeout_premenu2		; Skip in Apnoe mode
+	call	PLED_tissue_saturation_graph		; rewrite graph
+timeout_premenu2:
+	call	update_surf_press		; rewrite serial number
+	call	PLED_serial				; rewrite serial number
+	clrf	timeout_counter3		; Also clear timeout
+	bcf		switch_left				; and debounce switches
+	bcf		switch_right
+	return
+
+test_switches_surfmode:		; checks switches in surfacemode
+	btfsc	switch_left
+	bra		test_switches_surfmode2
+	btfsc	switch_right
+	bra		test_switches_surfmode3		
+	
+	; No button press, reset timer0
+	bcf		T0CON,TMR0ON				; Stop Timer 0
+	bcf		INTCON,TMR0IF				; Clear flag
+	clrf	TMR0H
+	clrf	TMR0L
+	bcf		INTCON,INT0IF				; Clear flag
+	bcf		INTCON3,INT1IF				; Clear flag
+	return
+
+test_switches_surfmode3:
+	bcf		switch_right
+	call	PLED_topline_box		; Write a filled bar at the top
+	WIN_INVERT	.1					; Init new Wordprocessor
+	DISPLAYTEXT	.4			;Menu?
+	WIN_INVERT	.0					; Init new Wordprocessor
+	bsf		premenu
+	clrf	timeout_counter2
+	return
+
+test_switches_surfmode2:
+	bcf		switch_left
+	btfss	premenu
+	return
+	bsf		menubit					; Enter Menu!
+	return
+
+
+
+timeout_surfmode:
+	incf	timeout_counter2,F		; increase timeout counter
+	GETCUSTOM8	d'3'				; loads surfloop_timeout into WREG
+	addlw	d'5'					; adds five seconds in case timout=zero!
+	btfsc	STATUS,C				; > 255?
+	movlw	d'255'					; Set to 255...
+	decf	WREG,F					; Limit to 254	
+	cpfsgt	timeout_counter2		; Compare with timeout_counter2
+	return							; return, no timeout
+	bsf		sleepmode				; Set Flag
+	return							; Return