diff options
-rw-r--r-- | software/ihu/ihu.asm | 299 | ||||
-rw-r--r-- | software/ihu/rtc.inc | 207 | ||||
-rw-r--r-- | software/ihu/ttx.inc | 137 |
3 files changed, 348 insertions, 295 deletions
diff --git a/software/ihu/ihu.asm b/software/ihu/ihu.asm index 2b33219..48045ce 100644 --- a/software/ihu/ihu.asm +++ b/software/ihu/ihu.asm @@ -220,6 +220,8 @@ init bsf INTCON,GIE clrf TMP + + call rtc_init goto main ;; ------------------------------------- @@ -255,302 +257,11 @@ uart_rx_fe return ;; ------------------------------------- -ttx_send_byte - bsf STATUS,RP0 - bcf TRISD,TTX_SDA - bcf STATUS,RP0 - movwf TTX_BYTE - xorwf TTX_CSUM,f - movlw .8 - movwf TTX_BIT_CNT -ttx_send_next_bit - btfsc TTX_BYTE,7 - bsf PORTD,TTX_SDA - btfss TTX_BYTE,7 - bcf PORTD,TTX_SDA - bsf PORTD,TTX_SCL - nop - nop - nop - bcf PORTD,TTX_SCL - nop - nop - nop - nop - rlf TTX_BYTE,f - decfsz TTX_BIT_CNT,f - goto ttx_send_next_bit - bsf STATUS,RP0 - bsf TRISD,TTX_SDA - bcf STATUS,RP0 - return - - ;; ------------------------------------- -ttx_recv_byte - movlw .8 - movwf TTX_BIT_CNT -ttx_recv_next_bit - bsf PORTD,TTX_SCL - nop - nop - nop - bcf PORTD,TTX_SCL - nop - nop - nop - nop - nop - rlf TTX_BYTE,f - btfsc PORTD,TTX_SDA - bsf TTX_BYTE,0 - btfss PORTD,TTX_SDA - bcf TTX_BYTE,0 - decfsz TTX_BIT_CNT,f - goto ttx_recv_next_bit - return - - ;; ------------------------------------- -ttx_break - movlw .13 - movwf TTX_BIT_CNT -ttx_wait_octet - decfsz TTX_BIT_CNT,f - goto ttx_wait_octet - return - - ;; ------------------------------------- -ttx_send_frame - movwf TTX_BYTE - andlw b'00001111' - movwf TTX_BYTE_CNT - bsf PORTD,TTX_SCL - movlw .3 - bcf PORTD,TTX_SCL - call wait_ms - - clrf TTX_CSUM - movf TTX_BYTE,w - call ttx_send_byte - - movf TTX_BYTE_CNT,f - btfsc STATUS,Z - return - -ttx_next_byte - call ttx_break - movf INDF,w - call ttx_send_byte - - incf FSR,f - decfsz TTX_BYTE_CNT,f - goto ttx_next_byte - - call ttx_break - call ttx_recv_byte - movf TTX_BYTE,w - xorwf TTX_CSUM,w - btfss STATUS,Z - goto ttx_csum_error - movlw '.' - movwf TXREG - return - -ttx_csum_error - movlw 'E' - movwf TXREG - return - - ;; ------------------------------------- -i2c_start - bsf STATUS,RP0 - bcf TRISB,RTC_SDA - nop - bcf TRISB,RTC_SCL - bcf STATUS,RP0 - return - - ;; ------------------ -i2c_restart - bsf STATUS,RP0 - bsf TRISB,RTC_SDA - nop - bsf TRISB,RTC_SCL - nop - nop - nop - bcf TRISB,RTC_SDA - nop - bcf TRISB,RTC_SCL - bcf STATUS,RP0 - return - - ;; ------------------ -i2c_stop - bsf STATUS,RP0 - bsf TRISB,RTC_SCL - nop - bsf TRISB,RTC_SDA - bcf STATUS,RP0 - return - - ;; ------------------ -i2c_send_byte - movwf RTC_BYTE - movlw .8 - movwf RTC_BIT_CNT - bsf STATUS,RP0 -i2c_send_byte_next - btfss RTC_BYTE,7 - bcf TRISB,RTC_SDA - btfsc RTC_BYTE,7 - bsf TRISB,RTC_SDA - bsf TRISB,RTC_SCL - nop - nop - bcf TRISB,RTC_SCL - rlf RTC_BYTE,f - decfsz RTC_BIT_CNT,f - goto i2c_send_byte_next - - nop - nop - bsf TRISB,RTC_SDA - bsf TRISB,RTC_SCL - bcf STATUS,RP0 - movf PORTB,w - bsf STATUS,RP0 - bcf TRISB,RTC_SCL - bcf TRISB,RTC_SDA - bcf STATUS,RP0 - andlw b'00010000' - movwf RTC_BYTE - swapf RTC_BYTE,f - return - - ;; ------------------ -i2c_recv_byte - clrf RTC_BYTE - movlw .8 - movwf RTC_BIT_CNT - bsf STATUS,RP0 - bsf TRISB,RTC_SDA -i2c_recv_byte_loop - bsf TRISB,RTC_SCL - bcf STATUS,RP0 - btfsc PORTB,RTC_SDA - bsf RTC_BYTE,0 - bsf STATUS,RP0 - bcf TRISB,RTC_SCL - decfsz RTC_BIT_CNT,f - goto i2c_recv_byte_next - - bcf TRISB,RTC_SDA - bcf STATUS,RP0 - return - -i2c_recv_byte_next - rlf RTC_BYTE,f - goto i2c_recv_byte_loop - - ;; ------------------ -i2c_ack - bsf STATUS,RP0 - bcf TRISB,RTC_SDA - bsf TRISB,RTC_SCL - nop - nop - bcf TRISB,RTC_SCL - bcf STATUS,RP0 - return - - ;; ------------------ -i2c_nack - bsf STATUS,RP0 - bsf TRISB,RTC_SDA - bsf TRISB,RTC_SCL - nop - nop - bcf TRISB,RTC_SCL - bcf TRISB,RTC_SDA - bcf STATUS,RP0 - return + include "ttx.inc" ;; ------------------------------------- -rtc_init - call i2c_start - - movlw RTC_ADDR_W - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - movlw RTC_REG_STAT - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - call i2c_restart - - movlw RTC_ADDR_R - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - call i2c_recv_byte - call i2c_nack + include "rtc.inc" - btfsc RTC_BYTE,7 - goto rtc_init_after_clock_fail - - call i2c_stop - movlw '.' - movwf TXREG - return - -rtc_init_after_clock_fail - call i2c_restart - - movlw RTC_ADDR_W - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - movlw RTC_REG_SEC - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - movlw .14 - movwf RTC_BYTE_CNT -rtc_init_clear - clrw - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - decfsz RTC_BYTE_CNT,f - goto rtc_init_clear - - movlw b'00000001' - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - clrw - call i2c_send_byte - btfsc RTC_BYTE,0 - goto rtc_init_error_ack - - call i2c_stop - movlw 'c' - movwf TXREG - return - -rtc_init_error_ack - call i2c_stop - movlw 'E' - movwf TXREG - return - ;; ------------------------------------- ;; MAINLOOP main @@ -558,8 +269,6 @@ main btfsc STATUS,Z goto main - call rtc_init - clrf TMP goto main diff --git a/software/ihu/rtc.inc b/software/ihu/rtc.inc new file mode 100644 index 0000000..18ac185 --- /dev/null +++ b/software/ihu/rtc.inc @@ -0,0 +1,207 @@ + ;; + ;; mur.sat + ;; + ;; Somewhen in the year 2011, mur.at will have a nano satellite launched + ;; into a low earth orbit (310 km above the surface of our planet). The + ;; satellite itself is a TubeSat personal satellite kit, developed and + ;; launched by interorbital systems. mur.sat is a joint venture of mur.at, + ;; ESC im Labor and realraum. + ;; + ;; Please visit the project hompage at sat.mur.at for further information. + ;; + ;; + ;; Copyright (C) 2011 Christian Pointner <equinox@mur.at> + ;; + ;; This file is part of mur.sat. + ;; + ;; mur.sat 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 + ;; any later version. + ;; + ;; mur.sat 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 mur.sat. If not, see <http://www.gnu.org/licenses/>. + ;; + + ;; ------------------------------------- +i2c_start + bsf STATUS,RP0 + bcf TRISB,RTC_SDA + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_restart + bsf STATUS,RP0 + bsf TRISB,RTC_SDA + nop + bsf TRISB,RTC_SCL + nop + nop + nop + bcf TRISB,RTC_SDA + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_stop + bsf STATUS,RP0 + bsf TRISB,RTC_SCL + nop + bsf TRISB,RTC_SDA + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_send_byte + movwf RTC_BYTE + movlw .8 + movwf RTC_BIT_CNT + bsf STATUS,RP0 +i2c_send_byte_next + btfss RTC_BYTE,7 + bcf TRISB,RTC_SDA + btfsc RTC_BYTE,7 + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + rlf RTC_BYTE,f + decfsz RTC_BIT_CNT,f + goto i2c_send_byte_next + + nop + nop + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + bcf STATUS,RP0 + movf PORTB,w + bsf STATUS,RP0 + bcf TRISB,RTC_SCL + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + andlw b'00010000' + movwf RTC_BYTE + swapf RTC_BYTE,f + return + + ;; ------------------ +i2c_recv_byte + clrf RTC_BYTE + movlw .8 + movwf RTC_BIT_CNT + bsf STATUS,RP0 + bsf TRISB,RTC_SDA +i2c_recv_byte_loop + bsf TRISB,RTC_SCL + bcf STATUS,RP0 + btfsc PORTB,RTC_SDA + bsf RTC_BYTE,0 + bsf STATUS,RP0 + bcf TRISB,RTC_SCL + decfsz RTC_BIT_CNT,f + goto i2c_recv_byte_next + + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + return + +i2c_recv_byte_next + rlf RTC_BYTE,f + goto i2c_recv_byte_loop + + ;; ------------------ +i2c_ack + bsf STATUS,RP0 + bcf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + bcf STATUS,RP0 + return + + ;; ------------------ +i2c_nack + bsf STATUS,RP0 + bsf TRISB,RTC_SDA + bsf TRISB,RTC_SCL + nop + nop + bcf TRISB,RTC_SCL + bcf TRISB,RTC_SDA + bcf STATUS,RP0 + return + + ;; ------------------------------------- +rtc_init + call i2c_start + + movlw RTC_ADDR_W + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw RTC_REG_STAT + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + call i2c_restart + + movlw RTC_ADDR_R + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + call i2c_recv_byte + call i2c_nack + + btfsc RTC_BYTE,7 + goto rtc_init_after_clock_fail + + call i2c_stop + return + +rtc_init_after_clock_fail + call i2c_restart + + movlw RTC_ADDR_W + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw RTC_REG_SEC + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + + movlw .16 + movwf RTC_BYTE_CNT +rtc_init_clear + clrw + call i2c_send_byte + btfsc RTC_BYTE,0 + goto rtc_init_error_ack + decfsz RTC_BYTE_CNT,f + goto rtc_init_clear + + call i2c_stop + return + +rtc_init_error_ack + call i2c_stop + ;; TODO: add error handling + return + + ;; ------------------------------------- diff --git a/software/ihu/ttx.inc b/software/ihu/ttx.inc new file mode 100644 index 0000000..db53f89 --- /dev/null +++ b/software/ihu/ttx.inc @@ -0,0 +1,137 @@ + ;; + ;; mur.sat + ;; + ;; Somewhen in the year 2011, mur.at will have a nano satellite launched + ;; into a low earth orbit (310 km above the surface of our planet). The + ;; satellite itself is a TubeSat personal satellite kit, developed and + ;; launched by interorbital systems. mur.sat is a joint venture of mur.at, + ;; ESC im Labor and realraum. + ;; + ;; Please visit the project hompage at sat.mur.at for further information. + ;; + ;; + ;; Copyright (C) 2011 Christian Pointner <equinox@mur.at> + ;; + ;; This file is part of mur.sat. + ;; + ;; mur.sat 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 + ;; any later version. + ;; + ;; mur.sat 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 mur.sat. If not, see <http://www.gnu.org/licenses/>. + ;; + + ;; ------------------------------------- +ttx_send_byte + bsf STATUS,RP0 + bcf TRISD,TTX_SDA + bcf STATUS,RP0 + movwf TTX_BYTE + xorwf TTX_CSUM,f + movlw .8 + movwf TTX_BIT_CNT +ttx_send_next_bit + btfsc TTX_BYTE,7 + bsf PORTD,TTX_SDA + btfss TTX_BYTE,7 + bcf PORTD,TTX_SDA + bsf PORTD,TTX_SCL + nop + nop + nop + bcf PORTD,TTX_SCL + nop + nop + nop + nop + rlf TTX_BYTE,f + decfsz TTX_BIT_CNT,f + goto ttx_send_next_bit + bsf STATUS,RP0 + bsf TRISD,TTX_SDA + bcf STATUS,RP0 + return + + ;; ------------------------------------- +ttx_recv_byte + movlw .8 + movwf TTX_BIT_CNT +ttx_recv_next_bit + bsf PORTD,TTX_SCL + nop + nop + nop + bcf PORTD,TTX_SCL + nop + nop + nop + nop + nop + rlf TTX_BYTE,f + btfsc PORTD,TTX_SDA + bsf TTX_BYTE,0 + btfss PORTD,TTX_SDA + bcf TTX_BYTE,0 + decfsz TTX_BIT_CNT,f + goto ttx_recv_next_bit + return + + ;; ------------------------------------- +ttx_break + movlw .13 + movwf TTX_BIT_CNT +ttx_wait_octet + decfsz TTX_BIT_CNT,f + goto ttx_wait_octet + return + + ;; ------------------------------------- +ttx_send_frame + movwf TTX_BYTE + andlw b'00001111' + movwf TTX_BYTE_CNT + bsf PORTD,TTX_SCL + movlw .3 + bcf PORTD,TTX_SCL + call wait_ms + + clrf TTX_CSUM + movf TTX_BYTE,w + call ttx_send_byte + + movf TTX_BYTE_CNT,f + btfsc STATUS,Z + return + +ttx_next_byte + call ttx_break + movf INDF,w + call ttx_send_byte + + incf FSR,f + decfsz TTX_BYTE_CNT,f + goto ttx_next_byte + + call ttx_break + call ttx_recv_byte + movf TTX_BYTE,w + xorwf TTX_CSUM,w + btfss STATUS,Z + goto ttx_csum_error + movlw '.' + movwf TXREG + return + +ttx_csum_error + movlw 'E' + movwf TXREG + return + + ;; ------------------------------------- |