takometre yapımı yardım !!!

Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
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
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
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
 

silvestir

Profesyonel Üye
Katılım
10 Ağu 2011
Mesajlar
2,769
Puanları
656
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.
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
hocam aynı program içinde yazmam gerekiyo nasıl olacak gösterebilir misiniz?
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
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?
 

serkank

Üye
Katılım
1 Eki 2008
Mesajlar
151
Puanları
1
Yaş
38
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.
 
Konu Sah
sönmez1703
Katılım
2 Şub 2012
Mesajlar
19
Puanları
1
Yaş
34
abi ccs c bilgim pek ii değil , takometre çıkışı 16. bacak olacak öyle olacakmış
 

Forum istatistikleri

Konular
122,203
Mesajlar
861,909
Kullanıcılar
438,703
Son üye
deneyimligenco

Yeni konular

Üst