[C14] HỎI VỀ NGẮT TIMER CHO CHÂN PWM

#include <msp430.h>
int x = 100;
void main(void) {



WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
// Port_init();

P2DIR |= (BIT1+BIT2);
P2OUT |= (BIT1+BIT2);
P2SEL |= (BIT1+BIT2);

TA1CTL = TASSEL_2 + MC_1 + TAIE; // SMCLK(1Mhz) // up mode //
TA1CCR0 =3000; //
TA1CCR1 = x; //modul timer
TA1CCTL1 =CCIE ;
TA1CCTL1 = OUTMOD_3; // ch?nh mode cho PWM

_BIS_SR(GIE); //
while(1)
{
;
}
}

#pragma vector=TIMER1_A1_VECTOR
__interrupt void INTERRUPT_ISR(void)
{
switch(TA1IV)
{
case 0x0A:
{
x += 100;
if(x == 3100)
{x = 0;}
break;
}
}
}
 
em muốn điều chỉnh 2 cái led đó sáng max rồi tự động yếu dần rồi quay lại nhưng mà k biết sai chỗ nào anh chị nào giúp em với :-(
 

Fujiko

Thành Viên PIF
Bạn để ý xem biến x của bạn thay đổi, nhưng giá trị của thanh ghi TA1CCR1 có thay đổi không nhé???
 

black_knight

Trứng gà
Code:
#include <msp430.h>
 
int volatile k,n;
/*
* main.c
*/
void main()
{
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
 
    //init timer
    TA1CTL = TASSEL_2 + MC_1; //source SMCLK, UP mode
    TA1CCR0 = 1000;        // chu ky xung
    TA1CCR1 = 900;        //thoi gian len
    TA1CCTL1 = CCIE + OUTMOD_2;    //enable interrupt request from CCIFG1 flag, OUT mode 2
 
    //init port 2 as output pwm
    P2SEL |= BIT1;        //set p2.1 output pwm
    P2DIR |= BIT1;
    P2OUT &= ~BIT1;
 
    //init port 1.0 as control pwm
    P1DIR &= ~BIT0;    //p1.0 input
    P1REN |= BIT0;        //enable pull up registor
    P1IE |= BIT0;        //interrupt enable p1.0
    P1IES |= BIT0;        //interrupt request with high to low transmit
    P1IFG &= ~BIT0;    //clear IFG flag
    P1OUT |= BIT0;
 
    //init port 1.3 as signal when p1.0 interrupt happen
    P1DIR |= BIT3;        //p1.3 output
    P1OUT |= BIT3;
   
    _BIS_SR(GIE);
 
    k = n = 0;
    while(1)
    {
        if(k>n)
        {
            TA1CCR1 += 100;
            P1OUT ^= BIT3;
            n = k;
        }
    }
 
}
 
 
#pragma vector = PORT1_VECTOR
__interrupt void interrupt_port1(void)
{
    if((k<9)&(P1IFG&BIT0 == BIT0))
        {
            k++;
            P1IFG &= ~BIT0;
        }
}
Nếu bỏ cái tạo xung PWM thì ngắt port xảy ra, nhưng khi kết hợp 2 cái thì ngắt port không hoạt động.
 

black_knight

Trứng gà
PxSEL = 1 thì sẽ vô hiệu hóa ngắt Px tương ứng hay cả 2 ngắt P1 và P2 luôn?
 

black_knight

Trứng gà
Đã phát hiện lỗi sai. Ở dòng code TA1CCTL1 = CCIE + OUTMOD_2; xóa đi CCIE thì chạy được. Khi thêm CCIE thì ngắt sẽ xảy ra khi đếm đến TA1CCR1, nhưng tại sao ngắt port1 không xảy ra? Ai giải thích chỗ này với.
 
Top