Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/tempcomp.asm @ 0:96a35aeda5f2
Initial setup
author | heinrichsweikamp |
---|---|
date | Tue, 12 Jan 2010 15:05:59 +0100 |
parents | |
children | 2b5c52ae3923 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/tempcomp.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,81 @@ + +; 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/>. + + +; routine for extra temperature compensation +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 01/12/08 +; last updated: 08/08/31 +; known bugs: +; ToDo: + +; routine echoes the "f" command as ready signal +; PC has to send 2 bytes containing the actual temperature in 0.1C +; Byte1: low +; Byte2: high + + +compensate_temperature: + bcf uart_compensate_temp ; clear flag + bcf PIE1,RCIE ; no interrupt for UART + call set_LEDusb ; LEDusb ON + bcf PIR1,RCIF ; clear flag + + movlw "f" ; send echo + movwf TXREG + call rs232_wait_tx ; wait for UART + + call rs232_get_byte ; low byte + movff RCREG, lo + + call rs232_get_byte ; high byte + movff RCREG, hi + + clrf temperature_correction ; wait for uncompensated temperature value! + WAITMS d'250' ; wait for new temperature + WAITMS d'250' + WAITMS d'250' + WAITMS d'250' + + movff lo,sub_a+0 ; calculate difference + movff hi,sub_a+1 + movff temperature+0, sub_b+0 + movff temperature+1, sub_b+1 + call sub16 ; sub_c = sub_a - sub_b + + movf sub_c+0,W + btfsc neg_flag ; compensate negative? + movlw d'0' ; use zero compensation! + movwf sub_c+0 + + movff sub_c+0,TXREG ; Send answer + + movff sub_c+0,EEDATA ; store low byte only! + movff sub_c+0,temperature_correction ; no reboot required then... + movlw 0x01 + movwf EEADRH + movlw 0x00 + movwf EEADR + call write_eeprom ; stores in internal eeprom + + movlw 0x00 + movwf EEADRH ; reset high address byte + + call clear_LEDusb ; LEDusb OFF + bcf PIR1,RCIF ; clear flag + bsf PIE1,RCIE ; enable interrupt for UART + goto surfloop_loop ; return to surface loop