Merhaba
PWM sinyali üretip 50 ms sonra sinyali kesmek istiyorum. 2 adet timer kullanarak bunu yapmayı denedim. Ancak durdurmayı başaramadım. Yardımcı olursanız çok sevinirim.
#include <msp430.h>
void PWMgonder(void);
void PWMdur(void);
unsigned char sayac=0;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ; // Hesaplama kolaylığı için clock 1 Mhz' ye ayarlandı
CCTL0 = CCIE; // Timer kesmesi aktif hale getirildi
P2DIR |= BIT2;
P2SEL |= BIT2;// Pwm sinyalinin iletileceği pin seçildi
P2OUT=0x00;
while(1){
if((P1IN & BIT4)!=BIT4) //butona basıldı
{
PWMgonder(); // pwm üret
PWMdur(); // 50 ms sonra dur
}
}
}
void PWMgonder(void) // pwm sinyal üretimi
{
TA1CCR0 = 26-1; // Periyot
TA1CCR1 = 13; // %50 duty cycle
TA1CCTL1 |= OUTMOD_6; // 13 değerine ulaşınca 1'den 0'a geçiş
TA1CTL = TASSEL_1 + MC_1 + TACLR; // timer ayarı
}
void PWMdur(void) // 50 ms sonra pwm'yi durdurmaya çalıştığım kod
{
CCR0 = 5000; // CCR0 5 ms
TACTL = TASSEL_2 + MC_2; //5000'e sayıp kesme üreten timer ayarı
}
#pragma vector=TIMER0_A0_VECTOR // timer kesmesi
__interrupt void Timer_A (void)
{
if(++sayac==10){ // sayaç 10 oldu (10*5 50 msn )
TA1CCR1 = 0; ; // Timer'ı durdur
sayac = 0;
}
}
(https://i.ibb.co/KFvfZMQ/Arduino-IR-Remote-Receiver-Tutorial-NEC-Protocol.png) (https://ibb.co/KFvfZMQ)
Bu şekilde bir sinyal üretmek istiyorum.
PWM duty registerine istedigin duty ile orantili sayiyi yukluyorsun ya, iste bu registere
50 ms sonra 0 yukle.
Gerci sen de aynini yapmissin.
Timer_A int rutinine giriyor mu? Debug ettin mi?
Alıntı yapılan: z - 30 Nisan 2019, 13:22:03PWM duty registerine istedigin duty ile orantili sayiyi yukluyorsun ya, iste bu registere
50 ms sonra 0 yukle.
Gerci sen de aynini yapmissin.
Timer_A int rutinine giriyor mu? Debug ettin mi?
Hayır girmiyor Ama yinede ne yazmam gerektiğini anlamadım.
#define TIMER0_A1_VECTOR (8u * 2u) /* 0xFFF0 Timer0)A CC1, TA0 */
#define TIMER0_A0_VECTOR (9u * 2u) /* 0xFFF2 Timer0_A CC0 */
https://www.mcufreak.com/msp430-nedir-msp430-baslangic-rehberi/msp430g2553-pinout/
Timer Interrupt'a izin veren bir register olmali. Islemcinin tanimiyorum register adini dokumanlarindan bulabilirsin. Genelde registerdeki bir biti 1 yaparak int enb islemi yapilir.