Mercurial > public > hwos_code
comparison src/i2c.asm @ 448:aadfe9f2edaf
work on new battery options
| author | heinrichsweikamp |
|---|---|
| date | Tue, 30 Aug 2016 17:26:21 +0200 |
| parents | 4b93354b7738 |
| children | 850c1f3c4824 |
comparison
equal
deleted
inserted
replaced
| 447:f2a1d535347f | 448:aadfe9f2edaf |
|---|---|
| 20 | 20 |
| 21 | 21 |
| 22 #include "hwos.inc" ; Mandatory header | 22 #include "hwos.inc" ; Mandatory header |
| 23 #include "wait.inc" | 23 #include "wait.inc" |
| 24 #include "math.inc" | 24 #include "math.inc" |
| 25 | |
| 26 #DEFINE battery_offset .29065 ; 65536-(3,1Ah/0,085mAh) | |
| 27 #DEFINE battery_devider .365 ; 3,1Ah/0,085mAh/100 [%] | |
| 28 | 25 |
| 29 i2c CODE | 26 i2c CODE |
| 30 | 27 |
| 31 WaitMSSP: | 28 WaitMSSP: |
| 32 decfsz i2c_temp,F ; check for timeout during I2C action | 29 decfsz i2c_temp,F ; check for timeout during I2C action |
| 498 rcall I2C_TX | 495 rcall I2C_TX |
| 499 movlw b'01100100' ; CTRL5 HIGH res, 6,25Hz | 496 movlw b'01100100' ; CTRL5 HIGH res, 6,25Hz |
| 500 rcall I2C_TX | 497 rcall I2C_TX |
| 501 init_compass1_common: | 498 init_compass1_common: |
| 502 ;movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) | 499 ;movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) |
| 503 movlw b'00000000' ; CTRL6 (+/-2 Gauss) | 500 ;movlw b'00000000' ; CTRL6 (+/-2 Gauss) |
| 501 movlw b'00100000' ; CTRL6 (+/-4 Gauss) | |
| 504 rcall I2C_TX | 502 rcall I2C_TX |
| 505 movlw b'00000000' ; CTRL7 Continuous Mode | 503 movlw b'00000000' ; CTRL7 Continuous Mode |
| 506 rcall I2C_TX | 504 rcall I2C_TX |
| 507 bsf SSP1CON2,PEN ; Stop condition | 505 bsf SSP1CON2,PEN ; Stop condition |
| 508 rcall WaitMSSP | 506 rcall WaitMSSP |
| 653 rcall WaitMSSP | 651 rcall WaitMSSP |
| 654 return | 652 return |
| 655 | 653 |
| 656 global lt2942_get_status | 654 global lt2942_get_status |
| 657 lt2942_get_status: ; Read status register | 655 lt2942_get_status: ; Read status register |
| 658 bcf rechargeable ; Clear flag | 656 bcf battery_gauge_available ; Clear flag |
| 659 clrf i2c_temp | 657 clrf i2c_temp |
| 660 movlw 0x00 ; Point to Status reg | 658 movlw 0x00 ; Point to Status reg |
| 661 call I2C_TX_GAUGE | 659 call I2C_TX_GAUGE |
| 662 call I2C_RX_GAUGE | 660 call I2C_RX_GAUGE |
| 663 movff SSP1BUF,WREG | 661 movff SSP1BUF,WREG |
| 664 btfss WREG,7 ; 2942 found? | 662 btfss WREG,7 ; 2942 found? |
| 665 bsf rechargeable ; Yes, set flag | 663 bsf battery_gauge_available ; Yes, set flag |
| 666 bsf SSP1CON2,PEN ; Stop condition | 664 bsf SSP1CON2,PEN ; Stop condition |
| 667 rcall WaitMSSP | 665 rcall WaitMSSP |
| 668 return | 666 return |
| 669 | 667 |
| 670 | 668 |
| 671 global lt2942_get_voltage | 669 global lt2942_get_voltage |
| 672 lt2942_get_voltage: ; Read battery voltage registers | 670 lt2942_get_voltage: ; Read battery voltage registers |
| 673 clrf i2c_temp | 671 clrf i2c_temp |
| 674 movlw 0x08 ; Point to voltage registers | 672 movlw 0x08 ; Point to voltage registers |
| 675 call I2C_TX_GAUGE | 673 rcall I2C_TX_GAUGE |
| 676 call I2C_RX_GAUGE | 674 rcall I2C_RX_GAUGE |
| 677 bsf SSP1CON2,ACKEN ; Master acknowlegde | 675 bsf SSP1CON2,ACKEN ; Master acknowlegde |
| 678 rcall WaitMSSP | 676 rcall WaitMSSP |
| 679 movff SSP1BUF,xA+1 | 677 movff SSP1BUF,xA+1 |
| 680 bsf SSP1CON2, RCEN ; Enable recieve mode | 678 bsf SSP1CON2, RCEN ; Enable recieve mode |
| 681 rcall WaitMSSP | 679 rcall WaitMSSP |
| 771 bsf SSP1CON2,PEN ; Stop condition | 769 bsf SSP1CON2,PEN ; Stop condition |
| 772 rcall WaitMSSP | 770 rcall WaitMSSP |
| 773 | 771 |
| 774 ; Compute batt_percent | 772 ; Compute batt_percent |
| 775 ; (charge-battery_offset)/365 | 773 ; (charge-battery_offset)/365 |
| 776 movlw LOW battery_offset | 774 movff battery_offset+0,sub_b+0 |
| 777 movwf sub_b+0 | 775 movff battery_offset+1,sub_b+1 |
| 778 movlw HIGH battery_offset | |
| 779 movwf sub_b+1 | |
| 780 call subU16 ; sub_c = sub_a - sub_b (with signed values) | 776 call subU16 ; sub_c = sub_a - sub_b (with signed values) |
| 781 | 777 |
| 782 clrf batt_percent ; Set to zero | 778 clrf batt_percent ; Set to zero |
| 783 btfsc neg_flag ; result negative? | 779 btfsc neg_flag ; result negative? |
| 784 return ; Yes, done. | 780 return ; Yes, done. |
| 785 | 781 |
| 786 ; > Zero, set batt_percent properly | 782 ; > Zero, set batt_percent properly |
| 787 movff sub_c+0,xA+0 | 783 movff sub_c+0,xA+0 |
| 788 movff sub_c+1,xA+1 | 784 movff sub_c+1,xA+1 |
| 789 movlw LOW battery_devider | 785 movff battery_capacity+0,xB+0 |
| 790 movwf xB+0 | 786 movff battery_capacity+1,xB+1 |
| 791 movlw HIGH battery_devider | |
| 792 movwf xB+1 | |
| 793 call div16x16 ;xA/xB=xC with xA+0 as remainder, uses divB as temp variable | 787 call div16x16 ;xA/xB=xC with xA+0 as remainder, uses divB as temp variable |
| 794 movff xC+0,batt_percent | 788 movff xC+0,batt_percent |
| 795 return | 789 return |
| 796 | 790 |
| 797 global lt2942_charge_done | 791 global lt2942_charge_done |
| 798 lt2942_charge_done: ; Reset accumulating registers to 0xFFFF | 792 lt2942_charge_done: ; Reset accumulating registers to 0xFFFF |
| 799 clrf i2c_temp | 793 clrf i2c_temp |
| 800 movlw 0x02 ; Point to accumulated charge registers | 794 movlw 0x02 ; Point to accumulated charge registers |
| 801 call I2C_TX_GAUGE | 795 rcall I2C_TX_GAUGE |
| 802 movlw 0xFF | 796 setf SSP1BUF ; Data Byte |
| 803 movff WREG, SSP1BUF ; Data Byte | |
| 804 rcall WaitMSSP | 797 rcall WaitMSSP |
| 805 rcall I2C_WaitforACK | 798 rcall I2C_WaitforACK |
| 806 movlw 0xFF | 799 setf SSP1BUF ; Data Byte |
| 807 movff WREG, SSP1BUF ; Data Byte | |
| 808 rcall WaitMSSP | 800 rcall WaitMSSP |
| 809 rcall I2C_WaitforACK | 801 rcall I2C_WaitforACK |
| 810 bsf SSP1CON2,PEN ; Stop condition | 802 bsf SSP1CON2,PEN ; Stop condition |
| 811 rcall WaitMSSP | 803 bra WaitMSSP; (and return) |
| 812 return | |
| 813 | 804 |
| 814 I2C_TX_GAUGE: ; Sends a byte to the LT2942 Gauge IC | 805 I2C_TX_GAUGE: ; Sends a byte to the LT2942 Gauge IC |
| 815 movwf i2c_temp+1 ; Data byte | 806 movwf i2c_temp+1 ; Data byte |
| 816 bsf SSP1CON2,SEN ; Start condition | 807 bsf SSP1CON2,SEN ; Start condition |
| 817 rcall WaitMSSP | 808 rcall WaitMSSP |
| 818 movlw b'11001000' ; Address byte + Write bit | 809 movlw b'11001000' ; Address byte + Write bit |
| 819 movwf SSP1BUF ; control byte | 810 movwf SSP1BUF ; control byte |
| 820 rcall WaitMSSP | 811 rcall WaitMSSP |
| 821 rcall I2C_WaitforACK | 812 rcall I2C_WaitforACK |
| 822 movff i2c_temp+1, SSP1BUF ; Data Byte | 813 movff i2c_temp+1, SSP1BUF ; Data Byte |
| 823 rcall WaitMSSP | 814 rcall WaitMSSP |
| 824 rcall I2C_WaitforACK | 815 bra I2C_WaitforACK ; (and return) |
| 825 return | |
| 826 | 816 |
| 827 I2C_RX_GAUGE: | 817 I2C_RX_GAUGE: |
| 828 bsf SSP1CON2,SEN ; Start condition | 818 bsf SSP1CON2,SEN ; Start condition |
| 829 rcall WaitMSSP | 819 rcall WaitMSSP |
| 830 movlw b'11001001' ; Address byte + Read bit | 820 movlw b'11001001' ; Address byte + Read bit |
| 831 movwf SSP1BUF ; control byte | 821 movwf SSP1BUF ; control byte |
| 832 rcall WaitMSSP | 822 rcall WaitMSSP |
| 833 rcall I2C_WaitforACK | 823 rcall I2C_WaitforACK |
| 834 bsf SSP1CON2, RCEN ; Enable recieve mode | 824 bsf SSP1CON2, RCEN ; Enable recieve mode |
| 835 rcall WaitMSSP | 825 bra WaitMSSP; (and return) |
| 836 return | 826 |
| 837 | 827 END |
| 838 | |
| 839 END |
