Mercurial > public > hwos_code
comparison src/i2c.asm @ 624:7bdcc591196c
Support for Compass3 hardware
author | heinrichsweikamp |
---|---|
date | Thu, 13 Jun 2019 10:07:55 +0200 |
parents | c40025d8e750 |
children | bf5fee575701 |
comparison
equal
deleted
inserted
replaced
623:c40025d8e750 | 624:7bdcc591196c |
---|---|
23 ; -------- | 23 ; -------- |
24 ; LSM303AGR's Compass read address (8-Bit): 0x3D | 24 ; LSM303AGR's Compass read address (8-Bit): 0x3D |
25 ; LSM303AGR's Compass write address (8-Bit): 0x3C | 25 ; LSM303AGR's Compass write address (8-Bit): 0x3C |
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 ; | |
29 ; Compass3 | |
30 ; -------- | |
31 ; LSM303C's Compass read address (8-Bit): 0x3D | |
32 ; LSM303C's Compass write address (8-Bit): 0x3C | |
33 ; LSM303C's Acceleration read address (8-Bit): 0x3B | |
34 ; LSM303C's Acceleration write address (8-Bit): 0x3A | |
28 ; | 35 ; |
29 ; RX Circuity | 36 ; RX Circuity |
30 ; ----------- | 37 ; ----------- |
31 ; RX Circuity read address (8-Bit): 0x51 | 38 ; RX Circuity read address (8-Bit): 0x51 |
32 ; RX Circuity write address (8-Bit): 0x50 | 39 ; RX Circuity write address (8-Bit): 0x50 |
82 rrcf lo | 89 rrcf lo |
83 return | 90 return |
84 | 91 |
85 global I2C_RX_accelerometer | 92 global I2C_RX_accelerometer |
86 I2C_RX_accelerometer: | 93 I2C_RX_accelerometer: |
94 btfsc compass_type3 ; compass3 | |
95 bra I2C_RX_accelerometer_compass3 ; yes | |
87 btfsc compass_type2 ; compass2 ? | 96 btfsc compass_type2 ; compass2 ? |
88 bra I2C_RX_accelerometer_compass2 ; YES | 97 bra I2C_RX_accelerometer_compass2 ; YES |
89 btfsc compass_type ; compass1 ? | 98 btfsc compass_type ; compass1 ? |
90 bra I2C_RX_accelerometer_compass1 ; YES | 99 bra I2C_RX_accelerometer_compass1 ; YES |
91 I2C_RX_accelerometer_compass0: | 100 I2C_RX_accelerometer_compass0: |
159 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | 168 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) |
160 rcall I2C_TX | 169 rcall I2C_TX |
161 bsf SSP1CON2,RSEN ; repeated start condition (!) | 170 bsf SSP1CON2,RSEN ; repeated start condition (!) |
162 rcall WaitMSSP | 171 rcall WaitMSSP |
163 movlw 0x3D ; address | 172 movlw 0x3D ; address |
164 I2C_RX_accelerometer_compass1_xx: ; compass2 continues here... | 173 I2C_RX_accelerometer_compass1_xx: ; compass2 and 3 continue here... |
165 rcall I2C_TX | 174 rcall I2C_TX |
166 | 175 |
167 ; Non-flipped screen: | 176 ; Non-flipped screen: |
168 ; Chip orientation on the PCB requires | 177 ; Chip orientation on the PCB requires |
169 ; Original = Corrected | 178 ; Original = Corrected |
247 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) | 256 movlw b'10101000' ; 0x28 with auto-increment (MSB=1) |
248 rcall I2C_TX | 257 rcall I2C_TX |
249 bsf SSP1CON2,RSEN ; repeated start condition (!) | 258 bsf SSP1CON2,RSEN ; repeated start condition (!) |
250 rcall WaitMSSP | 259 rcall WaitMSSP |
251 movlw 0x33 ; address | 260 movlw 0x33 ; address |
252 bra I2C_RX_accelerometer_compass1_xx | 261 bra I2C_RX_accelerometer_compass1_xx |
262 | |
263 I2C_RX_accelerometer_compass3: | |
264 bsf SSP1CON2,SEN ; Start condition | |
265 rcall WaitMSSP | |
266 movlw 0x3A ; address | |
267 rcall I2C_TX | |
268 movlw 0x28 ; 0x28 (OUT_X_L_A) | |
269 rcall I2C_TX | |
270 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
271 rcall WaitMSSP | |
272 movlw 0x3B ; address | |
273 bra I2C_RX_accelerometer_compass1_xx | |
253 | 274 |
254 I2C_OneByteRX: | 275 I2C_OneByteRX: |
255 bsf SSP1CON2,RCEN ; enable receive mode | 276 bsf SSP1CON2,RCEN ; enable receive mode |
256 rcall WaitMSSP | 277 rcall WaitMSSP |
257 bsf SSP1CON2,ACKEN ; master acknowledge | 278 bsf SSP1CON2,ACKEN ; master acknowledge |
261 ;----------------------------------------------------------------------------- | 282 ;----------------------------------------------------------------------------- |
262 IFDEF _compass | 283 IFDEF _compass |
263 | 284 |
264 global I2C_RX_compass | 285 global I2C_RX_compass |
265 I2C_RX_compass: | 286 I2C_RX_compass: |
287 btfsc compass_type3 ; compass3 | |
288 bra I2C_RX_compass3 ; YES | |
266 btfsc compass_type2 ; compass2 ? | 289 btfsc compass_type2 ; compass2 ? |
267 bra I2C_RX_compass2 ; YES | 290 bra I2C_RX_compass2 ; YES |
268 btfsc compass_type ; compass1 ? | 291 btfsc compass_type ; compass1 ? |
269 bra I2C_RX_compass1 ; YES | 292 bra I2C_RX_compass1 ; YES |
270 I2C_RX_compass0: | 293 I2C_RX_compass0: |
400 rcall I2C_TX | 423 rcall I2C_TX |
401 bsf SSP1CON2,RSEN ; repeated start condition (!) | 424 bsf SSP1CON2,RSEN ; repeated start condition (!) |
402 rcall WaitMSSP | 425 rcall WaitMSSP |
403 movlw 0x3D ; address | 426 movlw 0x3D ; address |
404 rcall I2C_TX | 427 rcall I2C_TX |
428 I2C_RX_compass2_xx: ; compass 3 enters here | |
405 ; rcall WaitMSSP | 429 ; rcall WaitMSSP |
406 rcall I2C_OneByteRX ; get one byte | 430 rcall I2C_OneByteRX ; get one byte |
407 movff SSP1BUF,lo ; data byte | 431 movff SSP1BUF,lo ; data byte |
408 rcall I2C_OneByteRX ; get one byte | 432 rcall I2C_OneByteRX ; get one byte |
409 movff SSP1BUF,hi ; data byte | 433 movff SSP1BUF,hi ; data byte |
438 ; rcall I2C_TwoBytesRX_div8_2 | 462 ; rcall I2C_TwoBytesRX_div8_2 |
439 MOVII mpr,compass_DZ | 463 MOVII mpr,compass_DZ |
440 bsf SSP1CON2,PEN ; stop condition | 464 bsf SSP1CON2,PEN ; stop condition |
441 bra WaitMSSP ;(And return) | 465 bra WaitMSSP ;(And return) |
442 | 466 |
467 I2C_RX_compass3: | |
468 bsf SSP1CON2,SEN ; Start condition | |
469 rcall WaitMSSP | |
470 movlw 0x3C ; address | |
471 rcall I2C_TX | |
472 movlw 0xA8 ; 0x28 with auto-increment (MSB=1) | |
473 rcall I2C_TX | |
474 bsf SSP1CON2,RSEN ; Repeated start condition (!) | |
475 rcall WaitMSSP | |
476 movlw 0x3D ; address | |
477 rcall I2C_TX | |
478 bra I2C_RX_compass2_xx | |
479 | |
443 ENDIF ; _compass | 480 ENDIF ; _compass |
444 | 481 |
445 ;----------------------------------------------------------------------------- | 482 ;----------------------------------------------------------------------------- |
446 | 483 |
447 global I2C_init_compass | 484 global I2C_init_compass |
448 I2C_init_compass: | 485 I2C_init_compass: |
449 bsf compass_enabled | 486 bsf compass_enabled |
450 bcf compass_type2 | 487 bcf compass_type2 |
488 bcf compass_type3 | |
489 | |
490 ; probe compass 3 | |
491 bsf SSP1CON2,SEN ; Start condition | |
492 rcall WaitMSSP | |
493 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 | |
451 | 503 |
452 ; check for compass2 | 504 ; check for compass2 |
453 bsf SSP1CON2,SEN ; start condition | 505 bsf SSP1CON2,SEN ; start condition |
454 rcall WaitMSSP | 506 rcall WaitMSSP |
455 movlw 0x32 ; address byte + Write bit | 507 movlw 0x32 ; address byte + Write bit |
566 movlw b'00000000' ; CFG_REG_C_M BDU=0 0x62 | 618 movlw b'00000000' ; CFG_REG_C_M BDU=0 0x62 |
567 rcall I2C_TX | 619 rcall I2C_TX |
568 bsf SSP1CON2,PEN ; stop condition | 620 bsf SSP1CON2,PEN ; stop condition |
569 bra WaitMSSP ; ... and return | 621 bra WaitMSSP ; ... and return |
570 | 622 |
623 I2C_init_compass3: | |
624 bsf SSP1CON2,SEN ; Start condition | |
625 rcall WaitMSSP | |
626 movlw 0x3C ; address | |
627 rcall I2C_TX | |
628 movlw 0xA0 ; 0x20 with auto-increment (MSB=1) | |
629 rcall I2C_TX | |
630 movlw b'00010000' ; CTRL_REG1_M (10Hz) 0x20 | |
631 rcall I2C_TX | |
632 movlw b'01100000' ; CTRL_REG2_M (Full-scale: +/- 16gauss) 0x21 | |
633 rcall I2C_TX | |
634 movlw b'01000000' ; CTRL_REG3_M (Continuous) 0x22 | |
635 rcall I2C_TX | |
636 movlw b'00000000' ; CTRL_REG4_M (Z in Low-power mode) 0x23 | |
637 rcall I2C_TX | |
638 movlw b'00000000' ; CTRL_REG5_M 0x24 | |
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 | |
571 | 645 |
572 global I2C_sleep_compass | 646 global I2C_sleep_compass |
573 I2C_sleep_compass: | 647 I2C_sleep_compass: |
574 bcf compass_enabled | 648 bcf compass_enabled |
649 btfsc compass_type3 ; compass3? | |
650 bra I2C_sleep_compass3 ; YES | |
575 btfsc compass_type2 ; compass2 ? | 651 btfsc compass_type2 ; compass2 ? |
576 bra I2C_sleep_compass2 ; YES | 652 bra I2C_sleep_compass2 ; YES |
577 btfsc compass_type ; compass1 ? | 653 btfsc compass_type ; compass1 ? |
578 bra I2C_sleep_compass1 ; YES | 654 bra I2C_sleep_compass1 ; YES |
579 I2C_sleep_compass0: | 655 I2C_sleep_compass0: |
631 movlw b'00000000' ; INT_CTRL_REG_M 0x63 | 707 movlw b'00000000' ; INT_CTRL_REG_M 0x63 |
632 rcall I2C_TX | 708 rcall I2C_TX |
633 bsf SSP1CON2,PEN ; stop condition | 709 bsf SSP1CON2,PEN ; stop condition |
634 bra WaitMSSP ; ... and return | 710 bra WaitMSSP ; ... and return |
635 | 711 |
712 I2C_sleep_compass3: | |
713 ; magnetic | |
714 bsf SSP1CON2,SEN ; Start condition | |
715 rcall WaitMSSP | |
716 movlw 0x3C ; address | |
717 rcall I2C_TX | |
718 movlw 0xA2 ; 0x22 with auto-increment (MSB=1) | |
719 movlw b'01000010' ; CTRL_REG3_M (Power-down) 0x22 | |
720 rcall I2C_TX | |
721 bsf SSP1CON2,PEN ; Stop condition | |
722 bra WaitMSSP ;(And return) | |
723 | |
636 I2C_sleep_accelerometer2: | 724 I2C_sleep_accelerometer2: |
637 ; accelerometer | 725 ; accelerometer |
638 bsf SSP1CON2,SEN ; start condition | 726 bsf SSP1CON2,SEN ; start condition |
639 rcall WaitMSSP | 727 rcall WaitMSSP |
640 movlw 0x32 ; address | 728 movlw 0x32 ; address |
645 rcall I2C_TX | 733 rcall I2C_TX |
646 movlw b'00000000' ; CTRL_REG1_A 0x20 (all off) | 734 movlw b'00000000' ; CTRL_REG1_A 0x20 (all off) |
647 rcall I2C_TX | 735 rcall I2C_TX |
648 bsf SSP1CON2,PEN ; stop condition | 736 bsf SSP1CON2,PEN ; stop condition |
649 bra WaitMSSP ; ... and return | 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 | |
746 rcall I2C_TX | |
747 movlw b'00000000' ; CTRL_REG1_A (100Hz, x,y,z = ON) 0x20 | |
748 rcall I2C_TX | |
749 bsf SSP1CON2,PEN ; Stop condition | |
750 bra WaitMSSP ; (And return) | |
650 | 751 |
651 | 752 |
652 WaitMSSP: | 753 WaitMSSP: |
653 decfsz i2c_temp1,F ; check for timeout during I2C action | 754 decfsz i2c_temp1,F ; check for timeout during I2C action |
654 bra WaitMSSP2 | 755 bra WaitMSSP2 |
710 return | 811 return |
711 | 812 |
712 | 813 |
713 global I2C_init_accelerometer | 814 global I2C_init_accelerometer |
714 I2C_init_accelerometer: | 815 I2C_init_accelerometer: |
816 btfsc compass_type3 ; compass3? | |
817 bra I2C_init_accelerometer3 ; YES | |
818 | |
715 btfsc compass_type2 ; compass2 ? | 819 btfsc compass_type2 ; compass2 ? |
716 bra I2C_init_accelerometer2 ; YES | 820 bra I2C_init_accelerometer2 ; YES |
717 | 821 |
718 btfsc compass_type ; compass1 ? | 822 btfsc compass_type ; compass1 ? |
719 return ; YES - ignore | 823 return ; YES - ignore |
777 ; movlw b'00000000' ; CTRL_REG5_A | 881 ; movlw b'00000000' ; CTRL_REG5_A |
778 ; rcall I2C_TX | 882 ; rcall I2C_TX |
779 bsf SSP1CON2,PEN ; stop condition | 883 bsf SSP1CON2,PEN ; stop condition |
780 bra WaitMSSP ; ... and return | 884 bra WaitMSSP ; ... and return |
781 | 885 |
886 I2C_init_accelerometer3: | |
887 bsf SSP1CON2,SEN ; Start condition | |
888 rcall WaitMSSP | |
889 movlw 0x3A ; address | |
890 rcall I2C_TX | |
891 movlw 0x20 | |
892 rcall I2C_TX | |
893 movlw b'00110111' ; CTRL_REG1_A (100Hz, x,y,z = ON) 0x20 | |
894 rcall I2C_TX | |
895 movlw b'00000000' ; CTRL_REG2_A 0x21 | |
896 rcall I2C_TX | |
897 movlw b'00000000' ; CTRL_REG3_A 0x22 | |
898 rcall I2C_TX | |
899 bsf SSP1CON2,PEN ; Stop condition | |
900 bra WaitMSSP ; (And return) | |
901 | |
782 | 902 |
783 global I2C_sleep_accelerometer | 903 global I2C_sleep_accelerometer |
784 I2C_sleep_accelerometer: | 904 I2C_sleep_accelerometer: |
905 btfsc compass_type3 ; Compass3 | |
906 bra I2C_sleep_accelerometer3 ; YES | |
785 btfsc compass_type2 ; Compass2 | 907 btfsc compass_type2 ; Compass2 |
786 bra I2C_sleep_accelerometer2 ; YES | 908 bra I2C_sleep_accelerometer2 ; YES |
787 btfsc compass_type ; compass1? | 909 btfsc compass_type ; compass1? |
788 return ; YES - ignore | 910 return ; YES - ignore |
789 | 911 |