#include "io430.h"
#include "in430.h"
unsigned int analog_register ;
void delay(void)
{
unsigned int p;
for(p=5000;p>0;p--);
}
Void clock_configure(void)
{
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
}
void analog(void)
{
ADC10CTL0 &= ~ENC;
ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE;
ADC10CTL1 = INCH_2 + ADC10SSEL_3 + ADC10DIV_3; // analog giris BIT2 yapildi
ADC10AE0 = BIT2;
}
Void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
clock_configure();
delay();
P1SEL = 0x01; // P1.0 PWM CIKISI ICIN
P1DIR = 0x01;
analog();
TA0CTL = TASSEL_2 + ID_2 + MC_0; // UP MODE durduldu(stop mod) DIVIDER /2(bolucu 2ye bolucek) SMCLOCK
TA0CCR0 = 1667-1; // 200 HZ
TA0CCR1 = 166 ; // %10 PWM DUTY OLSUN
TA0CCTL1 = OUTMOD_7 ; // SET RESET gir outmod_7 de
TA0CTL |= MC_1 ; // UP MODE acildi
while(1)
{
ADC10CTL0 |= ENC + ADC10SC; // adc cevrimi baslat
__EINT();
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
analog_register =(float)((ADC10MEM<<6)*4.788); // 5 VOLT ICIN
TA0CCR1 = analog_register ;
if(TA0CCR1 > 1333)
{ doluluk orani %80 dan fazla oldunda % 10na geri gelsin
TA0CCR0 = 166;
_NOP();
}
_NOP();
_NOP(); islem yapma;
}
aslinda yapmak istedim su timer a 16 bit oldugu icin adc10 modulu de 10 bit oldu icin 5 v bir gerilim ile adc ile pwm uretmek bunun icinde ADC10MEM register 6 bit oteleme yaptim 65536 sayisina cekip verilen degerle TA0CCR1 degerinin icine yazdirip pwm gormek nasil olduysa osilaskopla bir turlu goremedim sizce problem ne olabilir normal buttonla deneme yaptim kod calisti bu calismadi konuyla ilgilenen arkadaslar olursa sevinirim su msp guzel uygulamalar yapmak istiyorum
Alıntı yapılan: Trance55 - 05 Kasım 2012, 23:39:34
...
TA0CTL = TASSEL_2 + ID_2 + MC_0; // UP MODE durduldu(stop mod) DIVIDER /2(bolucu 2ye bolucek) SMCLOCK
TA0CCR0 = 1667-1; // 200 HZ
TA0CCR1 = 166 ; // %10 PWM DUTY OLSUN
TA0CCTL1 = OUTMOD_7 ; // SET RESET gir outmod_7 de
TA0CTL |= MC_1 ; // UP MODE acildi
while(1)
{
ADC10CTL0 |= ENC + ADC10SC; // adc cevrimi baslat
__EINT();
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
analog_register =(float)((ADC10MEM<<6)*4.788); // 5 VOLT ICIN
TA0CCR1 = analog_register ;
if(TA0CCR1 > 1333)
{ doluluk orani %80 dan fazla oldunda % 10na geri gelsin
TA0CCR0 = 166;
_NOP();
}
_NOP();
_NOP(); islem yapma;
}
aslinda yapmak istedim su timer a 16 bit oldugu icin adc10 modulu de 10 bit oldu icin 5 v bir gerilim ile adc ile pwm uretmek bunun icinde ADC10MEM register 6 bit oteleme yaptim 65536 sayisina cekip verilen degerle TA0CCR1 degerinin icine yazdirip pwm gormek nasil olduysa osilaskopla bir turlu goremedim sizce problem ne olabilir normal buttonla deneme yaptim kod calisti bu calismadi konuyla ilgilenen arkadaslar olursa sevinirim su msp guzel uygulamalar yapmak istiyorum
Merhaba,
Datasheet e tekrar bakmadım ama hatırladığım kadarı ile kırmızı kısımda Duty yerine periyodu değiştirmişsiniz. Ayrıca aşağıdaki şekilde kullansanız daha iyi olabilir.
...
if(analog_register > 1333)
{ doluluk orani %80 dan fazla oldunda % 10na geri gelsin
TA0CCR1 = 166;
_NOP();
}
else
TA0CCR1 = analog_register ;
Birde bu şekilde deneyin. İyi çalışmalar.
if and ile aklima bir sey geldi aslinda program yapisi daha uzun olucak ama if (analog_reg > 500 & analog_reg<700) gibi else if yapsam daha olmazmi sizce ornegin artis orani % 5 % 7 bazi periyotlar oyle olsa daha iyi diyimi sizce ? sizin yazdinizda mantikli aslinda algoritmik olarak onuda deniyecem bu aksam sagolasiniz tessekur ederim