takometre yapımı yardım !!!

Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
35
ii günler arkadaşlar bitirme ödevim konusunda yardıma ihtiyacım var.konuyu kısaca anlatayım. pic 16f877 i kullanıyom ccs c ile program yazıyom.pic den pwm üretiyoruz darbe genişliklerini 2 tane butonla artırıp azaltıyorum .pwm çıkışına bi dc motor bağlıyom hızını değiştiriyom buraya kadar tamam. bundan sonra aynı picde kesmeleri kullanak takometre yapcam CNY70 i kullanacam.yardım eden olursa kodları hemen paylaşayım
 
ii günler arkadaşlar bitirme ödevim konusunda yardıma ihtiyacım var.konuyu kısaca anlatayım. pic 16f877 i kullanıyom ccs c ile program yazıyom.pic den pwm üretiyoruz darbe genişliklerini 2 tane butonla artırıp azaltıyorum .pwm çıkışına bi dc motor bağlıyom hızını değiştiriyom buraya kadar tamam. bundan sonra aynı picde kesmeleri kullanak takometre yapcam CNY70 i kullanacam.
dc motorun hızını bu şekilde kontrol ediyom
#include <16f877.h>


#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)

#use fast_io(c)
#use fast_io(e)

#define use_portb_lcd TRUE
#include <lcd.c>

int i=2;

int32 j=65;
int32 k;
float f,s;




void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);


set_tris_a(0x0f);

set_tris_c(0x00);
set_tris_e(0x0f);

setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

setup_timer_2(T2_DIV_BY_16,j,1);

set_pwm1_duty(i);
set_pwm2_duty(i);
lcd_init();
printf(lcd_putc,"\ffreq=");
printf(lcd_putc,"\nduty=");

while(1)
{
j=j+1;
k=4*j*16;

f=4000000/k;
lcd_gotoxy(6,1);
printf(lcd_putc,"%f",f);
j=j-1;
s=i*1.562;
lcd_gotoxy(6,2);
printf(lcd_putc,"%f",s);
if(input(pin_a0))
{
delay_ms(20);
while(input(pin_a0));
i+=2;

if(i>64)
i=64;

set_pwm1_duty(i);

}
if(input(pin_a1))
{
delay_ms(20);
while(input(pin_a1));
i-=2;

if(i<2)
i=2;

set_pwm1_duty(i);
set_pwm2_duty(i);
}


if(input(pin_a2))
{
i=10;
set_pwm1_duty(i);
delay_ms(20);
while(input(pin_a2));
j+=5;


if(j>250)
j=250;
setup_timer_2(T2_DIV_BY_16,j,1);
}

if(input(pin_a3))
{
i=10;
set_pwm1_duty(i);
delay_ms(20);
while(input(pin_a3));
j-=5;

if(j<65)
j=65;
setup_timer_2(T2_DIV_BY_16,j,1);
}


}

}

takometre programı ise
#include <16f877.h>


#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(e)

unsigned int32 i=0;
int s=0;
float y,j=0;

#define use_portb_lcd TRUE

#include <lcd.c>

#int_timer1
void timer1_kesme()
{
s++;
if (s>3)
{
s=4;
lcd_gotoxy(6,1);
printf(lcd_putc,"XXXXXX");
}
}


#int_CCP1
void yakala_kesmesi()
{


i=get_timer1();
set_timer1(0);
i=i+65535*s;
s=0;
j=i*0.000008/4;
j=60/j;
lcd_gotoxy(6,1);

printf(lcd_putc,"%f",j);



}





void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_INTERNAL |T1_DIV_BY_8);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
enable_interrupts(INT_CCP1);
enable_interrupts(int_timer1);
enable_interrupts(GLOBAL);
lcd_init();


setup_ccp1(CCP_CAPTURE_DIV_4);

CCP_1_HIGH=0x00;
CCP_2_LOW=0x00;





set_tris_b(0x00);
set_tris_c(0x07);

output_b(0x00);

printf(lcd_putc,"\fSPIN RPM");

while(1);




}

bu programlar çalışıyo ama takometre programını yukardaki programda kesmeleri kullanarak içinde yazmam gerekiyo,yardıma ihtiyacım var
 
Kesmelerin içinde printf filan olmaz arkadaşım. Kesmede amaç işi hemen bitirip çıkmak olmalı. Mesela yaz=1 yapip çıkarsın. Sonra main içinde if(yaz==1) { yaz =0; printf ("Değer budur");} filan yaparsın.
 
hocam aynı program içinde yazmam gerekiyo nasıl olacak gösterebilir misiniz?
 
Kesmelerin içinde printf filan olmaz arkadaşım. Kesmede amaç işi hemen bitirip çıkmak olmalı. Mesela yaz=1 yapip çıkarsın. Sonra main içinde if(yaz==1) { yaz =0; printf ("Değer budur");} filan yaparsın.
hocam aynı program içinde yazmam gerekiyo nasıl olacak gösterebilir misiniz?
 
eger sen CCS C dilini iyi biliyorsan yapman gereken su
LCD yi Port D ile kullan . PortB nin 0 nolu RB0/ınt bacagını Takometre girişi için kullan
RC2 CCP1 bacagı PWM bacagı olsun
Buttonlar icin herhangi 2 bacak kullanabilirsin..
Kesme Timer ve RB0/Int kesmelerini kullanman lazım Clock frekansı 4 yerine 20 kullan. daha sorunsuz calışması icin

Ana Program icinden Buttonları oku. ve PWM hızını ayarla
LCD ye yazma isini Button basıldıysa ve PWM degistiyse yazdır..
RB0/INT kesmesinde RPM degiskenini 1 arttır
Timer kesmesi icinde saniye sayacını arttır 60 saniye olmussa
RPM mi LCD ye yazdır ve RPM sil (silvester'ın dedigi gibi kesme isinde uzun zaman alıcak islemler yapılmaz bunu kesme dısına alman lazım. ayrı bir degisken kullanarak. ama ilk asamada boyle dene ISIS te olursa 2 asamada yazdırmayı kesme dısına al. )
Saniye sayacını sil

CCS bilgin iyi ise bu adımları uygula.
 
abi ccs c bilgim pek ii değil , takometre çıkışı 16. bacak olacak öyle olacakmış
 

Yeni mesajlar

Forum istatistikleri

Konular
127,964
Mesajlar
913,942
Kullanıcılar
449,611
Son üye
ramazansanli@

Yeni konular

Geri
Üst