Mercurial > public > hwos_code
comparison src/i2c.asm @ 628:cd58f7fc86db
3.05 stable work
author | heinrichsweikamp |
---|---|
date | Thu, 19 Sep 2019 12:01:29 +0200 |
parents | bf5fee575701 |
children | 185ba2f91f59 |
comparison
equal
deleted
inserted
replaced
627:bf5fee575701 | 628:cd58f7fc86db |
---|---|
1 ;============================================================================= | 1 ;============================================================================= |
2 ; | 2 ; |
3 ; File i2c.asm combined next generation V3.03.2 | 3 ; File i2c.asm combined next generation V3.03.5 |
4 ; | 4 ; |
5 ; I2C Interface | 5 ; I2C Interface |
6 ; | 6 ; |
7 ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. | 7 ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved. |
8 ;============================================================================= | 8 ;============================================================================= |
26 ; LSM303AGR's Acceleration read address (8-Bit): 0x33 | 26 ; LSM303AGR's Acceleration read address (8-Bit): 0x33 |
27 ; LSM303AGR's Acceleration write address (8-Bit): 0x32 | 27 ; LSM303AGR's Acceleration write address (8-Bit): 0x32 |
28 ; | 28 ; |
29 ; Compass3 | 29 ; Compass3 |
30 ; -------- | 30 ; -------- |
31 ; LSM303C's Compass read address (8-Bit): 0x3D | 31 ; LSM303C's Compass read address (8-Bit): 0x3D |
32 ; LSM303C's Compass write address (8-Bit): 0x3C | 32 ; LSM303C's Compass write address (8-Bit): 0x3C |
33 ; LSM303C's Acceleration read address (8-Bit): 0x3B | 33 ; LSM303C's Acceleration read address (8-Bit): 0x3B |
34 ; LSM303C's Acceleration write address (8-Bit): 0x3A | 34 ; LSM303C's Acceleration write address (8-Bit): 0x3A |
35 ; | 35 ; |
36 ; RX Circuity | 36 ; RX Circuity |
37 ; ----------- | 37 ; ----------- |
89 rrcf lo | 89 rrcf lo |
90 return | 90 return |
91 | 91 |
92 global I2C_RX_accelerometer | 92 global I2C_RX_accelerometer |
93 I2C_RX_accelerometer: | 93 I2C_RX_accelerometer: |
94 btfsc compass_type3 ; compass3 | 94 btfsc compass_type3 ; compass3 ? |
95 bra I2C_RX_accelerometer_compass3 ; yes | 95 bra I2C_RX_accelerometer_compass3 ; YES |
96 btfsc compass_type2 ; compass2 ? | 96 btfsc compass_type2 ; compass2 ? |
97 bra I2C_RX_accelerometer_compass2 ; YES | 97 bra I2C_RX_accelerometer_compass2 ; YES |
98 btfsc compass_type ; compass1 ? | 98 btfsc compass_type1 ; compass1 ? |
99 bra I2C_RX_accelerometer_compass1 ; YES | 99 bra I2C_RX_accelerometer_compass1 ; YES |
100 ;bra I2C_RX_accelerometer_compass0 ; NO - compass0 then | |
101 | |
100 I2C_RX_accelerometer_compass0: | 102 I2C_RX_accelerometer_compass0: |
101 bsf SSP1CON2,SEN ; start condition | 103 bsf SSP1CON2,SEN ; start condition |
102 rcall WaitMSSP | 104 rcall WaitMSSP |
103 movlw 0x38 ; address | 105 movlw 0x38 ; address |
104 rcall I2C_TX | 106 rcall I2C_TX |
168 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | 170 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) |
169 rcall I2C_TX | 171 rcall I2C_TX |
170 bsf SSP1CON2,RSEN ; repeated start condition (!) | 172 bsf SSP1CON2,RSEN ; repeated start condition (!) |
171 rcall WaitMSSP | 173 rcall WaitMSSP |
172 movlw 0x3D ; address | 174 movlw 0x3D ; address |
173 I2C_RX_accelerometer_compass1_xx: ; compass2 and 3 continue here... | 175 I2C_RX_accelerometer_compass1_xx: ; compass 2 and 3 continue here... |
174 rcall I2C_TX | 176 rcall I2C_TX |
175 | 177 |
176 ; Non-flipped screen: | 178 ; Non-flipped screen: |
177 ; Chip orientation on the PCB requires | 179 ; Chip orientation on the PCB requires |
178 ; Original = Corrected | 180 ; Original = Corrected |
256 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | 258 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) |
257 rcall I2C_TX | 259 rcall I2C_TX |
258 bsf SSP1CON2,RSEN ; repeated start condition (!) | 260 bsf SSP1CON2,RSEN ; repeated start condition (!) |
259 rcall WaitMSSP | 261 rcall WaitMSSP |
260 movlw 0x33 ; address | 262 movlw 0x33 ; address |
261 bra I2C_RX_accelerometer_compass1_xx | 263 bra I2C_RX_accelerometer_compass1_xx |
262 | 264 |
263 I2C_RX_accelerometer_compass3: | 265 I2C_RX_accelerometer_compass3: |
264 bsf SSP1CON2,SEN ; Start condition | 266 bsf SSP1CON2,SEN ; start condition |
265 rcall WaitMSSP | 267 rcall WaitMSSP |
266 movlw 0x3A ; address | 268 movlw 0x3A ; address |
267 rcall I2C_TX | 269 rcall I2C_TX |
268 movlw 0x28 ; 0x28 (OUT_X_L_A) | 270 movlw 0x28 ; 0x28 (OUT_X_L_A) |
269 rcall I2C_TX | 271 rcall I2C_TX |
270 bsf SSP1CON2,RSEN ; Repeated start condition (!) | 272 bsf SSP1CON2,RSEN ; repeated start condition (!) |
271 rcall WaitMSSP | 273 rcall WaitMSSP |
272 movlw 0x3B ; address | 274 movlw 0x3B ; address |
273 bra I2C_RX_accelerometer_compass1_xx | 275 bra I2C_RX_accelerometer_compass1_xx |
274 | 276 |
275 I2C_OneByteRX: | 277 I2C_OneByteRX: |
276 bsf SSP1CON2,RCEN ; enable receive mode | 278 bsf SSP1CON2,RCEN ; enable receive mode |
277 rcall WaitMSSP | 279 rcall WaitMSSP |
278 bsf SSP1CON2,ACKEN ; master acknowledge | 280 bsf SSP1CON2,ACKEN ; master acknowledge |
282 ;----------------------------------------------------------------------------- | 284 ;----------------------------------------------------------------------------- |
283 IFDEF _compass | 285 IFDEF _compass |
284 | 286 |
285 global I2C_RX_compass | 287 global I2C_RX_compass |
286 I2C_RX_compass: | 288 I2C_RX_compass: |
287 btfsc compass_type3 ; compass3 | 289 btfsc compass_type3 ; compass 3 ? |
288 bra I2C_RX_compass3 ; YES | 290 bra I2C_RX_compass3 ; YES |
289 btfsc compass_type2 ; compass2 ? | 291 btfsc compass_type2 ; compass 2 ? |
290 bra I2C_RX_compass2 ; YES | 292 bra I2C_RX_compass2 ; YES |
291 btfsc compass_type ; compass1 ? | 293 btfsc compass_type1 ; compass 1 ? |
292 bra I2C_RX_compass1 ; YES | 294 bra I2C_RX_compass1 ; YES |
295 ;bra I2C_RX_compass0 ; NO - compass 0 then | |
296 | |
293 I2C_RX_compass0: | 297 I2C_RX_compass0: |
294 bsf SSP1CON2,SEN ; start condition | 298 bsf SSP1CON2,SEN ; start condition |
295 rcall WaitMSSP | 299 rcall WaitMSSP |
296 movlw 0x3C ; address | 300 movlw 0x3C ; address |
297 rcall I2C_TX | 301 rcall I2C_TX |
345 movff SSP1BUF,compass_DZ+1 ; data byte | 349 movff SSP1BUF,compass_DZ+1 ; data byte |
346 rcall I2C_OneByteRX ; get one byte | 350 rcall I2C_OneByteRX ; get one byte |
347 movff SSP1BUF,compass_DZ+0 ; data byte | 351 movff SSP1BUF,compass_DZ+0 ; data byte |
348 rcall I2C_OneByteRX ; get one byte | 352 rcall I2C_OneByteRX ; get one byte |
349 movff SSP1BUF,compass_DX+1 ; data byte | 353 movff SSP1BUF,compass_DX+1 ; data byte |
350 bsf SSP1CON2, RCEN ; Enable receive mode | 354 bsf SSP1CON2,RCEN ; enable receive mode |
351 rcall WaitMSSP | 355 rcall WaitMSSP |
352 movff SSP1BUF,compass_DX+0 ; data byte | 356 movff SSP1BUF,compass_DX+0 ; data byte |
353 bsf SSP1CON2,PEN ; stop condition | 357 bsf SSP1CON2,PEN ; stop condition |
354 rcall WaitMSSP | 358 rcall WaitMSSP |
355 btfss flip_screen ; 180° rotation? | 359 btfss flip_screen ; 180° rotation? |
360 btfsc STATUS,C ; - carry to propagate? | 364 btfsc STATUS,C ; - carry to propagate? |
361 incf compass_DX+1,F ; YES - do it | 365 incf compass_DX+1,F ; YES - do it |
362 banksel common | 366 banksel common |
363 return | 367 return |
364 | 368 |
365 I2C_RX_compass1: ; new compass | 369 I2C_RX_compass1: ; compass type 1 |
366 bsf SSP1CON2,SEN ; start condition | 370 bsf SSP1CON2,SEN ; start condition |
367 rcall WaitMSSP | 371 rcall WaitMSSP |
368 movlw 0x3C ; address | 372 movlw 0x3C ; address |
369 rcall I2C_TX | 373 rcall I2C_TX |
370 movlw b'10001000' ; 0x08 with auto-increment (MSB=1) | 374 movlw b'10001000' ; 0x08 with auto-increment (MSB=1) |
412 rcall I2C_TwoBytesRX_div8_2 | 416 rcall I2C_TwoBytesRX_div8_2 |
413 MOVII mpr,compass_DZ | 417 MOVII mpr,compass_DZ |
414 bsf SSP1CON2,PEN ; stop condition | 418 bsf SSP1CON2,PEN ; stop condition |
415 bra WaitMSSP ; ... and return | 419 bra WaitMSSP ; ... and return |
416 | 420 |
417 I2C_RX_compass2: ; newest compass | 421 I2C_RX_compass2: ; compass type 2 |
418 bsf SSP1CON2,SEN ; start condition | 422 bsf SSP1CON2,SEN ; start condition |
419 rcall WaitMSSP | 423 rcall WaitMSSP |
420 movlw 0x3C ; address | 424 movlw 0x3C ; address |
421 rcall I2C_TX | 425 rcall I2C_TX |
422 movlw 0xE8 ; 0x68 with auto-increment (MSB=1) | 426 movlw 0xE8 ; 0x68 with auto-increment (MSB=1) |
423 rcall I2C_TX | 427 rcall I2C_TX |
424 bsf SSP1CON2,RSEN ; repeated start condition (!) | 428 bsf SSP1CON2,RSEN ; repeated start condition (!) |
425 rcall WaitMSSP | 429 rcall WaitMSSP |
426 movlw 0x3D ; address | 430 movlw 0x3D ; address |
427 rcall I2C_TX | 431 rcall I2C_TX |
428 I2C_RX_compass2_xx: ; compass 3 enters here | 432 I2C_RX_compass2_xx: ; compass 3 joins in here |
429 ; rcall WaitMSSP | 433 ; rcall WaitMSSP |
430 rcall I2C_OneByteRX ; get one byte | 434 rcall I2C_OneByteRX ; get one byte |
431 movff SSP1BUF,lo ; data byte | 435 movff SSP1BUF,lo ; data byte |
432 rcall I2C_OneByteRX ; get one byte | 436 rcall I2C_OneByteRX ; get one byte |
433 movff SSP1BUF,hi ; data byte | 437 movff SSP1BUF,hi ; data byte |
460 rcall I2C_OneByteRX ; get one byte | 464 rcall I2C_OneByteRX ; get one byte |
461 movff SSP1BUF,hi ; data byte | 465 movff SSP1BUF,hi ; data byte |
462 ; rcall I2C_TwoBytesRX_div8_2 | 466 ; rcall I2C_TwoBytesRX_div8_2 |
463 MOVII mpr,compass_DZ | 467 MOVII mpr,compass_DZ |
464 bsf SSP1CON2,PEN ; stop condition | 468 bsf SSP1CON2,PEN ; stop condition |
465 bra WaitMSSP ;(And return) | 469 bra WaitMSSP ; ...and return |
466 | 470 |
467 I2C_RX_compass3: | 471 I2C_RX_compass3: ; compass type 3 |
468 bsf SSP1CON2,SEN ; Start condition | 472 bsf SSP1CON2,SEN ; start condition |
469 rcall WaitMSSP | 473 rcall WaitMSSP |
470 movlw 0x3C ; address | 474 movlw 0x3C ; address |
471 rcall I2C_TX | 475 rcall I2C_TX |
472 movlw 0xA8 ; 0x28 with auto-increment (MSB=1) | 476 movlw 0xA8 ; 0x28 with auto-increment (MSB=1) |
473 rcall I2C_TX | 477 rcall I2C_TX |
474 bsf SSP1CON2,RSEN ; Repeated start condition (!) | 478 bsf SSP1CON2,RSEN ; repeated start condition (!) |
475 rcall WaitMSSP | 479 rcall WaitMSSP |
476 movlw 0x3D ; address | 480 movlw 0x3D ; address |
477 rcall I2C_TX | 481 rcall I2C_TX |
478 bra I2C_RX_compass2_xx | 482 bra I2C_RX_compass2_xx ; join with compass 2 code |
479 | 483 |
480 ENDIF ; _compass | 484 ENDIF ; _compass |
481 | 485 |
482 ;----------------------------------------------------------------------------- | 486 ;----------------------------------------------------------------------------- |
483 | 487 |
484 global I2C_init_compass | 488 global I2C_init_compass |
485 I2C_init_compass: | 489 I2C_init_compass: |
486 bsf compass_enabled | 490 bsf compass_enabled |
487 bcf compass_type2 | 491 bcf compass_type2 |
488 bcf compass_type3 | 492 bcf compass_type3 |
489 | 493 |
490 ; probe compass 3 | 494 ; probe for compass 3 |
491 bsf SSP1CON2,SEN ; Start condition | 495 bsf SSP1CON2,SEN ; start condition |
492 rcall WaitMSSP | 496 rcall WaitMSSP |
493 movlw 0x3A ; Address byte + Write bit | 497 movlw 0x3A ; address byte + write bit |
494 movwf SSP1BUF ; control byte | |
495 rcall WaitMSSP | |
496 btfss SSP1CON2,ACKSTAT ; ACK? | |
497 bsf compass_type3 ; ACK send. compass2 present | |
498 bsf SSP1CON2,PEN ; Stop condition | |
499 rcall WaitMSSP | |
500 | |
501 btfsc compass_type3 | |
502 bra I2C_init_compass3 ; Compass3 | |
503 | |
504 ; check for compass2 | |
505 bsf SSP1CON2,SEN ; start condition | |
506 rcall WaitMSSP | |
507 movlw 0x32 ; address byte + Write bit | |
508 movwf SSP1BUF ; control byte | 498 movwf SSP1BUF ; control byte |
509 rcall WaitMSSP | 499 rcall WaitMSSP |
510 btfss SSP1CON2,ACKSTAT ; ACK? | 500 btfss SSP1CON2,ACKSTAT ; ACK? |
511 bsf compass_type2 ; YES - ACK send, compass2 present | 501 bsf compass_type3 ; YES - ACK was send, compass 3 present |
512 bsf SSP1CON2,PEN ; NO - stop condition | 502 bsf SSP1CON2,PEN ; stop condition |
513 rcall WaitMSSP | 503 rcall WaitMSSP |
514 btfsc compass_type2 | 504 |
515 bra I2C_init_compass2 ; compass2 | 505 btfsc compass_type3 ; compass 3 found? |
516 | 506 bra I2C_init_compass3 ; YES - initialize compass 3 |
517 ; check for compass0 or compass1... | 507 |
518 bsf compass_type ; set flag | 508 ; probe for compass 2 |
509 bsf SSP1CON2,SEN ; start condition | |
510 rcall WaitMSSP | |
511 movlw 0x32 ; address byte + write bit | |
512 movwf SSP1BUF ; control byte | |
513 rcall WaitMSSP | |
514 btfss SSP1CON2,ACKSTAT ; ACK? | |
515 bsf compass_type2 ; YES - ACK send, compass 2 present | |
516 bsf SSP1CON2,PEN ; stop condition | |
517 rcall WaitMSSP | |
518 | |
519 btfsc compass_type2 ; compass 2 found? | |
520 bra I2C_init_compass2 ; YES - initialize compass 2 | |
521 | |
522 ; probe for compass 0 or 1 | |
523 bsf compass_type1 ; set flag | |
519 bsf SSP1CON2,SEN ; start condition | 524 bsf SSP1CON2,SEN ; start condition |
520 rcall WaitMSSP | 525 rcall WaitMSSP |
521 movlw 0x3C ; address | 526 movlw 0x3C ; address |
522 rcall I2C_TX | 527 rcall I2C_TX |
523 movlw 0x0F | 528 movlw 0x0F |
528 bsf SSP1CON2,SEN ; start condition | 533 bsf SSP1CON2,SEN ; start condition |
529 rcall WaitMSSP | 534 rcall WaitMSSP |
530 movlw 0x3D ; address | 535 movlw 0x3D ; address |
531 rcall I2C_TX | 536 rcall I2C_TX |
532 rcall I2C_OneByteRX ; get one byte | 537 rcall I2C_OneByteRX ; get one byte |
533 movlw 0x49 ; 0x49 = Compass1 | 538 movlw 0x49 ; 0x49 = compass 1 |
534 cpfseq SSP1BUF | 539 cpfseq SSP1BUF |
535 bcf compass_type ; clear flag | 540 bcf compass_type1 ; clear flag |
536 bsf SSP1CON2,PEN ; stop condition | 541 bsf SSP1CON2,PEN ; stop condition |
537 rcall WaitMSSP | 542 rcall WaitMSSP |
538 btfsc compass_type ; compass1 ? | 543 |
539 bra I2C_init_compass1 ; YES | 544 btfsc compass_type1 ; compass 1 found? |
540 | 545 bra I2C_init_compass1 ; YES - initialize compass 1 |
541 ; init compass0 | 546 ;bra I2C_init_compass0 ; NO - must be compass 0 then |
547 | |
548 I2C_init_compass0: | |
549 ; magnetic | |
542 bsf SSP1CON2,SEN ; start condition | 550 bsf SSP1CON2,SEN ; start condition |
543 rcall WaitMSSP | 551 rcall WaitMSSP |
544 movlw 0x3C ; address | 552 movlw 0x3C ; address |
545 rcall I2C_TX | 553 rcall I2C_TX |
546 movlw 0x00 | 554 movlw 0x00 |
547 rcall I2C_TX | 555 rcall I2C_TX |
548 ; movlw b'01101001' ; ConfigA: 3 Hz, 8 samples averaged, test mode (positive bias) | |
549 movlw b'01101000' ; ConfigA: 3 Hz, 8 samples averaged | 556 movlw b'01101000' ; ConfigA: 3 Hz, 8 samples averaged |
550 rcall I2C_TX | 557 rcall I2C_TX |
551 I2C_init_compass_common: | |
552 movff opt_compass_gain,i2c_temp1 ; 0-7 (230 LSB/Gauss to 1370 LSB/Gauss) | 558 movff opt_compass_gain,i2c_temp1 ; 0-7 (230 LSB/Gauss to 1370 LSB/Gauss) |
553 swapf i2c_temp1,F | 559 swapf i2c_temp1,F |
554 comf i2c_temp1,F | 560 comf i2c_temp1,F |
555 bcf STATUS,C | 561 bcf STATUS,C |
556 rlcf i2c_temp1 | 562 rlcf i2c_temp1 |
558 clrf i2c_temp1 | 564 clrf i2c_temp1 |
559 rcall I2C_TX | 565 rcall I2C_TX |
560 movlw b'00000000' ; continuous mode | 566 movlw b'00000000' ; continuous mode |
561 rcall I2C_TX | 567 rcall I2C_TX |
562 bsf SSP1CON2,PEN ; stop condition | 568 bsf SSP1CON2,PEN ; stop condition |
569 rcall WaitMSSP | |
570 | |
571 ; accelerometer | |
572 rcall I2C_sleep_accelerometer0 ; registers can only be changed in standby mode | |
573 | |
574 bsf SSP1CON2,SEN ; start condition | |
575 rcall WaitMSSP | |
576 movlw 0x38 ; address | |
577 rcall I2C_TX | |
578 movlw 0x0E ; XYZ_DATA_CFG | |
579 rcall I2C_TX | |
580 movlw b'00000000' ; high pass filter = 0, +/- 2 g range | |
581 rcall I2C_TX | |
582 bsf SSP1CON2,PEN ; stop condition | |
583 rcall WaitMSSP | |
584 bsf SSP1CON2,SEN ; start condition | |
585 rcall WaitMSSP | |
586 movlw 0x38 ; address | |
587 rcall I2C_TX | |
588 movlw 0x2A ; CTRL_REG1 | |
589 rcall I2C_TX | |
590 ; movlw b'00110000' ; CTRL_REG1: 160 ms data rate, standby mode | |
591 movlw b'00110100' ; CTRL_REG1: 160 ms data rate, standby mode, reduced noise mode | |
592 rcall I2C_TX | |
593 movlw b'00000010' ; CTRL_REG2: high-res in active mode | |
594 rcall I2C_TX | |
595 bsf SSP1CON2,PEN ; stop condition | |
596 rcall WaitMSSP | |
597 | |
598 bsf SSP1CON2,SEN ; start condition | |
599 rcall WaitMSSP | |
600 movlw 0x38 ; address | |
601 rcall I2C_TX | |
602 movlw 0x2A ; CTRL_REG1 | |
603 rcall I2C_TX | |
604 ; movlw b'00110001' ; CTRL_REG1: 160 ms data rate, active mode | |
605 movlw b'00110101' ; CTRL_REG1: 160 ms data rate, standby mode, reduced noise mode, active Mode | |
606 rcall I2C_TX | |
607 bsf SSP1CON2,PEN ; stop condition | |
563 bra WaitMSSP ; ... and return | 608 bra WaitMSSP ; ... and return |
564 | 609 |
610 | |
565 I2C_init_compass1: | 611 I2C_init_compass1: |
566 bsf SSP1CON2,SEN ; start condition | 612 bsf SSP1CON2,SEN ; start condition |
567 rcall WaitMSSP | 613 rcall WaitMSSP |
568 movlw 0x3C ; address | 614 movlw 0x3C ; address |
569 rcall I2C_TX | 615 rcall I2C_TX |
579 rcall I2C_TX | 625 rcall I2C_TX |
580 movlw b'00000000' ; CTRL4 | 626 movlw b'00000000' ; CTRL4 |
581 rcall I2C_TX | 627 rcall I2C_TX |
582 movlw b'01100100' ; CTRL5 HIGH res, 6.25 Hz | 628 movlw b'01100100' ; CTRL5 HIGH res, 6.25 Hz |
583 rcall I2C_TX | 629 rcall I2C_TX |
584 init_compass1_common: | |
585 movff opt_compass_gain,i2c_temp1 ; 0-7 (230 LSB/Gauss to 1370 LSB/Gauss) | 630 movff opt_compass_gain,i2c_temp1 ; 0-7 (230 LSB/Gauss to 1370 LSB/Gauss) |
586 movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730 LSB/Gauss) | 631 movlw b'01100000' ; CTRL6 Full scale (+/-12 Gauss -> 2730 LSB/Gauss) |
587 dcfsnz i2c_temp1,F ; = 1? | 632 dcfsnz i2c_temp1,F ; = 1? |
588 movlw b'01100000' ; YES - CTRL6 Full scale (+/-12 Gauss -> 2730 LSB/Gauss) | 633 movlw b'01100000' ; YES - CTRL6 Full scale (+/-12 Gauss -> 2730 LSB/Gauss) |
589 dcfsnz i2c_temp1,F ; = 2? | 634 dcfsnz i2c_temp1,F ; = 2? |
600 movlw b'00000000' ; YES - CTRL6 (+/-2 Gauss) | 645 movlw b'00000000' ; YES - CTRL6 (+/-2 Gauss) |
601 rcall I2C_TX | 646 rcall I2C_TX |
602 movlw b'00000000' ; CTRL7 Continuous Mode | 647 movlw b'00000000' ; CTRL7 Continuous Mode |
603 rcall I2C_TX | 648 rcall I2C_TX |
604 bsf SSP1CON2,PEN ; stop condition | 649 bsf SSP1CON2,PEN ; stop condition |
650 bra WaitMSSP ; (and return), no I2C_init_accelerometer1 needed (inits with magnetic sensor) | |
651 | |
652 I2C_init_compass2: | |
653 ; magnetic | |
654 bsf SSP1CON2,SEN ; Start condition | |
655 rcall WaitMSSP | |
656 movlw 0x3C ; address | |
657 rcall I2C_TX | |
658 movlw 0xE0 ; 0x60 with auto-increment (MSB=1) | |
659 rcall I2C_TX | |
660 movlw b'10000000' ; CFG_REG_A_M (10Hz, Continuous) 0x60 0x00 | |
661 rcall I2C_TX | |
662 movlw b'00000011' ; CFG_REG_B_M (low-pass filter enabled) 0x61 (set pulse is released every 63 ODR) | |
663 rcall I2C_TX | |
664 movlw b'00010000' ; CFG_REG_C_M BDU=1 0x62 0x57 | |
665 rcall I2C_TX | |
666 bsf SSP1CON2,PEN ; Stop condition | |
667 rcall WaitMSSP | |
668 | |
669 ; accelerometer | |
670 bsf SSP1CON2,SEN ; start condition | |
671 rcall WaitMSSP | |
672 movlw 0x32 ; address | |
673 rcall I2C_TX | |
674 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
675 rcall I2C_TX | |
676 movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) | |
677 rcall I2C_TX | |
678 movlw b'00100111' ; CTRL_REG1_A (10Hz, x,y,z = ON) | |
679 rcall I2C_TX | |
680 movlw b'00000000' ; CTRL_REG2_A | |
681 rcall I2C_TX | |
682 movlw b'00000000' ; CTRL_REG3_A | |
683 rcall I2C_TX | |
684 movlw b'00001000' ; CTRL_REG4_A (BDU=0, +/-2g, HR=1) | |
685 rcall I2C_TX | |
686 ; movlw b'00000000' ; CTRL_REG5_A | |
687 ; rcall I2C_TX | |
688 bsf SSP1CON2,PEN ; stop condition | |
605 bra WaitMSSP ; ... and return | 689 bra WaitMSSP ; ... and return |
606 | 690 |
607 I2C_init_compass2: | |
608 bsf SSP1CON2,SEN ; start condition | |
609 rcall WaitMSSP | |
610 movlw 0x3C ; address | |
611 rcall I2C_TX | |
612 movlw 0xE0 ; 0x60 with auto-increment (MSB=1) | |
613 rcall I2C_TX | |
614 movlw b'00000000' ; CFG_REG_A_M 0x60 (10 Hz, continuous) | |
615 rcall I2C_TX | |
616 movlw b'00000000' ; CFG_REG_B_M 0x61 (low-pass filter off, set pulse is released every 63 ODR) | |
617 rcall I2C_TX | |
618 movlw b'00000000' ; CFG_REG_C_M BDU=0 0x62 | |
619 rcall I2C_TX | |
620 bsf SSP1CON2,PEN ; stop condition | |
621 bra WaitMSSP ; ... and return | |
622 | 691 |
623 I2C_init_compass3: | 692 I2C_init_compass3: |
624 bsf SSP1CON2,SEN ; Start condition | 693 ; magnetic |
694 bsf SSP1CON2,SEN ; Start condition | |
625 rcall WaitMSSP | 695 rcall WaitMSSP |
626 movlw 0x3C ; address | 696 movlw 0x3C ; address |
697 rcall I2C_TX | |
698 movlw 0xA0 ; 0x20 with auto-increment (MSB=1) | |
699 rcall I2C_TX | |
700 movlw b'01110000' ; CTRL_REG1_M (10Hz) 0x20 | |
701 rcall I2C_TX | |
702 movlw b'01100000' ; CTRL_REG2_M (Full-scale: +/- 16gauss) 0x21 | |
703 rcall I2C_TX | |
704 movlw b'01000000' ; CTRL_REG3_M (Continuous) 0x22 | |
705 rcall I2C_TX | |
706 movlw b'00000000' ; CTRL_REG4_M (Z in Low-power mode) 0x23 | |
707 rcall I2C_TX | |
708 movlw b'00000000' ; CTRL_REG5_M 0x24 | |
709 rcall I2C_TX | |
710 movlw b'00000000' ; CTRL_REG5_M 0x24 | |
711 rcall I2C_TX | |
712 bsf SSP1CON2,PEN ; Stop condition | |
713 rcall WaitMSSP | |
714 | |
715 ;accelerometer | |
716 bsf SSP1CON2,SEN ; Start condition | |
717 rcall WaitMSSP | |
718 movlw 0x3A ; address | |
719 rcall I2C_TX | |
720 movlw 0x20 | |
627 rcall I2C_TX | 721 rcall I2C_TX |
628 movlw 0xA0 ; 0x20 with auto-increment (MSB=1) | 722 movlw b'10010111' ; CTRL_REG1_A (100Hz, x,y,z = ON, BDU=OFF) 0x20 |
629 rcall I2C_TX | 723 rcall I2C_TX |
630 movlw b'00010000' ; CTRL_REG1_M (10Hz) 0x20 | 724 movlw b'00000000' ; CTRL_REG2_A 0x21 |
631 rcall I2C_TX | 725 rcall I2C_TX |
632 movlw b'01100000' ; CTRL_REG2_M (Full-scale: +/- 16gauss) 0x21 | 726 movlw b'00000000' ; CTRL_REG3_A 0x22 |
633 rcall I2C_TX | 727 rcall I2C_TX |
634 movlw b'01000000' ; CTRL_REG3_M (Continuous) 0x22 | 728 movlw b'11001100' ; CTRL_REG4_A 0x23 |
635 rcall I2C_TX | 729 rcall I2C_TX |
636 movlw b'00000000' ; CTRL_REG4_M (Z in Low-power mode) 0x23 | 730 bsf SSP1CON2,PEN ; Stop condition |
637 rcall I2C_TX | 731 bra WaitMSSP ; (And return) |
638 movlw b'00000000' ; CTRL_REG5_M 0x24 | 732 |
639 rcall I2C_TX | |
640 movlw b'00000000' ; CTRL_REG5_M 0x24 | |
641 rcall I2C_TX | |
642 bsf SSP1CON2,PEN ; Stop condition | |
643 bra WaitMSSP ;(And return) | |
644 | |
645 | 733 |
646 global I2C_sleep_compass | 734 global I2C_sleep_compass |
647 I2C_sleep_compass: | 735 I2C_sleep_compass: |
736 btfss compass_enabled ; compass active? | |
737 return ; NO - return | |
648 bcf compass_enabled | 738 bcf compass_enabled |
649 btfsc compass_type3 ; compass3? | 739 btfsc compass_type3 ; compass 3 ? |
650 bra I2C_sleep_compass3 ; YES | 740 bra I2C_sleep_compass3 ; YES |
651 btfsc compass_type2 ; compass2 ? | 741 btfsc compass_type2 ; compass 2 ? |
652 bra I2C_sleep_compass2 ; YES | 742 bra I2C_sleep_compass2 ; YES |
653 btfsc compass_type ; compass1 ? | 743 btfsc compass_type1 ; compass 1 ? |
654 bra I2C_sleep_compass1 ; YES | 744 bra I2C_sleep_compass1 ; YES |
745 ;bra I2C_sleep_compass0 ; NO - must be compass 0 then | |
746 | |
655 I2C_sleep_compass0: | 747 I2C_sleep_compass0: |
748 ; magnetic | |
656 bsf SSP1CON2,SEN ; start condition | 749 bsf SSP1CON2,SEN ; start condition |
657 rcall WaitMSSP | 750 rcall WaitMSSP |
658 movlw 0x3C ; address | 751 movlw 0x3C ; address |
659 rcall I2C_TX | 752 rcall I2C_TX |
660 movlw 0x00 | 753 movlw 0x00 |
664 movlw b'00100000' ; ConfigB | 757 movlw b'00100000' ; ConfigB |
665 rcall I2C_TX | 758 rcall I2C_TX |
666 movlw b'00000010' ; idle mode | 759 movlw b'00000010' ; idle mode |
667 rcall I2C_TX | 760 rcall I2C_TX |
668 bsf SSP1CON2,PEN ; stop condition | 761 bsf SSP1CON2,PEN ; stop condition |
762 rcall WaitMSSP | |
763 | |
764 I2C_sleep_accelerometer0: ;(needed) | |
765 ; accelerometer | |
766 bsf SSP1CON2,SEN ; start condition | |
767 rcall WaitMSSP | |
768 movlw 0x38 ; address | |
769 rcall I2C_TX | |
770 movlw 0x2A ; CTRL_REG1 | |
771 rcall I2C_TX | |
772 movlw b'00000000' ; standby mode | |
773 rcall I2C_TX | |
774 bsf SSP1CON2,PEN ; stop condition | |
669 bra WaitMSSP ; ... and return | 775 bra WaitMSSP ; ... and return |
670 | 776 |
671 I2C_sleep_compass1: | 777 I2C_sleep_compass1: |
672 bsf SSP1CON2,SEN ; start condition | 778 bsf SSP1CON2,SEN ; start condition |
673 rcall WaitMSSP | 779 rcall WaitMSSP |
686 movlw 0x26 ; CTRL_REG7 | 792 movlw 0x26 ; CTRL_REG7 |
687 rcall I2C_TX | 793 rcall I2C_TX |
688 movlw b'00000010' ; data for CTRL_REG7: magnetic sensor power-down mode | 794 movlw b'00000010' ; data for CTRL_REG7: magnetic sensor power-down mode |
689 rcall I2C_TX | 795 rcall I2C_TX |
690 bsf SSP1CON2,PEN ; stop condition | 796 bsf SSP1CON2,PEN ; stop condition |
691 bra WaitMSSP ; and return | 797 bra WaitMSSP ; (And return) - no I2C_sleep_accelerometer1 required (sleeps with magnetic sensor) |
798 | |
692 | 799 |
693 I2C_sleep_compass2: | 800 I2C_sleep_compass2: |
694 ; magnetic | 801 ; magnetic |
695 bsf SSP1CON2,SEN ; start condition | 802 bsf SSP1CON2,SEN ; start condition |
696 rcall WaitMSSP | 803 rcall WaitMSSP |
705 movlw b'01010001' ; CFG_REG_C_M 0x62 | 812 movlw b'01010001' ; CFG_REG_C_M 0x62 |
706 rcall I2C_TX | 813 rcall I2C_TX |
707 movlw b'00000000' ; INT_CTRL_REG_M 0x63 | 814 movlw b'00000000' ; INT_CTRL_REG_M 0x63 |
708 rcall I2C_TX | 815 rcall I2C_TX |
709 bsf SSP1CON2,PEN ; stop condition | 816 bsf SSP1CON2,PEN ; stop condition |
817 rcall WaitMSSP | |
818 | |
819 ; accelerometer | |
820 bsf SSP1CON2,SEN ; start condition | |
821 rcall WaitMSSP | |
822 movlw 0x32 ; address | |
823 rcall I2C_TX | |
824 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
825 rcall I2C_TX | |
826 movlw b'00000000' ; TEMP_CFG_REG_A 0x1F (temp sensor off) | |
827 rcall I2C_TX | |
828 movlw b'00000000' ; CTRL_REG1_A 0x20 (all off) | |
829 rcall I2C_TX | |
830 bsf SSP1CON2,PEN ; stop condition | |
710 bra WaitMSSP ; ... and return | 831 bra WaitMSSP ; ... and return |
711 | 832 |
712 I2C_sleep_compass3: | 833 I2C_sleep_compass3: |
713 ; magnetic | 834 ; magnetic |
714 bsf SSP1CON2,SEN ; Start condition | 835 bsf SSP1CON2,SEN ; start condition |
715 rcall WaitMSSP | 836 rcall WaitMSSP |
716 movlw 0x3C ; address | 837 movlw 0x3C ; address |
717 rcall I2C_TX | 838 rcall I2C_TX |
718 movlw 0xA2 ; 0x22 with auto-increment (MSB=1) | 839 movlw 0xA2 ; 0x22 with auto-increment (MSB=1) |
719 movlw b'01000010' ; CTRL_REG3_M (Power-down) 0x22 | 840 rcall I2C_TX |
720 rcall I2C_TX | 841 movlw b'01000010' ; CTRL_REG3_M (power-down) 0x22 |
721 bsf SSP1CON2,PEN ; Stop condition | 842 rcall I2C_TX |
722 bra WaitMSSP ;(And return) | 843 bsf SSP1CON2,PEN ; stop condition |
723 | 844 rcall WaitMSSP |
724 I2C_sleep_accelerometer2: | 845 |
725 ; accelerometer | 846 ; accelerometer |
726 bsf SSP1CON2,SEN ; start condition | 847 bsf SSP1CON2,SEN ; start condition |
727 rcall WaitMSSP | 848 rcall WaitMSSP |
728 movlw 0x32 ; address | 849 movlw 0x3A ; address |
729 rcall I2C_TX | 850 rcall I2C_TX |
730 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
731 rcall I2C_TX | |
732 movlw b'00000000' ; TEMP_CFG_REG_A 0x1F (temp sensor off) | |
733 rcall I2C_TX | |
734 movlw b'00000000' ; CTRL_REG1_A 0x20 (all off) | |
735 rcall I2C_TX | |
736 bsf SSP1CON2,PEN ; stop condition | |
737 bra WaitMSSP ; ... and return | |
738 | |
739 I2C_sleep_accelerometer3: | |
740 ; accelerometer | |
741 bsf SSP1CON2,SEN ; Start condition | |
742 rcall WaitMSSP | |
743 movlw 0x3A ; address | |
744 rcall I2C_TX | |
745 movlw 0x20 | 851 movlw 0x20 |
746 rcall I2C_TX | 852 rcall I2C_TX |
747 movlw b'00000000' ; CTRL_REG1_A (100Hz, x,y,z = ON) 0x20 | 853 movlw b'00000000' ; CTRL_REG1_A (100Hz, x,y,z = OFF) 0x20 |
748 rcall I2C_TX | 854 rcall I2C_TX |
749 bsf SSP1CON2,PEN ; Stop condition | 855 bsf SSP1CON2,PEN ; stop condition |
750 bra WaitMSSP ; (And return) | 856 bra WaitMSSP ; ... and return |
751 | |
752 | 857 |
753 WaitMSSP: | 858 WaitMSSP: |
754 decfsz i2c_temp1,F ; check for timeout during I2C action | 859 decfsz i2c_temp1,F ; check for timeout during I2C action |
755 bra WaitMSSP2 | 860 bra WaitMSSP2 |
756 bra I2CFail ; timeout occurred | 861 bra I2CFail ; timeout occurred |
760 clrf i2c_temp1 | 865 clrf i2c_temp1 |
761 bcf PIR1,SSP1IF | 866 bcf PIR1,SSP1IF |
762 return | 867 return |
763 | 868 |
764 I2C_WaitforACK: | 869 I2C_WaitforACK: |
765 btfss SSP1CON2,ACKSTAT ; checks for ACK bit from slave | 870 btfss SSP1CON2,ACKSTAT ; ACK received from slave? |
766 return | 871 return ; YES |
767 I2CFail: | 872 I2CFail: ; NO |
768 bsf active_reset_ostc_rx ; RESET RX circuitry (Which may be the cause for the hang up) | 873 bsf active_reset_ostc_rx ; - reset RX circuitry (which may be the cause for the hang up) |
769 rcall I2CReset ; I2C Reset | 874 rcall I2CReset ; - reset I2C |
770 bcf PIR1,SSP1IF | 875 bcf PIR1,SSP1IF ; - |
771 clrf i2c_temp1 | 876 clrf i2c_temp1 ; - |
772 bsf i2c_error_flag ; set error flag | 877 bsf i2c_error_flag ; - set error flag |
773 bcf active_reset_ostc_rx ; release RESET from RX circuitry | 878 bcf active_reset_ostc_rx ; - release reset from RX circuitry |
774 return | 879 return ; - done |
775 | 880 |
776 I2CReset: ; something went wrong (slave holds SDA low?) | 881 I2CReset: ; something went wrong (slave holds SDA low?) |
777 clrf SSP1CON1 ; wake-up slave and reset entire module | 882 clrf SSP1CON1 ; wake-up slave and reset entire module |
778 clrf SSP1CON2 | 883 clrf SSP1CON2 |
779 clrf SSP1STAT | 884 clrf SSP1STAT |
806 movwf SSP1STAT | 911 movwf SSP1STAT |
807 movlw b'00101000' | 912 movlw b'00101000' |
808 movwf SSP1CON1 | 913 movwf SSP1CON1 |
809 movlw b'00000000' | 914 movlw b'00000000' |
810 movwf SSP1CON2 | 915 movwf SSP1CON2 |
811 movlw 0x27 | 916 movlw 0x9C |
812 movwf SSP1ADD | 917 movwf SSP1ADD |
813 return | 918 return |
814 | 919 |
815 | |
816 global I2C_init_accelerometer | |
817 I2C_init_accelerometer: | |
818 btfsc compass_type3 ; compass3? | |
819 bra I2C_init_accelerometer3 ; YES | |
820 | |
821 btfsc compass_type2 ; compass2 ? | |
822 bra I2C_init_accelerometer2 ; YES | |
823 | |
824 btfsc compass_type ; compass1 ? | |
825 return ; YES - ignore | |
826 | |
827 rcall I2C_sleep_accelerometer ; registers can only be changed in standby mode | |
828 | |
829 bsf SSP1CON2,SEN ; start condition | |
830 rcall WaitMSSP | |
831 movlw 0x38 ; address | |
832 rcall I2C_TX | |
833 movlw 0x0E ; XYZ_DATA_CFG | |
834 rcall I2C_TX | |
835 movlw b'00000000' ; high pass filter = 0, +/- 2g range | |
836 rcall I2C_TX | |
837 bsf SSP1CON2,PEN ; stop condition | |
838 rcall WaitMSSP | |
839 | |
840 bsf SSP1CON2,SEN ; start condition | |
841 rcall WaitMSSP | |
842 movlw 0x38 ; address | |
843 rcall I2C_TX | |
844 movlw 0x2A ; CTRL_REG1 | |
845 rcall I2C_TX | |
846 ; movlw b'00110000' ; CTRL_REG1: 160 ms data rate, standby mode | |
847 movlw b'00110100' ; CTRL_REG1: 160 ms data rate, standby mode, reduced noise mode | |
848 rcall I2C_TX | |
849 movlw b'00000010' ; CTRL_REG2: high-res in active mode | |
850 rcall I2C_TX | |
851 bsf SSP1CON2,PEN ; stop condition | |
852 rcall WaitMSSP | |
853 | |
854 bsf SSP1CON2,SEN ; start condition | |
855 rcall WaitMSSP | |
856 movlw 0x38 ; address | |
857 rcall I2C_TX | |
858 movlw 0x2A ; CTRL_REG1 | |
859 rcall I2C_TX | |
860 ; movlw b'00110001' ; CTRL_REG1: 160 ms data rate, active mode | |
861 movlw b'00110101' ; CTRL_REG1: 160 ms data rate, standby mode, reduced noise mode, active Mode | |
862 rcall I2C_TX | |
863 bsf SSP1CON2,PEN ; stop condition | |
864 bra WaitMSSP ; ... and return | |
865 | |
866 I2C_init_accelerometer2: | |
867 bsf SSP1CON2,SEN ; start condition | |
868 rcall WaitMSSP | |
869 movlw 0x32 ; address | |
870 rcall I2C_TX | |
871 movlw 0x9F ; 1F with auto-increment (MSB=1) | |
872 rcall I2C_TX | |
873 movlw b'00000000' ; TEMP_CFG_REG_A (Temp sensor off) | |
874 rcall I2C_TX | |
875 movlw b'01010111' ; CTRL_REG1_A (100Hz, x,y,z = ON) | |
876 rcall I2C_TX | |
877 movlw b'00000000' ; CTRL_REG2_A | |
878 rcall I2C_TX | |
879 ; movlw b'00000000' ; CTRL_REG3_A | |
880 ; rcall I2C_TX | |
881 ; movlw b'00000000' ; CTRL_REG4_A (BDU=0, +/-2g, | |
882 ; rcall I2C_TX | |
883 ; movlw b'00000000' ; CTRL_REG5_A | |
884 ; rcall I2C_TX | |
885 bsf SSP1CON2,PEN ; stop condition | |
886 bra WaitMSSP ; ... and return | |
887 | |
888 I2C_init_accelerometer3: | |
889 bsf SSP1CON2,SEN ; Start condition | |
890 rcall WaitMSSP | |
891 movlw 0x3A ; address | |
892 rcall I2C_TX | |
893 movlw 0x20 | |
894 rcall I2C_TX | |
895 movlw b'00110111' ; CTRL_REG1_A (100Hz, x,y,z = ON) 0x20 | |
896 rcall I2C_TX | |
897 movlw b'00000000' ; CTRL_REG2_A 0x21 | |
898 rcall I2C_TX | |
899 movlw b'00000000' ; CTRL_REG3_A 0x22 | |
900 rcall I2C_TX | |
901 bsf SSP1CON2,PEN ; Stop condition | |
902 bra WaitMSSP ; (And return) | |
903 | |
904 | |
905 global I2C_sleep_accelerometer | |
906 I2C_sleep_accelerometer: | |
907 btfsc compass_type3 ; Compass3 | |
908 bra I2C_sleep_accelerometer3 ; YES | |
909 btfsc compass_type2 ; Compass2 | |
910 bra I2C_sleep_accelerometer2 ; YES | |
911 btfsc compass_type ; compass1? | |
912 return ; YES - ignore | |
913 | |
914 bsf SSP1CON2,SEN ; start condition | |
915 rcall WaitMSSP | |
916 movlw 0x38 ; address | |
917 rcall I2C_TX | |
918 movlw 0x2A ; CTRL_REG1 | |
919 rcall I2C_TX | |
920 movlw b'00000000' ; standby mode | |
921 rcall I2C_TX | |
922 bsf SSP1CON2,PEN ; stop condition | |
923 bra WaitMSSP ; ... and return | |
924 | 920 |
925 lt2942_init_again: | 921 lt2942_init_again: |
926 clrf i2c_temp1 | 922 clrf i2c_temp1 |
927 movlw 0x02 ; point to accumulated charge registers | 923 movlw 0x02 ; point to accumulated charge registers |
928 rcall I2C_TX_GAUGE | 924 rcall I2C_TX_GAUGE |
934 rcall I2C_WaitforACK | 930 rcall I2C_WaitforACK |
935 bsf SSP1CON2,PEN ; stop condition | 931 bsf SSP1CON2,PEN ; stop condition |
936 rcall WaitMSSP | 932 rcall WaitMSSP |
937 MOVII battery_accumulated_charge,sub_a | 933 MOVII battery_accumulated_charge,sub_a |
938 ; and init again... | 934 ; and init again... |
935 | |
939 | 936 |
940 global lt2942_init | 937 global lt2942_init |
941 lt2942_init: ; setup control register B | 938 lt2942_init: ; setup control register B |
942 clrf i2c_temp1 | 939 clrf i2c_temp1 |
943 movlw 0x01 ; point to control reg B | 940 movlw 0x01 ; point to control reg B |
946 movff WREG, SSP1BUF ; data byte | 943 movff WREG, SSP1BUF ; data byte |
947 rcall WaitMSSP | 944 rcall WaitMSSP |
948 rcall I2C_WaitforACK | 945 rcall I2C_WaitforACK |
949 bsf SSP1CON2,PEN ; stop condition | 946 bsf SSP1CON2,PEN ; stop condition |
950 bra WaitMSSP ; ... and return | 947 bra WaitMSSP ; ... and return |
948 | |
951 | 949 |
952 global lt2942_get_status | 950 global lt2942_get_status |
953 lt2942_get_status: ; read status register | 951 lt2942_get_status: ; read status register |
954 bcf battery_gauge_available ; clear flag | 952 bcf battery_gauge_available ; clear flag |
955 clrf i2c_temp1 | 953 clrf i2c_temp1 |
997 call I2C_TX_GAUGE | 995 call I2C_TX_GAUGE |
998 call I2C_RX_GAUGE | 996 call I2C_RX_GAUGE |
999 bsf SSP1CON2,ACKEN ; master acknowledge | 997 bsf SSP1CON2,ACKEN ; master acknowledge |
1000 rcall WaitMSSP | 998 rcall WaitMSSP |
1001 movff SSP1BUF,xA+1 ; store raw temperature, high byte | 999 movff SSP1BUF,xA+1 ; store raw temperature, high byte |
1002 bsf SSP1CON2, RCEN ; enable receive mode | 1000 bsf SSP1CON2,RCEN ; enable receive mode |
1003 rcall WaitMSSP | 1001 rcall WaitMSSP |
1004 movff SSP1BUF,xA+0 ; store raw temperature, low byte | 1002 movff SSP1BUF,xA+0 ; store raw temperature, low byte |
1005 bsf SSP1CON2,PEN ; stop condition | 1003 bsf SSP1CON2,PEN ; stop condition |
1006 rcall WaitMSSP | 1004 rcall WaitMSSP |
1007 | 1005 |
1073 ; > zero, set batt_percent properly | 1071 ; > zero, set batt_percent properly |
1074 MOVII sub_c,xA | 1072 MOVII sub_c,xA |
1075 MOVII battery_capacity,xB | 1073 MOVII battery_capacity,xB |
1076 call div16x16 ; xC = xA / xB with xA as remainder | 1074 call div16x16 ; xC = xA / xB with xA as remainder |
1077 movff xC+0,batt_percent | 1075 movff xC+0,batt_percent |
1076 movlw .100 ; max. value is 100 % | |
1077 cpfslt batt_percent ; batt_percent < 100 % ? | |
1078 movwf batt_percent ; NO - limit to 100 % | |
1078 return | 1079 return |
1079 | 1080 |
1080 lt2942_set_to_zero_percent: | 1081 lt2942_set_to_zero_percent: |
1081 clrf i2c_temp1 | 1082 clrf i2c_temp1 |
1082 movlw 0x02 ; point to accumulated charge registers | 1083 movlw 0x02 ; point to accumulated charge registers |
1087 movff battery_offset+0,SSP1BUF | 1088 movff battery_offset+0,SSP1BUF |
1088 rcall WaitMSSP | 1089 rcall WaitMSSP |
1089 rcall I2C_WaitforACK | 1090 rcall I2C_WaitforACK |
1090 bsf SSP1CON2,PEN ; stop condition | 1091 bsf SSP1CON2,PEN ; stop condition |
1091 bra WaitMSSP ; ... and return | 1092 bra WaitMSSP ; ... and return |
1093 | |
1092 | 1094 |
1093 global lt2942_charge_done | 1095 global lt2942_charge_done |
1094 lt2942_charge_done: ; reset accumulating registers to 0xFFFF | 1096 lt2942_charge_done: ; reset accumulating registers to 0xFFFF |
1095 clrf i2c_temp1 | 1097 clrf i2c_temp1 |
1096 movlw 0x02 ; point to accumulated charge registers | 1098 movlw 0x02 ; point to accumulated charge registers |
1120 rcall WaitMSSP | 1122 rcall WaitMSSP |
1121 movlw b'11001001' ; address byte + Read bit | 1123 movlw b'11001001' ; address byte + Read bit |
1122 movwf SSP1BUF ; control byte | 1124 movwf SSP1BUF ; control byte |
1123 rcall WaitMSSP | 1125 rcall WaitMSSP |
1124 rcall I2C_WaitforACK | 1126 rcall I2C_WaitforACK |
1125 bsf SSP1CON2, RCEN ; enable receive mode | 1127 bsf SSP1CON2,RCEN ; enable receive mode |
1126 bra WaitMSSP ; ... and return | 1128 bra WaitMSSP ; ... and return |
1127 | 1129 |
1128 | 1130 |
1129 ;============================================================================= | 1131 ;============================================================================= |
1130 ; Transmitter Functions | 1132 ; Transmitter Functions |
1254 bcf SSP1CON2,ACKDT ; reset ACKDT flag | 1256 bcf SSP1CON2,ACKDT ; reset ACKDT flag |
1255 bsf SSP1CON2,PEN ; stop condition | 1257 bsf SSP1CON2,PEN ; stop condition |
1256 bra WaitMSSP ; ... and return | 1258 bra WaitMSSP ; ... and return |
1257 | 1259 |
1258 | 1260 |
1261 IFDEF _rx_update | |
1262 | |
1259 global I2C_update_OSTC_rx | 1263 global I2C_update_OSTC_rx |
1260 I2C_update_OSTC_rx: ; transfer 64 byte to RX co-processor | 1264 I2C_update_OSTC_rx: ; transfer 64 byte to RX co-processor |
1261 ; setup for write | 1265 ; setup for write |
1262 bcf i2c_error_flag ; clear error flag | 1266 bcf i2c_error_flag ; clear error flag |
1263 lfsr FSR2,buffer ; initialize pointer to send buffer used for verify | 1267 lfsr FSR2,buffer ; initialize pointer to send buffer used for verify |
1336 ; error check | 1340 ; error check |
1337 btfss i2c_error_flag ; did an error occur? | 1341 btfss i2c_error_flag ; did an error occur? |
1338 retlw .0 ; NO - data transfered successfully | 1342 retlw .0 ; NO - data transfered successfully |
1339 retlw .255 ; YES - error in data transfer occurred | 1343 retlw .255 ; YES - error in data transfer occurred |
1340 | 1344 |
1341 ENDIF | 1345 ENDIF ; _rx_update |
1346 | |
1347 ENDIF ; _rx_functions | |
1342 | 1348 |
1343 ;============================================================================= | 1349 ;============================================================================= |
1344 | 1350 |
1345 END | 1351 END |