Derleyicide RPM hesabı mantığı

Ezbere iş yapmışsın hiç mantık işletmemişsin.
 
Kod:
#use delay(clock=20000000)

int32 devir=0;
int32 sayac=0;
int32 rpm;


#int_ext
void ext_kesmesi()
{
 devir++;
}


#int_timer1
void timer1_kesmesi()
{
set_timer1(3035); //0.2us X 8 X 62500(65535-3035) = 0.1 sn 
sayac++;
}




void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   
   
   if(sayac==10) //10 tane timer1 kesmesi olunca 1 sn süre geçiyor.
   {
    rpm=devir*60; 
    devir=0; //1 sn geçince devir sıfırlanıyor.
    sayac=0; //1 sn geçince sayaç sıfırlanıyor.
    
   }
Peki hocam bu nasıl ?
 
#use delay(clock=20000000)

char pals=0,bitti=0;
unsigned int sure=0;
float rpm;




#int_ext
void ext_kesmesi()
{

if(pals==0) set_timer2(0); // ilk pals başlangıc


if(pals==10) {
sure=get_timer2(); // geçen zaman
disable_interrupts(INT_EXT); // okuma bitti kesmeye gerek kalmadı
bitti=1;



}

pals++; // her turda pals artırılır

}






void main()
{




setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
// setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1); // bu 1 sn civarında ayarlanacak

enable_interrupts(INT_EXT);

enable_interrupts(GLOBAL);





While(1)
{


if(bitti) //10 tur sayıldı
{

zaman=(float) sure/65536; // timer2 ye göre ayarlanacak

rpm=600.0/zaman;


printf ("%d",rpm);
pals=0;
bitti=0;
enable_interrupts(INT_EXT);
}
}

} // BU TARZ BİRŞEY OLMALI INCE AYAR LAZIM
 
Teşekkürler hocam yardımlarınız için. Yazdım programı sonunda :)


KontrolKalemi Mobile ile gönderildi.
 

Forum istatistikleri

Konular
127,956
Mesajlar
913,899
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Çevrimiçi üyeler

Geri
Üst