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

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 73014f788032
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/sync_clock.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,124 @@
+
+; 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/>.
+
+
+; Syncs RTC with PC
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 13/10/07
+; last updated: 08/08/31
+; known bugs:
+; ToDo: 
+
+; routine echoes the "b" command as ready signal
+; PC has to send 6 bytes
+; Byte1: hours
+; Byte2: minutes
+; Byte3: seconds
+; Byte4: month
+; Byte5: day
+; Byte6: year
+; All bytes will be checked for plausibility and the clock will be set
+; after a timeout of about 20ms, the routine ends
+
+sync_clock:
+	bcf		uart_settime				; clear flag
+	bcf		PIE1,RCIE					; no interrupt for UART
+	call	set_LEDusb			; LEDusb ON
+	bcf		PIR1,RCIF					; clear flag
+
+	movlw	"b"							; send echo
+	movwf	TXREG						
+	call	rs232_wait_tx					; wait for UART
+	
+	call	rs232_get_byte					; hours
+	movff	RCREG, hours
+
+	movlw	d'24'
+	cpfslt	hours
+	clrf	hours
+
+	call	rs232_get_byte					; minutes
+	movff	RCREG, mins
+
+	movlw	d'60'
+	cpfslt	mins
+	clrf	mins
+
+	call	rs232_get_byte					; seconds
+	movff	RCREG, secs
+
+	movlw	d'60'
+	cpfslt	secs
+	clrf	secs
+
+	call	rs232_get_byte					; month
+	movff	RCREG, month
+
+	movlw	d'12'
+	cpfsgt	month
+	bra	sync_clock0
+	movwf	month					
+
+sync_clock0:
+	call	rs232_get_byte					; day
+	movff	RCREG, day
+
+	movff	month,lo		; new month
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.28
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.30
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.30
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.30
+	dcfsnz	lo,F
+	movlw	.31
+	dcfsnz	lo,F
+	movlw	.30
+	dcfsnz	lo,F
+	movlw	.31
+	cpfsgt	day						; day ok?
+	bra	sync_clock1				; OK
+	movlw	.1						; not OK, set to 1st
+	movwf	day
+
+sync_clock1:
+	call	rs232_get_byte					; year
+	movff	RCREG, year
+
+	movlw	d'100'
+	cpfslt	year
+	clrf	year
+
+	call	clear_LEDusb				; LEDusb OFF
+	bcf		PIR1,RCIF					; clear flag
+	bsf		oneminupdate				; set flag, so new time and date will be updated in surfacemode at once
+	bsf		PIE1,RCIE					; enable interrupt for UART
+	goto	surfloop_loop					; return to surface loop
+
+