Mercurial > public > hwos_code
annotate src/i2c.asm @ 567:4ce70e3f00be
minor
| author | heinrichsweikamp |
|---|---|
| date | Thu, 08 Feb 2018 13:23:53 +0100 |
| parents | 0ba88db66492 |
| children | b8f45b57302d |
| rev | line source |
|---|---|
| 0 | 1 ;============================================================================= |
| 2 ; | |
| 3 ; File i2c.asm | |
| 4 ; | |
| 560 | 5 ; I2C Interface |
| 6 ; | |
| 7 ; Compass0 | |
| 0 | 8 ; HMC5883L's read address (8-Bit): 0x3D |
| 9 ; HMC5883L's write address (8-Bit): 0x3C | |
| 10 ; MMA8452Q's read address (8-Bit): 0x39 | |
| 11 ; MMA8452Q's write address (8-Bit): 0x38 | |
| 12 ; | |
| 560 | 13 ; Compass1 |
| 427 | 14 ; LSM303D's read address (8-Bit): 0x3D |
| 15 ; LSM303D's write address (8-Bit): 0x3C | |
| 16 ; | |
| 560 | 17 ; Compass2 |
| 18 ; LSM303AGR's Compass read address (8-Bit): 0x3D | |
| 19 ; LSM303AGR's Compass write address (8-Bit): 0x3C | |
| 20 ; LSM303AGR's Acceleration read address (8-Bit): 0x33 | |
| 21 ; LSM303AGR's Acceleration write address (8-Bit): 0x32 | |
| 22 ; | |
| 23 ; RX Circuity | |
| 24 ; RX Circuity read address (8-Bit): 0x51 | |
| 25 ; RX Circuity write address (8-Bit): 0x50 | |
| 26 ; | |
| 27 ; | |
| 0 | 28 ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. |
| 29 ;============================================================================= | |
| 30 ; HISTORY | |
| 31 ; 2012-08-22 : [mH] Creation | |
| 565 | 32 ; 2018-02-18 : [mH] Sync with hwOS Sport release |
| 0 | 33 |
| 34 | |
| 275 | 35 #include "hwos.inc" ; Mandatory header |
| 0 | 36 #include "wait.inc" |
| 113 | 37 #include "math.inc" |
| 560 | 38 #include "external_flash.inc" |
| 113 | 39 |
| 0 | 40 i2c CODE |
| 41 | |
| 42 WaitMSSP: | |
| 43 decfsz i2c_temp,F ; check for timeout during I2C action | |
| 560 | 44 bra WaitMSSP2 |
| 45 bra I2CFail ; timeout occured | |
| 0 | 46 WaitMSSP2: |
| 560 | 47 btfss PIR1,SSP1IF |
| 48 bra WaitMSSP | |
| 0 | 49 clrf i2c_temp |
| 560 | 50 bcf PIR1,SSP1IF |
| 0 | 51 return |
| 52 | |
| 53 I2C_WaitforACK: | |
| 560 | 54 btfss SSP1CON2,ACKSTAT ; checks for ACK bit from slave |
| 55 return | |
| 0 | 56 I2CFail: |
| 57 rcall I2CReset ; I2C Reset | |
| 560 | 58 bcf PIR1,SSP1IF |
| 0 | 59 clrf i2c_temp |
| 560 | 60 bsf i2c_error_flag ; set error flag |
| 0 | 61 return |
| 62 | |
| 63 I2CReset: ; Something went wrong (Slave holds SDA low?) | |
| 64 clrf SSP1CON1 ; wake-up slave and reset entire module | |
| 65 clrf SSP1CON2 | |
| 66 clrf SSP1STAT | |
| 67 bcf TRISC,3 ; SCL OUTPUT | |
| 68 bsf TRISC,4 ; SDA Input | |
| 69 bcf PORTC,3 | |
| 70 movlw d'9' | |
| 71 movwf i2c_temp ; clock-out 9 clock cycles manually | |
| 72 I2CReset_1: | |
| 73 bsf PORTC,3 ; SCL=1 | |
| 74 nop | |
| 75 nop | |
| 76 nop | |
| 77 nop | |
| 78 btfsc PORTC,4 ; SDA=1? | |
| 79 bra I2CReset_2 ; =1, SDA has been released from slave | |
| 80 bcf PORTC,3 ; SCL=0 | |
| 81 nop | |
| 82 nop | |
| 83 bcf PORTC,3 | |
| 84 nop | |
| 85 nop | |
| 86 decfsz i2c_temp,F | |
| 87 bra I2CReset_1 ; check for nine clock cycles | |
| 88 I2CReset_2: | |
| 89 bsf TRISC,3 ; SCL Input | |
| 90 clrf SSP1CON1 ; setup I²C Mode | |
| 91 WAITMS d'10' ; Reset-Timeout for I2C devices | |
| 92 movlw b'00000000' ; with slew rate control | |
| 560 | 93 movwf SSP1STAT |
| 0 | 94 movlw b'00101000' |
| 95 movwf SSP1CON1 | |
| 96 movlw b'00000000' | |
| 97 movwf SSP1CON2 | |
| 98 movlw 0x27 | |
| 99 movwf SSP1ADD | |
| 100 return | |
| 101 | |
| 102 I2C_TX: | |
| 103 movwf SSP1BUF | |
| 104 rcall WaitMSSP | |
| 105 bra I2C_WaitforACK ; Returns... | |
| 106 | |
| 107 I2C_TwoBytesRX_div16: ; Get two bytes and devide lo:hi/16 (signed) | |
| 108 rcall I2C_OneByteRX ; Get one byte | |
| 109 movff SSP1BUF,hi ; Data Byte | |
| 110 rcall I2C_OneByteRX ; Get one byte | |
| 111 movff SSP1BUF,lo ; Data Byte | |
| 112 I2C_TwoBytesRX_div16_2: ; devide lo:hi/16 (signed) only | |
| 113 bcf STATUS,C | |
| 114 btfsc hi,7 ; Copy sign bit to carry | |
| 115 bsf STATUS,C | |
| 116 rrcf hi ; /2 | |
| 427 | 117 rrcf lo |
| 118 I2C_TwoBytesRX_div8_2: ; devide lo:hi/8 (signed) only | |
| 0 | 119 bcf STATUS,C |
| 120 btfsc hi,7 ; Copy sign bit to carry | |
| 121 bsf STATUS,C | |
| 122 rrcf hi ; /4 | |
| 427 | 123 rrcf lo |
| 0 | 124 bcf STATUS,C |
| 125 btfsc hi,7 ; Copy sign bit to carry | |
| 126 bsf STATUS,C | |
| 127 rrcf hi ; /8 | |
| 128 rrcf lo | |
| 129 bcf STATUS,C | |
| 130 btfsc hi,7 ; Copy sign bit to carry | |
| 131 bsf STATUS,C | |
| 132 rrcf hi ; /16 | |
| 133 rrcf lo | |
| 134 return | |
| 135 | |
| 136 global I2C_RX_accelerometer | |
| 137 I2C_RX_accelerometer: | |
| 560 | 138 btfsc compass_type2 ; compass2 |
| 139 bra I2C_RX_accelerometer_compass2 ; yes | |
| 427 | 140 btfsc compass_type ; compass1? |
| 141 bra I2C_RX_accelerometer_compass1 ; yes | |
| 560 | 142 I2C_RX_accelerometer_compass0: |
| 427 | 143 bsf SSP1CON2,SEN ; Start condition |
| 144 rcall WaitMSSP | |
| 145 movlw 0x38 ; address | |
| 0 | 146 rcall I2C_TX |
| 427 | 147 movlw 0x00 |
| 0 | 148 rcall I2C_TX |
| 427 | 149 bsf SSP1CON2,RSEN ; Repeated start condition (!) |
| 150 rcall WaitMSSP | |
| 151 movlw 0x39 ; address | |
| 0 | 152 rcall I2C_TX |
| 153 | |
| 158 | 154 rcall I2C_OneByteRX ; Get Status Byte |
| 155 movf SSP1BUF,W | |
| 156 | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
157 ; Non-flipped screen: |
| 0 | 158 ; Chip orientation on the PCB requires |
| 159 ; Original = Corrected | |
| 160 ; x = -x | |
| 161 ; y = -y | |
| 162 ; z = -z | |
| 163 | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
164 ; Flipped screen: |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
165 ; Chip orientation on the PCB requires |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
166 ; Original = Corrected |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
167 ; x = x |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
168 ; y = y |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
169 ; z = -z |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
170 |
| 0 | 171 rcall I2C_TwoBytesRX_div16 ; Get two bytes and devide /16 (signed) |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
172 btfsc flip_screen ; 180° rotation ? |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
173 bra I2C_RX_accelerometer2 ; Yes |
| 0 | 174 comf hi ; 16bit sign change. |
| 175 negf lo | |
| 176 btfsc STATUS,C ; Carry to propagate ? | |
| 177 incf hi,F ; YES: do it. | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
178 I2C_RX_accelerometer2: |
| 0 | 179 movff lo,accel_DX+0 |
| 180 movff hi,accel_DX+1 ; Copy result | |
| 181 | |
| 182 rcall I2C_TwoBytesRX_div16 ; Get two bytes and devide /16 (signed) | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
183 btfsc flip_screen ; 180° rotation ? |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
184 bra I2C_RX_accelerometer3 ; Yes |
| 0 | 185 comf hi ; 16bit sign change. |
| 186 negf lo | |
| 187 btfsc STATUS,C ; Carry to propagate ? | |
| 188 incf hi,F ; YES: do it. | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
189 I2C_RX_accelerometer3: |
| 0 | 190 movff lo,accel_DY+0 |
| 191 movff hi,accel_DY+1 ; Copy result | |
| 192 | |
| 193 rcall I2C_OneByteRX ; Get one byte | |
| 194 movff SSP1BUF,hi ; Data Byte | |
| 195 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 196 rcall WaitMSSP | |
| 197 ; According to datasheet there should be no Master Acknowlegde for the last Byte (accel_DZ+0)... | |
| 198 movff SSP1BUF,lo ; Data Byte | |
| 199 | |
| 200 rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only | |
| 201 comf hi ; 16bit sign change. | |
| 202 negf lo | |
| 203 btfsc STATUS,C ; Carry to propagate ? | |
| 204 incf hi,F ; YES: do it. | |
| 205 movff lo,accel_DZ+0 | |
| 206 movff hi,accel_DZ+1 ; Copy result | |
| 207 | |
| 208 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 209 bra WaitMSSP ; (And return) |
| 0 | 210 |
| 427 | 211 I2C_RX_accelerometer_compass1: |
| 212 bsf SSP1CON2,SEN ; Start condition | |
| 213 rcall WaitMSSP | |
| 214 movlw 0x3C ; address | |
| 215 rcall I2C_TX | |
| 216 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | |
| 217 rcall I2C_TX | |
| 218 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
| 219 rcall WaitMSSP | |
| 220 movlw 0x3D ; address | |
| 560 | 221 I2C_RX_accelerometer_compass1_xx: ; compass2 continues here... |
| 427 | 222 rcall I2C_TX |
| 223 ; Non-flipped screen: | |
| 224 ; Chip orientation on the PCB requires | |
| 225 ; Original = Corrected | |
| 560 | 226 ; x = -x (Compass 1) |
| 227 ; x = x (Compass 2) | |
| 427 | 228 ; y = -y |
| 229 ; z = -z | |
| 230 | |
| 231 ; Flipped screen: | |
| 232 ; Chip orientation on the PCB requires | |
| 233 ; Original = Corrected | |
| 560 | 234 ; x = x (Compass 1) |
| 235 ; x = -x (Compass 2) | |
| 427 | 236 ; y = y |
| 237 ; z = -z | |
| 238 | |
| 239 ; Dump the accelerator data | |
| 240 rcall I2C_OneByteRX | |
| 241 movff SSP1BUF,lo ;accel_DX+0 | |
| 242 rcall I2C_OneByteRX | |
| 243 movff SSP1BUF,hi ;accel_DX+1 | |
| 244 rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only | |
| 560 | 245 btfss compass_type2 ; compass 2? |
| 246 bra I2C_RX_accelerometer1_c1 ; No, compass 1 | |
| 247 ; compass 2 | |
| 248 btfss flip_screen ; 180° rotation ? | |
| 249 bra I2C_RX_accelerometer2_c1 ; No, continue with normal compass1 routines for Y and Z | |
| 250 ; flipped compass 2, negate x | |
| 251 comf hi ; 16bit sign change. | |
| 252 negf lo | |
| 253 btfsc STATUS,C ; Carry to propagate ? | |
| 254 incf hi,F ; YES: do it. | |
| 255 bra I2C_RX_accelerometer2_c1 ; continue with normal compass1 routines for Y and Z | |
| 256 | |
| 257 I2C_RX_accelerometer1_c1: | |
| 427 | 258 btfsc flip_screen ; 180° rotation ? |
| 259 bra I2C_RX_accelerometer2_c1 ; Yes | |
| 560 | 260 ; non-flipped compass 1, negate x |
| 427 | 261 comf hi ; 16bit sign change. |
| 262 negf lo | |
| 263 btfsc STATUS,C ; Carry to propagate ? | |
| 264 incf hi,F ; YES: do it. | |
| 265 I2C_RX_accelerometer2_c1: | |
| 560 | 266 ; flipped compass 1, non-flipped compass 2 |
| 427 | 267 movff lo,accel_DX+0 |
| 268 movff hi,accel_DX+1 ; Copy result | |
| 269 rcall I2C_OneByteRX | |
| 270 movff SSP1BUF,lo ;accel_DY+0 | |
| 271 rcall I2C_OneByteRX | |
| 272 movff SSP1BUF,hi ;accel_DY+1 | |
| 273 | |
| 274 rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only | |
| 275 btfsc flip_screen ; 180° rotation ? | |
| 276 bra I2C_RX_accelerometer3_c1 ; Yes | |
| 277 comf hi ; 16bit sign change. | |
| 278 negf lo | |
| 279 btfsc STATUS,C ; Carry to propagate ? | |
| 280 incf hi,F ; YES: do it. | |
| 281 I2C_RX_accelerometer3_c1: | |
| 282 movff lo,accel_DY+0 | |
| 283 movff hi,accel_DY+1 ; Copy result | |
| 284 | |
| 285 rcall I2C_OneByteRX | |
| 286 movff SSP1BUF,lo ;accel_DZ+0 | |
| 287 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 288 rcall WaitMSSP | |
| 289 ; According to datasheet there should be no Master Acknowlegde for the last Byte (accel_DZ+1)... | |
| 290 movff SSP1BUF,hi ;accel_DZ+1 | |
| 291 bsf SSP1CON2,PEN ; Stop condition | |
| 292 rcall WaitMSSP | |
| 293 rcall I2C_TwoBytesRX_div16_2; devide lo:hi/16 (signed) only | |
| 294 comf hi ; 16bit sign change for Z | |
| 295 negf lo | |
| 296 btfsc STATUS,C ; Carry to propagate ? | |
| 297 incf hi,F ; YES: do it. | |
| 298 movff lo,accel_DZ+0 | |
| 299 movff hi,accel_DZ+1 ; Copy result | |
| 300 return | |
| 301 | |
| 560 | 302 I2C_RX_accelerometer_compass2: |
| 303 bsf SSP1CON2,SEN ; Start condition | |
| 304 rcall WaitMSSP | |
| 305 movlw 0x32 ; address | |
| 306 rcall I2C_TX | |
| 307 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | |
| 308 rcall I2C_TX | |
| 309 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
| 310 rcall WaitMSSP | |
| 311 movlw 0x33 ; address | |
| 312 bra I2C_RX_accelerometer_compass1_xx | |
| 313 | |
| 0 | 314 I2C_OneByteRX: |
| 427 | 315 bsf SSP1CON2, RCEN ; Enable recieve mode |
| 316 rcall WaitMSSP | |
| 317 bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 318 bra WaitMSSP ; And return! | |
| 0 | 319 |
| 320 global I2C_RX_compass | |
| 321 I2C_RX_compass: | |
| 560 | 322 btfsc compass_type2 ; compass2 |
| 323 bra I2C_RX_compass2 ; yes | |
| 427 | 324 btfsc compass_type ; compass1? |
| 325 bra I2C_RX_compass1 ; yes | |
| 560 | 326 I2C_RX_compass0: |
| 427 | 327 bsf SSP1CON2,SEN ; Start condition |
| 328 rcall WaitMSSP | |
| 329 movlw 0x3C ; address | |
| 0 | 330 rcall I2C_TX |
| 427 | 331 movlw 0x03 |
| 332 rcall I2C_TX | |
| 333 bsf SSP1CON2,PEN ; Stop condition | |
| 334 rcall WaitMSSP | |
| 0 | 335 |
| 560 | 336 bcf PIR1,SSP1IF |
| 427 | 337 bsf SSP1CON2,SEN ; Start condition |
| 338 rcall WaitMSSP | |
| 339 movlw 0x3D ; address | |
| 0 | 340 rcall I2C_TX |
| 341 | |
| 342 ; Compass IC sends data in following order: | |
| 343 ; x MSB | |
| 344 ; x LSB | |
| 345 ; z MSB | |
| 346 ; z LSB | |
| 347 ; y MSB | |
| 348 ; y LSB | |
| 349 | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
350 ; Non-flipped screen |
| 0 | 351 ; Chip orientation on the PCB requires |
| 352 ; Original = Corrected | |
| 353 ; x = -y | |
| 354 ; z = z | |
| 355 ; y = x | |
| 356 | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
357 ; Flipped screen |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
358 ; Chip orientation on the PCB requires |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
359 ; Original = Corrected |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
360 ; x = y |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
361 ; z = z |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
362 ; y = -x |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
363 |
| 0 | 364 rcall I2C_OneByteRX ; Get one byte |
| 560 | 365 movff SSP1BUF,compass_DY+1; Data Byte |
| 0 | 366 rcall I2C_OneByteRX ; Get one byte |
| 560 | 367 movff SSP1BUF,compass_DY+0; Data Byte |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
368 btfsc flip_screen ; 180° rotation ? |
| 560 | 369 bra I2C_RX_compass0_2 ; Yes |
| 0 | 370 banksel compass_DY |
| 371 comf compass_DY+1 ; 16bit sign change. | |
| 372 negf compass_DY+0 | |
| 373 btfsc STATUS,C ; Carry to propagate ? | |
| 374 incf compass_DY+1,F ; YES: do it. | |
| 560 | 375 I2C_RX_compass0_2: |
| 0 | 376 banksel common |
| 377 rcall I2C_OneByteRX ; Get one byte | |
| 427 | 378 movff SSP1BUF,compass_DZ+1; Data Byte |
| 0 | 379 rcall I2C_OneByteRX ; Get one byte |
| 427 | 380 movff SSP1BUF,compass_DZ+0; Data Byte |
| 0 | 381 rcall I2C_OneByteRX ; Get one byte |
| 427 | 382 movff SSP1BUF,compass_DX+1; Data Byte |
| 383 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 384 rcall WaitMSSP | |
| 385 movff SSP1BUF,compass_DX+0; Data Byte | |
| 386 bsf SSP1CON2,PEN ; Stop condition | |
| 387 rcall WaitMSSP | |
|
166
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
388 btfss flip_screen ; 180° rotation ? |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
389 return ; No, done. |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
390 ; Yes, flip X |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
391 banksel compass_DX |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
392 comf compass_DX+1 ; 16bit sign change. |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
393 negf compass_DX+0 |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
394 btfsc STATUS,C ; Carry to propagate ? |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
395 incf compass_DX+1,F ; YES: do it. |
|
30ebaf72170d
BUGFIX: Flip compass with flipped screen, too
heinrichsweikamp
parents:
158
diff
changeset
|
396 banksel common |
| 0 | 397 return |
| 427 | 398 |
| 399 I2C_RX_compass1: ; New compass | |
| 400 bsf SSP1CON2,SEN ; Start condition | |
| 401 rcall WaitMSSP | |
| 402 movlw 0x3C ; address | |
| 403 rcall I2C_TX | |
| 404 movlw b'10001000' ; 0x08 with auto-increment (MSB=1) | |
| 405 rcall I2C_TX | |
| 406 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
| 407 rcall WaitMSSP | |
| 408 movlw 0x3D ; address | |
| 409 rcall I2C_TX | |
| 560 | 410 ;rcall WaitMSSP ; Needed? (mH) |
| 427 | 411 rcall I2C_OneByteRX ; Get one byte |
| 412 movff SSP1BUF,lo ; Data Byte | |
| 413 rcall I2C_OneByteRX ; Get one byte | |
| 414 movff SSP1BUF,hi ; Data Byte | |
| 415 rcall I2C_TwoBytesRX_div8_2 | |
| 416 movff lo,compass_DX+0 | |
| 417 movff hi,compass_DX+1 | |
| 418 btfss flip_screen ; 180° rotation ? | |
| 419 bra I2C_RX_compass1_1 ; Yes | |
| 420 ; Yes, flip X | |
| 421 banksel compass_DX | |
| 422 comf compass_DX+1 ; 16bit sign change. | |
| 423 negf compass_DX+0 | |
| 424 btfsc STATUS,C ; Carry to propagate ? | |
| 425 incf compass_DX+1,F ; YES: do it. | |
| 426 banksel common | |
| 427 I2C_RX_compass1_1: | |
| 428 rcall I2C_OneByteRX ; Get one byte | |
| 429 movff SSP1BUF,lo ; Data Byte | |
| 430 rcall I2C_OneByteRX ; Get one byte | |
| 431 movff SSP1BUF,hi ; Data Byte | |
| 432 rcall I2C_TwoBytesRX_div8_2 | |
| 433 movff lo,compass_DY+0 | |
| 434 movff hi,compass_DY+1 | |
| 435 btfss flip_screen ; 180° rotation ? | |
| 436 bra I2C_RX_compass1_2 ; Yes | |
| 437 ; Yes, flip Y | |
| 438 banksel compass_DY | |
| 439 comf compass_DY+1 ; 16bit sign change. | |
| 440 negf compass_DY+0 | |
| 441 btfsc STATUS,C ; Carry to propagate ? | |
| 442 incf compass_DY+1,F ; YES: do it. | |
| 443 I2C_RX_compass1_2: | |
| 444 banksel common | |
| 445 rcall I2C_OneByteRX ; Get one byte | |
| 446 movff SSP1BUF,lo ; Data Byte | |
| 447 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 448 rcall WaitMSSP | |
| 449 movff SSP1BUF,hi ; Data Byte | |
| 450 rcall I2C_TwoBytesRX_div8_2 | |
| 451 movff lo,compass_DZ+0 | |
| 452 movff hi,compass_DZ+1 | |
| 453 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 454 bra WaitMSSP ;(And return) |
| 455 | |
| 456 I2C_RX_compass2: ; newest compass | |
| 457 bsf SSP1CON2,SEN ; Start condition | |
| 427 | 458 rcall WaitMSSP |
| 560 | 459 movlw 0x3C ; address |
| 460 rcall I2C_TX | |
| 461 movlw 0xE8 ; 0x68 with auto-increment (MSB=1) | |
| 462 rcall I2C_TX | |
| 463 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
| 464 rcall WaitMSSP | |
| 465 movlw 0x3D ; address | |
| 466 rcall I2C_TX | |
| 467 ; rcall WaitMSSP | |
| 468 rcall I2C_OneByteRX ; Get one byte | |
| 469 movff SSP1BUF,lo ; Data Byte | |
| 470 rcall I2C_OneByteRX ; Get one byte | |
| 471 movff SSP1BUF,hi ; Data Byte | |
| 472 ; rcall I2C_TwoBytesRX_div8_2 | |
| 473 btfsc flip_screen ; 180° rotation ? | |
| 474 bra I2C_RX_compass2_1 ; Yes, do nothing with X | |
| 475 ; No, flip X | |
| 476 comf hi ; 16bit sign change. | |
| 477 negf lo | |
| 478 btfsc STATUS,C ; Carry to propagate ? | |
| 479 incf hi,F ; YES: do it. | |
| 480 I2C_RX_compass2_1: | |
| 481 movff lo,compass_DX+0 | |
| 482 movff hi,compass_DX+1 | |
| 483 rcall I2C_OneByteRX ; Get one byte | |
| 484 movff SSP1BUF,lo ; Data Byte | |
| 485 rcall I2C_OneByteRX ; Get one byte | |
| 486 movff SSP1BUF,hi ; Data Byte | |
| 487 ; rcall I2C_TwoBytesRX_div8_2 | |
| 488 btfss flip_screen ; 180° rotation ? | |
| 489 bra I2C_RX_compass2_2 ; No, do nothing with Y | |
| 490 ; Yes, flip Y | |
| 491 comf hi ; 16bit sign change. | |
| 492 negf lo | |
| 493 btfsc STATUS,C ; Carry to propagate ? | |
| 494 incf hi,F ; YES: do it. | |
| 495 I2C_RX_compass2_2: | |
| 496 movff lo,compass_DY+0 | |
| 497 movff hi,compass_DY+1 | |
| 498 rcall I2C_OneByteRX ; Get one byte | |
| 499 movff SSP1BUF,lo ; Data Byte | |
| 500 rcall I2C_OneByteRX ; Get one byte | |
| 501 movff SSP1BUF,hi ; Data Byte | |
| 502 ;rcall I2C_TwoBytesRX_div8_2 | |
| 503 movff lo,compass_DZ+0 | |
| 504 movff hi,compass_DZ+1 | |
| 505 bsf SSP1CON2,PEN ; Stop condition | |
| 506 bra WaitMSSP ;(And return) | |
| 507 | |
| 508 | |
| 0 | 509 global I2C_init_compass |
| 510 I2C_init_compass: | |
| 427 | 511 bsf compass_enabled |
| 560 | 512 bcf compass_type2 |
| 513 ; probe compass 2 | |
| 514 bsf SSP1CON2,SEN ; Start condition | |
| 515 rcall WaitMSSP | |
| 516 movlw 0x32 ; Address byte + Write bit | |
| 517 movwf SSP1BUF ; control byte | |
| 518 rcall WaitMSSP | |
| 519 btfss SSP1CON2,ACKSTAT ; ACK? | |
| 520 bsf compass_type2 ; ACK send. compass2 present | |
| 521 bsf SSP1CON2,PEN ; Stop condition | |
| 522 rcall WaitMSSP | |
| 523 | |
| 524 btfsc compass_type2 | |
| 525 bra I2C_init_compass2 ; Compass2 | |
| 526 ; Check for compass0 or compass1... | |
| 427 | 527 bsf compass_type ; set flag |
| 528 bsf SSP1CON2,SEN ; Start condition | |
| 529 rcall WaitMSSP | |
| 530 movlw 0x3C ; address | |
| 531 rcall I2C_TX | |
| 532 movlw 0x0F | |
| 533 rcall I2C_TX | |
| 534 bsf SSP1CON2,PEN ; Stop condition | |
| 535 rcall WaitMSSP | |
| 560 | 536 bcf PIR1,SSP1IF |
| 427 | 537 bsf SSP1CON2,SEN ; Start condition |
| 538 rcall WaitMSSP | |
| 539 movlw 0x3D ; address | |
| 540 rcall I2C_TX | |
| 541 rcall I2C_OneByteRX ; Get one byte | |
| 542 movlw 0x49 ; 0x49 = Compass1 | |
| 543 cpfseq SSP1BUF | |
| 544 bcf compass_type ; clear flag | |
| 545 bsf SSP1CON2,PEN ; Stop condition | |
| 546 rcall WaitMSSP | |
| 547 | |
| 548 btfsc compass_type ; compass1? | |
| 549 bra I2C_init_compass1 ; yes | |
| 550 ; init compass0 | |
| 551 bsf SSP1CON2,SEN ; Start condition | |
| 552 rcall WaitMSSP | |
| 553 movlw 0x3C ; address | |
| 0 | 554 rcall I2C_TX |
| 427 | 555 movlw 0x00 |
| 0 | 556 rcall I2C_TX |
| 427 | 557 ; movlw b'01101001' ; ConfigA: 3Hz, 8 Samples averaged, Test Mode (Positive Bias) |
| 558 movlw b'01101000' ; ConfigA: 3Hz, 8 Samples averaged | |
| 0 | 559 rcall I2C_TX |
| 20 | 560 I2C_init_compass_common: |
| 427 | 561 movff opt_compass_gain,i2c_temp ; 0-7 (230LSB/Gauss to 1370LSB/Gauss) |
|
18
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
562 swapf i2c_temp,F |
|
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
563 comf i2c_temp,F |
|
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
564 bcf STATUS,C |
|
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
565 rlcf i2c_temp |
|
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
566 movf i2c_temp,W |
|
4e3f133dfbf4
add new opt_compass_gain option to work with more magnetic battery types
heinrichsweikamp
parents:
0
diff
changeset
|
567 clrf i2c_temp |
| 0 | 568 rcall I2C_TX |
| 427 | 569 movlw b'00000000' ; Continous Mode |
| 0 | 570 rcall I2C_TX |
| 427 | 571 bsf SSP1CON2,PEN ; Stop condition |
| 560 | 572 bra WaitMSSP ; (And return) |
| 0 | 573 |
| 427 | 574 I2C_init_compass1: |
| 575 bsf SSP1CON2,SEN ; Start condition | |
| 576 rcall WaitMSSP | |
| 577 movlw 0x3C ; address | |
| 578 rcall I2C_TX | |
| 579 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
| 580 rcall I2C_TX | |
| 581 movlw b'00000000' ; CTRL0 | |
| 582 rcall I2C_TX | |
| 583 movlw b'00101111' ; CTRL1 (6,25Hz, BDU=0, x,y,z = ON) | |
| 584 rcall I2C_TX | |
| 585 movlw b'11000000' ; CTRL2 (50Hz, +/-2g, | |
| 586 rcall I2C_TX | |
| 587 movlw b'00000000' ; CTRL3 | |
| 588 rcall I2C_TX | |
| 589 movlw b'00000000' ; CTRL4 | |
| 590 rcall I2C_TX | |
| 591 movlw b'01100100' ; CTRL5 HIGH res, 6,25Hz | |
| 592 rcall I2C_TX | |
| 429 | 593 init_compass1_common: |
| 498 | 594 movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730LSB/Gauss) |
| 448 | 595 ;movlw b'00000000' ; CTRL6 (+/-2 Gauss) |
| 498 | 596 ;movlw b'00100000' ; CTRL6 (+/-4 Gauss) |
| 427 | 597 rcall I2C_TX |
| 598 movlw b'00000000' ; CTRL7 Continuous Mode | |
| 599 rcall I2C_TX | |
| 600 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 601 bra WaitMSSP ; (And return) |
| 427 | 602 |
| 560 | 603 I2C_init_compass2: |
| 604 bsf SSP1CON2,SEN ; Start condition | |
| 427 | 605 rcall WaitMSSP |
| 606 movlw 0x3C ; address | |
| 607 rcall I2C_TX | |
| 560 | 608 movlw 0xE0 ; 0x60 with auto-increment (MSB=1) |
| 427 | 609 rcall I2C_TX |
| 560 | 610 movlw b'00000000' ; CFG_REG_A_M (10Hz, Continuous) |
| 427 | 611 rcall I2C_TX |
| 560 | 612 movlw b'00000000' ; CFG_REG_B_M (Low-Pass Filter off) |
| 427 | 613 rcall I2C_TX |
| 560 | 614 movlw b'00000000' ; CFG_REG_C_M BDU=0 |
| 427 | 615 rcall I2C_TX |
| 560 | 616 bsf SSP1CON2,PEN ; Stop condition |
| 617 bra WaitMSSP ;(And return) | |
| 427 | 618 |
| 0 | 619 global I2C_sleep_compass |
| 620 I2C_sleep_compass: | |
| 427 | 621 bcf compass_enabled |
| 560 | 622 btfsc compass_type2 ; compass2? |
| 623 bra I2C_sleep_compass2 ; yes | |
| 624 btfsc compass_type ; compass1? | |
| 625 bra I2C_sleep_compass1 ; yes | |
| 626 I2C_sleep_compass0: | |
| 427 | 627 bsf SSP1CON2,SEN ; Start condition |
| 628 rcall WaitMSSP | |
| 629 movlw 0x3C ; address | |
| 0 | 630 rcall I2C_TX |
| 427 | 631 movlw 0x00 |
| 0 | 632 rcall I2C_TX |
| 427 | 633 movlw b'01101000' ; ConfigA |
| 0 | 634 rcall I2C_TX |
| 427 | 635 movlw b'00100000' ; ConfigB |
| 636 rcall I2C_TX | |
| 637 movlw b'00000010' ; Idle Mode | |
| 638 rcall I2C_TX | |
| 639 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 640 bra WaitMSSP ; (And return) |
| 0 | 641 |
| 427 | 642 I2C_sleep_compass1: |
| 643 bsf SSP1CON2,SEN ; Start condition | |
| 644 rcall WaitMSSP | |
| 645 movlw 0x3C ; address | |
| 646 rcall I2C_TX | |
| 647 movlw 0x20 ; CTRL_REG1 | |
| 648 rcall I2C_TX | |
| 649 movlw b'00000000' ; data for CTRL_REG1: acceleration sensor Power-down mode | |
| 650 rcall I2C_TX | |
| 651 bsf SSP1CON2,PEN ; Stop condition | |
| 652 rcall WaitMSSP | |
| 653 bsf SSP1CON2,SEN ; Start condition | |
| 654 rcall WaitMSSP | |
| 655 movlw 0x3C ; address | |
| 656 rcall I2C_TX | |
| 657 movlw 0x26 ; CTRL_REG7 | |
| 658 rcall I2C_TX | |
| 659 movlw b'00000010' ; data for CTRL_REG7: magnetic sensor Power-down mode | |
| 660 rcall I2C_TX | |
| 661 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 662 bra WaitMSSP ;(And return) |
| 663 | |
| 664 | |
| 665 I2C_sleep_compass2: | |
| 666 ; magnetic | |
| 667 bsf SSP1CON2,SEN ; Start condition | |
| 427 | 668 rcall WaitMSSP |
| 560 | 669 movlw 0x3C ; address |
| 670 rcall I2C_TX | |
| 671 movlw 0xE0 ; 0x60 with auto-increment (MSB=1) | |
| 672 rcall I2C_TX | |
| 673 movlw b'00000010' ; CFG_REG_A_M (Idle mode) | |
| 674 rcall I2C_TX | |
| 675 bsf SSP1CON2,PEN ; Stop condition | |
| 676 bra WaitMSSP ; (And return) | |
| 427 | 677 |
| 560 | 678 I2C_sleep_accelerometer2: |
| 679 ; accelerometer | |
| 680 bsf SSP1CON2,SEN ; Start condition | |
| 681 rcall WaitMSSP | |
| 682 movlw 0x32 ; address | |
| 683 rcall I2C_TX | |
| 684 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
| 685 rcall I2C_TX | |
| 686 movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) | |
| 687 rcall I2C_TX | |
| 688 movlw b'00000000' ; CTRL_REG1_A (All off) | |
| 689 rcall I2C_TX | |
| 690 bsf SSP1CON2,PEN ; Stop condition | |
| 691 bra WaitMSSP ; (And return) | |
| 0 | 692 |
| 693 global I2C_init_accelerometer | |
| 694 I2C_init_accelerometer: | |
| 560 | 695 btfsc compass_type2 ; compass2? |
| 696 bra I2C_init_accelerometer2 ; Yes. | |
| 697 | |
| 427 | 698 btfsc compass_type ; compass1? |
| 699 return ; yes, ignore | |
| 700 | |
| 0 | 701 rcall I2C_sleep_accelerometer ; Regs can only be changed in St.By mode |
| 702 | |
| 560 | 703 bsf SSP1CON2,SEN ; Start condition |
| 704 rcall WaitMSSP | |
| 705 movlw 0x38 ; address | |
| 0 | 706 rcall I2C_TX |
| 560 | 707 movlw 0x0E ; XYZ_DATA_CFG |
| 0 | 708 rcall I2C_TX |
| 560 | 709 movlw b'00000000' ; High pass Filter=0 , +/- 2g range |
| 0 | 710 rcall I2C_TX |
| 560 | 711 bsf SSP1CON2,PEN ; Stop condition |
| 712 rcall WaitMSSP | |
| 0 | 713 |
| 714 | |
| 560 | 715 bsf SSP1CON2,SEN ; Start condition |
| 716 rcall WaitMSSP | |
| 717 movlw 0x38 ; address | |
| 0 | 718 rcall I2C_TX |
| 560 | 719 movlw 0x2A ; CTRL_REG1 |
| 0 | 720 rcall I2C_TX |
| 721 ; movlw b'00110000' ; CTRL_REG1: 160ms data rate, St.By Mode | |
| 560 | 722 movlw b'00110100' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode |
| 0 | 723 rcall I2C_TX |
| 560 | 724 movlw b'00000010' ; CTRL_REG2: High Res in Active mode |
| 0 | 725 rcall I2C_TX |
| 560 | 726 bsf SSP1CON2,PEN ; Stop condition |
| 727 rcall WaitMSSP | |
| 0 | 728 |
| 560 | 729 bsf SSP1CON2,SEN ; Start condition |
| 730 rcall WaitMSSP | |
| 731 movlw 0x38 ; address | |
| 0 | 732 rcall I2C_TX |
| 560 | 733 movlw 0x2A ; CTRL_REG1 |
| 0 | 734 rcall I2C_TX |
| 735 ; movlw b'00110001' ; CTRL_REG1: 160ms data rate, Active Mode | |
| 560 | 736 movlw b'00110101' ; CTRL_REG1: 160ms data rate, St.By Mode, reduced noise mode, Active Mode |
| 737 rcall I2C_TX | |
| 738 bsf SSP1CON2,PEN ; Stop condition | |
| 739 bra WaitMSSP ; (And return) | |
| 740 | |
| 741 I2C_init_accelerometer2: | |
| 742 bsf SSP1CON2,SEN ; Start condition | |
| 743 rcall WaitMSSP | |
| 744 movlw 0x32 ; address | |
| 745 rcall I2C_TX | |
| 746 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
| 0 | 747 rcall I2C_TX |
| 560 | 748 movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) |
| 749 rcall I2C_TX | |
| 750 movlw b'01010111' ; CTRL_REG1_A (100Hz, x,y,z = ON) | |
| 751 rcall I2C_TX | |
| 752 movlw b'00000000' ; CTRL_REG2_A | |
| 753 rcall I2C_TX | |
| 754 movlw b'00000000' ; CTRL_REG3_A | |
| 755 rcall I2C_TX | |
| 756 movlw b'00000000' ; CTRL_REG4_A (BDU=0, +/-2g, | |
| 757 rcall I2C_TX | |
| 758 movlw b'00000000' ; CTRL_REG5_A | |
| 759 rcall I2C_TX | |
| 760 bsf SSP1CON2,PEN ; Stop condition | |
| 761 bra WaitMSSP ; (And return) | |
| 0 | 762 |
| 763 global I2C_sleep_accelerometer | |
| 764 I2C_sleep_accelerometer: | |
| 560 | 765 btfsc compass_type2 ; Compass2 |
| 766 bra I2C_sleep_accelerometer2 ; Yes | |
| 427 | 767 btfsc compass_type ; compass1? |
| 768 return ; yes, ignore | |
| 769 | |
| 0 | 770 bsf SSP1CON2,SEN ; Start condition |
| 771 rcall WaitMSSP | |
| 772 movlw 0x38 ; address | |
| 773 rcall I2C_TX | |
| 774 movlw 0x2A ; CTRL_REG1 | |
| 775 rcall I2C_TX | |
| 776 movlw b'00000000' ; St. By Mode | |
| 777 rcall I2C_TX | |
| 778 bsf SSP1CON2,PEN ; Stop condition | |
| 560 | 779 bra WaitMSSP ; (And return) |
| 780 | |
|
556
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
781 lt2942_init_again: |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
782 clrf i2c_temp |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
783 movlw 0x02 ; Point to accumulated charge registers |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
784 rcall I2C_TX_GAUGE |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
785 movff battery_acumulated_charge+1,SSP1BUF ; Data Byte |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
786 rcall WaitMSSP |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
787 rcall I2C_WaitforACK |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
788 movff battery_acumulated_charge+0,SSP1BUF ; Data Byte |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
789 rcall WaitMSSP |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
790 rcall I2C_WaitforACK |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
791 bsf SSP1CON2,PEN ; Stop condition |
| 560 | 792 rcall WaitMSSP |
|
556
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
793 movff battery_acumulated_charge+1,sub_a+1 |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
794 movff battery_acumulated_charge+0,sub_a+0 |
|
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
795 ; and init again... |
| 560 | 796 |
| 797 global lt2942_init | |
| 113 | 798 lt2942_init: ; Setup Control register B |
| 799 clrf i2c_temp | |
| 800 movlw 0x01 ; Point to control reg B | |
| 467 | 801 rcall I2C_TX_GAUGE |
| 802 movlw b'11111000' ; Automatic conversion every two seconds | |
| 113 | 803 movff WREG, SSP1BUF ; Data Byte |
| 804 rcall WaitMSSP | |
| 805 rcall I2C_WaitforACK | |
| 560 | 806 bsf SSP1CON2,PEN ; Stop condition |
| 467 | 807 bra WaitMSSP ; (And return) |
| 113 | 808 |
| 809 global lt2942_get_status | |
| 810 lt2942_get_status: ; Read status register | |
| 448 | 811 bcf battery_gauge_available ; Clear flag |
| 113 | 812 clrf i2c_temp |
| 813 movlw 0x00 ; Point to Status reg | |
| 467 | 814 rcall I2C_TX_GAUGE |
| 815 rcall I2C_RX_GAUGE | |
| 113 | 816 movff SSP1BUF,WREG |
| 467 | 817 btfss WREG,7 ; 2942 found? |
| 818 bsf battery_gauge_available ; Yes, set flag | |
| 819 bsf SSP1CON2,PEN ; Stop condition | |
| 820 bra WaitMSSP ; (And return) | |
| 113 | 821 |
| 822 | |
| 823 global lt2942_get_voltage | |
| 824 lt2942_get_voltage: ; Read battery voltage registers | |
| 825 clrf i2c_temp | |
| 826 movlw 0x08 ; Point to voltage registers | |
| 448 | 827 rcall I2C_TX_GAUGE |
| 828 rcall I2C_RX_GAUGE | |
| 113 | 829 bsf SSP1CON2,ACKEN ; Master acknowlegde |
| 830 rcall WaitMSSP | |
| 831 movff SSP1BUF,xA+1 | |
| 832 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 833 rcall WaitMSSP | |
| 834 movff SSP1BUF,xA+0 | |
| 835 bsf SSP1CON2,PEN ; Stop condition | |
| 836 rcall WaitMSSP | |
| 837 | |
| 838 ; banksel common | |
| 839 ; xA:2 loaded with raw values | |
| 840 movlw LOW .6000 | |
| 841 movwf xB+0 | |
| 842 movlw HIGH .6000 | |
| 843 movwf xB+1 | |
| 844 call mult16x16 ;xA*xB=xC | |
| 845 | |
| 846 ; devide xC (32bit)/65535 for result in mV (16bit) | |
| 847 movlw .16 | |
| 848 movwf i2c_temp | |
| 849 lt2942_get_voltage2: | |
| 850 bcf STATUS,C | |
| 851 rrcf xC+3,F | |
| 852 rrcf xC+2,F | |
| 853 rrcf xC+1,F | |
| 854 rrcf xC+0,F | |
| 855 decfsz i2c_temp,F | |
| 856 bra lt2942_get_voltage2 | |
| 857 | |
| 858 ; Update battery voltage in mV | |
| 859 movff xC+1,batt_voltage+1 | |
| 860 movff xC+0,batt_voltage+0 | |
| 466 | 861 |
| 862 tstfsz batt_voltage+1 ; <256mV? | |
| 863 return ; No, done. | |
| 864 | |
| 560 | 865 bra lt2942_init ;(and return) |
| 113 | 866 |
| 867 ; global lt2942_get_temperature | |
| 868 ;lt2942_get_temperature: ; Read temperature registers | |
| 869 ; clrf i2c_temp | |
| 870 ; movlw 0x0C ; Point to temperature registers | |
| 871 ; call I2C_TX_GAUGE | |
| 872 ; call I2C_RX | |
| 873 ; bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 874 ; rcall WaitMSSP | |
| 875 ; movff SSP1BUF,xA+1 | |
| 876 ; bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 877 ; rcall WaitMSSP | |
| 878 ; movff SSP1BUF,xA+0 | |
| 879 ; bsf SSP1CON2,PEN ; Stop condition | |
| 880 ; rcall WaitMSSP | |
| 881 ; | |
| 882 ;; banksel common | |
| 883 ; ; xA:2 loaded with raw values | |
| 884 ; movlw LOW .6000 | |
| 885 ; movwf xB+0 | |
| 886 ; movlw HIGH .6000 | |
| 887 ; movwf xB+1 | |
| 888 ; call mult16x16 ;xA*xB=xC | |
| 889 ; | |
| 890 ; ; devide xC (32bit)/65535 for result in 0.1K (16bit) | |
| 891 ; movlw .16 | |
| 892 ; movwf i2c_temp | |
| 893 ;lt2942_get_temperature2: | |
| 894 ; bcf STATUS,C | |
| 895 ; rrcf xC+3,F | |
| 896 ; rrcf xC+2,F | |
| 897 ; rrcf xC+1,F | |
| 898 ; rrcf xC+0,F | |
| 899 ; decfsz i2c_temp,F | |
| 900 ; bra lt2942_get_temperature2 | |
| 901 ; | |
| 902 ; movff xC+1,sub_a+1 | |
| 903 ; movff xC+0,sub_a+0 | |
| 904 ; movlw LOW .2731 ; Kelvin to Celcius offset | |
| 905 ; movwf sub_b+0 | |
| 906 ; movlw HIGH .2731 ; Kelvin to Celcius offset | |
| 907 ; movwf sub_b+1 | |
| 908 ; call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) | |
| 909 ; | |
| 910 ; ; Update batttery_temperature in 0.1°C | |
| 911 ; movff sub_c+1,battery_temperature+1 | |
| 912 ; movff sub_c+0,battery_temperature+0 | |
| 913 ; return | |
| 914 | |
| 915 global lt2942_get_accumulated_charge | |
| 916 lt2942_get_accumulated_charge: ; Read accumulated charge and compute percent | |
| 917 clrf i2c_temp | |
| 466 | 918 movlw 0x00 ; Point to status register |
| 467 | 919 rcall I2C_TX_GAUGE |
| 920 rcall I2C_RX_GAUGE | |
| 466 | 921 bsf SSP1CON2,ACKEN ; Master acknowlegde |
| 113 | 922 rcall WaitMSSP |
| 466 | 923 movff SSP1BUF,gauge_status_byte |
| 924 | |
| 925 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 926 rcall WaitMSSP ; Dummy read (Control byte) | |
| 467 | 927 movf SSP1BUF,W |
| 928 bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 929 rcall WaitMSSP | |
| 466 | 930 |
| 931 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 113 | 932 rcall WaitMSSP |
| 466 | 933 movff SSP1BUF,sub_a+1 |
| 467 | 934 bsf SSP1CON2,ACKEN ; Master acknowlegde |
| 935 rcall WaitMSSP | |
| 466 | 936 |
| 937 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 938 rcall WaitMSSP | |
| 939 movff SSP1BUF,sub_a+0 | |
| 940 bsf SSP1CON2,PEN ; Stop condition | |
| 113 | 941 rcall WaitMSSP |
| 466 | 942 |
| 943 movff gauge_status_byte,sub_b+0 ; copy into bank common | |
| 944 btfsc sub_b+0,0 ; =1: UVLO Event | |
|
556
dd28d4efd4d2
fix a potential issue in the battery managment
heinrichsweikamp
parents:
498
diff
changeset
|
945 rcall lt2942_init_again |
| 113 | 946 |
| 466 | 947 movff sub_a+1,battery_acumulated_charge+1 ; Save raw value |
| 948 movff sub_a+0,battery_acumulated_charge+0 ; Save raw value | |
| 949 | |
| 113 | 950 ; Compute batt_percent |
| 211 | 951 ; (charge-battery_offset)/365 |
| 448 | 952 movff battery_offset+0,sub_b+0 |
| 953 movff battery_offset+1,sub_b+1 | |
| 113 | 954 call subU16 ; sub_c = sub_a - sub_b (with signed values) |
| 955 | |
| 956 clrf batt_percent ; Set to zero | |
| 957 btfsc neg_flag ; result negative? | |
| 449 | 958 bra lt2942_set_to_zero_percent ; Yes, keep LT2942 at zero percent and return |
| 113 | 959 |
| 960 ; > Zero, set batt_percent properly | |
| 961 movff sub_c+0,xA+0 | |
| 962 movff sub_c+1,xA+1 | |
| 448 | 963 movff battery_capacity+0,xB+0 |
| 964 movff battery_capacity+1,xB+1 | |
| 113 | 965 call div16x16 ;xA/xB=xC with xA+0 as remainder, uses divB as temp variable |
| 966 movff xC+0,batt_percent | |
| 967 return | |
| 968 | |
| 449 | 969 lt2942_set_to_zero_percent: |
| 970 clrf i2c_temp | |
| 971 movlw 0x02 ; Point to accumulated charge registers | |
| 972 rcall I2C_TX_GAUGE | |
| 973 movff battery_offset+1,SSP1BUF | |
| 974 rcall WaitMSSP | |
| 975 rcall I2C_WaitforACK | |
| 976 movff battery_offset+0,SSP1BUF | |
| 977 rcall WaitMSSP | |
| 978 rcall I2C_WaitforACK | |
| 979 bsf SSP1CON2,PEN ; Stop condition | |
| 980 bra WaitMSSP; (and return) | |
| 981 | |
| 113 | 982 global lt2942_charge_done |
| 983 lt2942_charge_done: ; Reset accumulating registers to 0xFFFF | |
| 984 clrf i2c_temp | |
| 985 movlw 0x02 ; Point to accumulated charge registers | |
| 448 | 986 rcall I2C_TX_GAUGE |
| 987 setf SSP1BUF ; Data Byte | |
| 113 | 988 rcall WaitMSSP |
| 989 rcall I2C_WaitforACK | |
| 448 | 990 setf SSP1BUF ; Data Byte |
| 113 | 991 rcall WaitMSSP |
| 992 rcall I2C_WaitforACK | |
| 448 | 993 bsf SSP1CON2,PEN ; Stop condition |
| 994 bra WaitMSSP; (and return) | |
| 113 | 995 |
| 996 I2C_TX_GAUGE: ; Sends a byte to the LT2942 Gauge IC | |
| 997 movwf i2c_temp+1 ; Data byte | |
| 448 | 998 bsf SSP1CON2,SEN ; Start condition |
| 113 | 999 rcall WaitMSSP |
| 1000 movlw b'11001000' ; Address byte + Write bit | |
| 1001 movwf SSP1BUF ; control byte | |
| 1002 rcall WaitMSSP | |
| 1003 rcall I2C_WaitforACK | |
| 1004 movff i2c_temp+1, SSP1BUF ; Data Byte | |
| 1005 rcall WaitMSSP | |
| 448 | 1006 bra I2C_WaitforACK ; (and return) |
| 113 | 1007 |
| 1008 I2C_RX_GAUGE: | |
| 1009 bsf SSP1CON2,SEN ; Start condition | |
| 1010 rcall WaitMSSP | |
| 1011 movlw b'11001001' ; Address byte + Read bit | |
| 1012 movwf SSP1BUF ; control byte | |
| 1013 rcall WaitMSSP | |
| 1014 rcall I2C_WaitforACK | |
| 467 | 1015 bsf SSP1CON2, RCEN ; Enable recieve mode |
| 448 | 1016 bra WaitMSSP; (and return) |
| 560 | 1017 |
| 1018 | |
| 1019 global I2C_probe_OSTC_rx | |
| 1020 I2C_probe_OSTC_rx: | |
| 1021 bsf SSP1CON2,SEN ; Start condition | |
| 1022 rcall WaitMSSP | |
| 1023 movlw 0x50 ; Address byte + Write bit | |
| 1024 movwf SSP1BUF ; control byte | |
| 1025 rcall WaitMSSP | |
| 1026 btfss SSP1CON2,ACKSTAT ; ACK? | |
| 1027 bsf ostc_rx_present ; ACK send. OSTC_RX present! | |
| 1028 bsf SSP1CON2,PEN ; Stop condition | |
| 1029 rcall WaitMSSP | |
| 1030 btfss ostc_rx_present ; Do we have the RX? | |
| 1031 return ; No, Done. | |
| 1032 WAITMS .1 | |
| 1033 bsf SSP1CON2,SEN ; Start condition | |
| 1034 rcall WaitMSSP | |
| 1035 movlw 0x50 ; Address byte + Write bit | |
| 1036 movwf SSP1BUF ; control byte | |
| 1037 rcall WaitMSSP | |
| 1038 rcall I2C_WaitforACK | |
| 1039 movlw 0x1B | |
| 1040 movwf SSP1BUF ; Data Byte (Get firmware) | |
| 1041 rcall WaitMSSP | |
| 1042 rcall I2C_WaitforACK | |
| 1043 bsf SSP1CON2,PEN ; Stop condition | |
| 1044 rcall WaitMSSP | |
| 1045 WAITMS .1 | |
| 1046 bsf SSP1CON2,SEN ; Start condition | |
| 1047 rcall WaitMSSP | |
| 1048 movlw 0x51 ; Address byte + Read bit | |
| 1049 movwf SSP1BUF ; control byte | |
| 1050 rcall WaitMSSP | |
| 1051 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1052 rcall WaitMSSP | |
| 1053 movff SSP1BUF,rx_firmware+0 | |
| 1054 bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 1055 rcall WaitMSSP | |
| 1056 | |
| 1057 ; last byte in read from RX circuity always with a NACK! | |
| 1058 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1059 rcall WaitMSSP | |
| 1060 movff SSP1BUF,rx_firmware+1 | |
| 1061 bsf SSP1CON2,ACKDT | |
| 1062 bsf SSP1CON2,ACKEN ; Master NOT acknowlegde | |
| 1063 rcall WaitMSSP | |
| 1064 bcf SSP1CON2,ACKDT ; Reset ACKDT flag | |
| 1065 bsf SSP1CON2,PEN ; Stop condition | |
| 1066 bra WaitMSSP ;(and return) | |
| 1067 | |
| 1068 | |
| 1069 global I2C_get_tankdata | |
| 1070 I2C_get_tankdata: | |
| 1071 bsf SSP1CON2,SEN ; Start condition | |
| 1072 rcall WaitMSSP | |
| 1073 movlw 0x50 ; Address byte + Write bit | |
| 1074 movwf SSP1BUF ; control byte | |
| 1075 rcall WaitMSSP | |
| 1076 rcall I2C_WaitforACK | |
| 1077 movlw 0x1E ; Read buffer2 (48 Bytes) | |
| 1078 movwf SSP1BUF ; Data Byte | |
| 1079 rcall WaitMSSP | |
| 1080 rcall I2C_WaitforACK | |
| 1081 bsf SSP1CON2,PEN ; Stop condition | |
| 1082 rcall WaitMSSP | |
| 1083 WAITMS .1 | |
| 1084 | |
| 1085 ; read 48 bytes | |
| 1086 bsf SSP1CON2,SEN ; Start condition | |
| 1087 rcall WaitMSSP | |
| 1088 movlw 0x51 ; Address byte + read bit | |
| 1089 movwf SSP1BUF ; control byte | |
| 1090 rcall WaitMSSP | |
| 1091 rcall I2C_WaitforACK | |
| 1092 movlw .47 ; 47 with ACK + 1 w/o ACK | |
| 1093 movwf temp1 | |
| 1094 lfsr FSR2,rx_buffer+0 | |
| 1095 I2C_get_tankdata_loop_read: | |
| 1096 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1097 rcall WaitMSSP | |
| 1098 movff SSP1BUF,POSTINC2 | |
| 1099 bcf SSP1CON2,ACKDT | |
| 1100 bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 1101 rcall WaitMSSP | |
| 1102 decfsz temp1,F | |
| 1103 bra I2C_get_tankdata_loop_read | |
| 1104 | |
| 1105 ; 1 w/o ACK | |
| 1106 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1107 rcall WaitMSSP | |
| 1108 movff SSP1BUF,POSTINC2 | |
| 1109 bsf SSP1CON2,ACKDT | |
| 1110 bsf SSP1CON2,ACKEN ; Master NOT acknowlegde | |
| 1111 rcall WaitMSSP | |
| 1112 bcf SSP1CON2,ACKDT ; Reset ACKDT flag | |
| 1113 | |
| 1114 bsf SSP1CON2,PEN ; Stop condition | |
| 1115 bra WaitMSSP ;(and return) | |
| 1116 | |
| 1117 | |
| 1118 global I2C_update_OSTC_rx | |
| 1119 I2C_update_OSTC_rx: ; 992*64byte master loop | |
| 1120 bcf i2c_error_flag ; clear error flag | |
| 1121 ; write 64 bytes | |
| 1122 bsf SSP1CON2,SEN ; Start condition | |
| 1123 rcall WaitMSSP | |
| 1124 movlw 0x50 ; Address byte + Write bit | |
| 1125 movwf SSP1BUF ; control byte | |
| 1126 rcall WaitMSSP | |
| 1127 rcall I2C_WaitforACK | |
| 1128 lfsr FSR2,buffer ; send buffer for verify | |
| 1129 movlw .64 | |
| 1130 movwf temp1 | |
| 1131 I2C_update_OSTC_loop: ; 64byte flash page loop | |
| 1132 movff up,POSTINC2 ; store for verify | |
| 1133 movff up,SSP1BUF | |
| 1134 rcall WaitMSSP | |
| 1135 rcall I2C_WaitforACK | |
| 1136 call ext_flash_read_block ; Read one byte | |
| 1137 movwf up ; prepare for transmit | |
| 1138 decfsz temp1,F | |
| 1139 bra I2C_update_OSTC_loop | |
| 1140 bsf SSP1CON2,PEN ; Stop condition | |
| 1141 rcall WaitMSSP | |
| 1142 WAITMS .1 | |
| 1143 | |
| 1144 ; read 64 bytes | |
| 1145 bsf SSP1CON2,SEN ; Start condition | |
| 1146 rcall WaitMSSP | |
| 1147 movlw 0x51 ; Address byte + read bit | |
| 1148 movwf SSP1BUF ; control byte | |
| 1149 rcall WaitMSSP | |
| 1150 rcall I2C_WaitforACK | |
| 1151 lfsr FSR2,buffer ; send buffer for verify | |
| 1152 movlw .63 ; 63 with ACK + 1 w/o ACK | |
| 1153 movwf temp1 | |
| 1154 I2C_update_OSTC_loop_read: | |
| 1155 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1156 rcall WaitMSSP | |
| 1157 movf SSP1BUF,W | |
| 1158 cpfseq POSTINC2 ; compare readback with original | |
| 1159 bsf i2c_error_flag ; Not equal, set flag | |
| 1160 bcf SSP1CON2,ACKDT | |
| 1161 bsf SSP1CON2,ACKEN ; Master acknowlegde | |
| 1162 rcall WaitMSSP | |
| 1163 decfsz temp1,F | |
| 1164 bra I2C_update_OSTC_loop_read | |
| 1165 | |
| 1166 ; 1 w/o ACK | |
| 1167 bsf SSP1CON2, RCEN ; Enable recieve mode | |
| 1168 rcall WaitMSSP | |
| 1169 movf SSP1BUF,W | |
| 1170 cpfseq POSTINC2 ; compare readback with original | |
| 1171 bsf i2c_error_flag ; Not equal, set flag | |
| 1172 bsf SSP1CON2,ACKDT | |
| 1173 bsf SSP1CON2,ACKEN ; Master NOT acknowlegde | |
| 1174 rcall WaitMSSP | |
| 1175 bcf SSP1CON2,ACKDT ; Reset ACKDT flag | |
| 1176 | |
| 1177 bsf SSP1CON2,PEN ; Stop condition | |
| 1178 rcall WaitMSSP | |
| 1179 WAITMS .1 | |
| 1180 | |
| 1181 bsf SSP1CON2,SEN ; Start condition | |
| 1182 rcall WaitMSSP | |
| 1183 movlw 0x50 ; Address byte + Write bit | |
| 1184 movwf SSP1BUF ; control byte | |
| 1185 rcall WaitMSSP | |
| 1186 rcall I2C_WaitforACK | |
| 1187 movlw 0x1F ; Write command! | |
| 1188 movwf SSP1BUF ; Data Byte | |
| 1189 rcall WaitMSSP | |
| 1190 rcall I2C_WaitforACK | |
| 1191 bsf SSP1CON2,PEN ; Stop condition | |
| 1192 rcall WaitMSSP | |
| 1193 WAITMS .5 ; Required waiting time | |
| 1194 | |
| 1195 btfss i2c_error_flag | |
| 1196 retlw .0 ; All ok | |
| 1197 retlw .255 ; an error occured | |
| 448 | 1198 END |
