📄 davinci_evm.lst
字号:
567 }
\ 000012 3E41 POP.W R14
\ 000014 0013 RETI
568
569
570 //
571 // Watchdog Timer (WDT) Interrupt Service Routine
572 //
573 // Interrupts once every 250 msec
574 //
575 #pragma vector=WDT_VECTOR
\ In segment CODE, align 2
576 __interrupt void wdt_ISR(void)
\ wdt_ISR:
577 {
\ 000000 0F12 PUSH.W R15
\ 000002 0E12 PUSH.W R14
578 static unsigned char cnt;
579
580 if( (cnt++ & 0x3) == 0 )
\ 000004 5E42.... MOV.B &??cnt, R14
\ 000008 4F4E MOV.B R14, R15
\ 00000A 5F53 ADD.B #0x1, R15
\ 00000C C24F.... MOV.B R15, &??cnt
\ 000010 7EB00300 BIT.B #0x3, R14
\ 000014 0220 JNE ??wdt_ISR_0
581 {
582 Event |= EVENT_RTC; // Set RTC event flag
\ 000016 F2D2.... BIS.B #0x8, &Event
583 }
584
585 Event |= EVENT_CHK_PINS; // Set check pins event
\ ??wdt_ISR_0:
\ 00001A E2D2.... BIS.B #0x4, &Event
586
587 LPM0_EXIT; // Exit LPM0
\ 00001E B1C010000400 BIC.W #0x10, 0x4(SP)
588 }
\ 000024 3E41 POP.W R14
\ 000026 3F41 POP.W R15
\ 000028 0013 RETI
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
\ ??cnt:
\ 000000 DS8 1
589
590
591 //
592 // Timer_A0 Interrupt Service Routine
593 //
594 #pragma vector=TIMERA0_VECTOR
\ In segment CODE, align 2
595 __interrupt void timerA0_ISR(void)
\ timerA0_ISR:
596 {
597 LPM0_EXIT; // Exit LPM0
\ 000000 B1C010000000 BIC.W #0x10, 0x0(SP)
598 }
\ 000006 0013 RETI
599
600
601 //
602 // Timer_A Interrupt Vector (TAIV) Handler
603 //
604 #pragma vector=TIMERA1_VECTOR
\ In segment CODE, align 2
605 __interrupt void timerA_ISR(void)
\ timerA_ISR:
606 {
\ 000000 0F12 PUSH.W R15
\ 000002 0E12 PUSH.W R14
607 switch( TAIV )
\ 000004 1F422E01 MOV.W &0x12e, R15
\ 000008 2F83 SUB.W #0x2, R15
\ 00000A 0324 JEQ ??timerA_ISR_0
\ 00000C 2F83 SUB.W #0x2, R15
\ 00000E 4E24 JEQ ??timerA_ISR_1
\ 000010 563C JMP ??timerA_ISR_2
608 {
609 case 2: // TA1 CCIFG
610 if( TACCTL1 & CAP ) // Is TA1 in capture mode?
\ ??timerA_ISR_0:
\ 000012 B2B000016401 BIT.W #0x100, &0x164
\ 000018 1528 JNC ??timerA_ISR_3
611 { // Yes, capture mode
612 TACCTL2 = 0; // Disable TA2
\ 00001A 82436601 MOV.W #0x0, &0x166
613 if( IRBit == 14 )
\ 00001E F2900E00.... CMP.B #0xe, &IRBit
\ 000024 0820 JNE ??timerA_ISR_4
614 {
615 SDA_IE &= ~SDA_PIN; // Disable SDA interrupt
\ 000026 D2C32D00 BIC.B #0x1, &0x2d
616 SCL_IE &= ~SCL_PIN; // Disable SCL interrupt
\ 00002A D2C32500 BIC.B #0x1, &0x25
617 IE2 = 0; // Disable interrupts
\ 00002E C2430100 MOV.B #0x0, &0x1
618 IE1 = 0; // Disable interrupts
\ 000032 C2430000 MOV.B #0x0, &0x0
619 }
620
621 // Configure TA1 to measure 3/4 IR bit time
622 TACCR1 += BIT_75; // Add 3/4 IR bit time
\ ??timerA_ISR_4:
\ 000036 B2502A007401 ADD.W #0x2a, &0x174
623 TACCTL1 = CCIE; // Compare mode, enable interrupt
\ 00003C B24010006401 MOV.W #0x10, &0x164
\ 000042 3D3C JMP ??timerA_ISR_2
624 }
625 else // No, compare mode
626 {
627 if( --IRBit == 0 ) // Dec IR bit cnt, is 0?
\ ??timerA_ISR_3:
\ 000044 5E42.... MOV.B &IRBit, R14
\ 000048 7E53 ADD.B #0xff, R14
\ 00004A C24E.... MOV.B R14, &IRBit
\ 00004E 4E93 CMP.B #0x0, R14
\ 000050 1720 JNE ??timerA_ISR_5
628 { // Yes, IR bit cnt = 0
629 TACCTL1 = 0; // Stop TA1
\ 000052 82436401 MOV.W #0x0, &0x164
630 TACCTL2 = 0; // Stop TA2
\ 000056 82436601 MOV.W #0x0, &0x166
631 IRBuff[irWriteIndex++] = IRData; // Save IR data
\ 00005A 5F42.... MOV.B &irWriteIndex, R15
\ 00005E 3FF0FF00 AND.W #0xff, R15
\ 000062 0F5F RLA.W R15
\ 000064 9F42........ MOV.W &IRData, IRBuff(R15)
\ 00006A D253.... ADD.B #0x1, &irWriteIndex
632 irWriteIndex &= (IRBUFFLEN-1); // Reset index
\ 00006E F2F01F00.... AND.B #0x1f, &irWriteIndex
633 Event |= EVENT_IR; // Set IR event flag
\ 000074 E2D3.... BIS.B #0x2, &Event
634 LPM0_EXIT; // Exit LPM0
\ 000078 B1C010000400 BIC.W #0x10, 0x4(SP)
\ 00007E 1F3C JMP ??timerA_ISR_2
635 }
636 else // No, IR bit cnt > 0
637 {
638 IRData <<= 1; // Left shift IRData
\ ??timerA_ISR_5:
\ 000080 9252........ RLA.W &IRData
639
640 if( TACCTL1 & SCCI ) // Is SCCI bit set?
\ 000086 B2B000046401 BIT.W #0x400, &0x164
\ 00008C 0228 JNC ??timerA_ISR_6
641 { // Yes, SCCI is set
642 IRData |= 1; // Set LSB to 1
\ 00008E 92D3.... BIS.W #0x1, &IRData
643 }
644
645 // Set TA2 to generate a timeout if next IR packet edge
646 // is NOT captured within 1/2 I/R bit time
647 TACCR2 = TACCR1 + BIT_50; // Add 1/2 IR bit time to TACCR1,
\ ??timerA_ISR_6:
\ 000092 1F427401 MOV.W &0x174, R15
\ 000096 3F501D00 ADD.W #0x1d, R15
\ 00009A 824F7601 MOV.W R15, &0x176
648 // load into TACCR2
649 TACCTL2 = CCIE; // Compare mode, enable interrupt
\ 00009E B24010006601 MOV.W #0x10, &0x166
650
651 // Configure TA1 to capture IR data packet edge
652 TACCTL1 = CAP + CM1 + CM0 + SCS + CCIE;
\ 0000A4 B24010C96401 MOV.W #0xc910, &0x164
\ 0000AA 093C JMP ??timerA_ISR_2
653 // Capture mode, CCI1A input,
654 // both edges, synchronous,
655 // enable interrupt
656 }
657 }
658 break;
659
660 case 4: // TA2 CCIFG
661 TACCTL1 = 0; // Timeout, stop TA1
\ ??timerA_ISR_1:
\ 0000AC 82436401 MOV.W #0x0, &0x164
662 TACCTL2 = 0; // Timeout, stop TA2
\ 0000B0 82436601 MOV.W #0x0, &0x166
663 Event |= EVENT_TIMEOUT; // Set timeout event flag
\ 0000B4 D2D3.... BIS.B #0x1, &Event
664 // MW P3OUT ^= 0x08; // DEBUG
665 LPM0_EXIT; // Exit LPM0
\ 0000B8 B1C010000400 BIC.W #0x10, 0x4(SP)
666 break;
667
668 case 10: // TA IFG
669 break;
670 }
671 }
\ ??timerA_ISR_2:
\ 0000BE 3E41 POP.W R14
\ 0000C0 3F41 POP.W R15
\ 0000C2 0013 RETI
672
673
674
675 //
676 // Read message from I2C Master
677 //
678 // I2C Message Format:
679 // Required Byte 1 = Msg Length (includes length and msg ID bytes)
680 // Required Byte 2 = Msg Identifier
681 // Optional Byte 3 = Data byte 0
682 // .
683 // .
684 // .
685 // Optional Byte N = Data byte N-1
686 //
687 // I2C message length = number of data bytes + 2
688 //
689 // +--------+--------+--------+-----+----------+
690 // | Length | Msg Id | Data 0 | ... | Data N-1 |
691 // +--------+--------+--------+-----+----------+
692 //
\ In segment CODE, align 2
693 void i2cReadMsg(unsigned char i2cData)
\ i2cReadMsg:
694 {
\ 000000 0A12 PUSH.W R10
\ 000002 4A4C MOV.B R12, R10
695 static unsigned char i2cLen;
696
697 I2CRxBuff[i2cIndex++] = i2cData; // Save I2C data
\ 000004 5F42.... MOV.B &i2cIndex, R15
\ 000008 3FF0FF00 AND.W #0xff, R15
\ 00000C CF4A.... MOV.B R10, I2CRxBuff(R15)
\ 000010 D253.... ADD.B #0x1, &i2cIndex
698
699 if( i2cIndex == 1 )
\ 000014 D293.... CMP.B #0x1, &i2cIndex
\ 000018 0320 JNE ??i2cReadMsg_0
700 {
701 i2cLen = i2cData; // First byte contains msg length
\ 00001A C24A.... MOV.B R10, &??i2cLen
\ 00001E 0C3C JMP ??i2cReadMsg_1
702 }
703 else if( i2cLen == i2cIndex ) // Msg length includes Length and
\ ??i2cReadMsg_0:
\ 000020 D292........ CMP.B &i2cIndex, &??i2cLen
\ 000026 0820 JNE ??i2cReadMsg_1
704 { // Msg Id bytes along with data
705 // Process I2C message
706 (i2cMsgTbl[I2CRxBuff[1]])();
\ 000028 5F42.... MOV.B &I2CRxBuff + 1, R15
\ 00002C 3FF0FF00 AND.W #0xff, R15
\ 000030 0F5F RLA.W R15
\ 000032 9F12.... CALL i2cMsgTbl(R15)
707
708 return;
\ 000036 033C JMP ??i2cReadMsg_2
709 }
710
711 i2cIndex &= (I2CMSGLEN-1); // Prevent buffer overflow
\ ??i2cReadMsg_1:
\ 000038 F2F01F00.... AND.B #0x1f, &i2cIndex
712 }
\ ??i2cReadMsg_2:
\ 00003E 3A41 POP.W R10
\ 000040 3041 RET
\ In segment DATA16_Z, align 1, align-sorted
\ 000000 REQUIRE ?cstart_init_zero
\ ??i2cLen:
\ 000000 DS8 1
713
714
715 //
716 // Get Real-Time Clock (RTC) Parameters
717 //
\ In segment CODE, align 2
718 void getRTC(void)
\ getRTC:
719 {
720 I2CTxBuff[0] = 9; // Set length
\ 000000 F2400900.... MOV.B #0x9, &I2CTxBuff
721 I2CTxBuff[1] = GET_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -