CCS C yardım!!

bilgi geldiğinde gelen veriyi kesme ile alabilirsiniz ve aldığınız veriyi bir değişkene atayabilirsiniz. döngü içerisinde iken de o değişkeni sürekli kontrol ettirerek istediğiniz işlemi yapabilirsiniz.

ben de step motorlu uzaktan kumandalı araba yapmıştım ve ileri geri sağ sol işlemlerini sorunsuz yapıyordu. rf ile yapmıştım tabi.

ama ben kesme ile kullanmamıştım. fazladan bir pic kullanmıştım daha kolay olmuştu. sürekli rf i kontrol etmek ve kaçırmamak gerekli çünkü.

siz kesme kullanırsanız ve dediğim gibi yaparsanız bence sorun olmayacaktır ve kolayca yapacaksınız...

kardeş benim yapmak istediğimde rf alıcı verici ile step motor kontrollü araba yapmak bu bahsettiğim sorunu yaşadım dediğin gibi daha birde rf yi kaçırma olayı fln var.Bu fazladan pic kullanma işini ne amaçlı ve nasıl yaptın? yaptığın projenin kodları ve devresi varsa bana yollayabilirmisin?bana çok yardımcı olur.

ben senin dediğinin bir benzerini 877 ile yaptım aşağıda resmi ve kodları var inşallah işini görür denedim çalışıyor oraya sadece fazladan bi kbhit() ekledim kadar


#include "C:\Documents and Settings\akif\Desktop\Yeni Klasör (3)\step.h"
int i=0,hiz=100;
char al;
const int duz[]={0x11,0x33,0x22,0x66,0x44,0xCC,0x88,0x99}; // Step motor yarım adım dönüş adımları
const int sag[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
const int sol[]={0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

// TODO: USER CODE!!
while(1){

while(kbhit())
{
al=getch();
}//kbhit

if(al=='w')
{
for(i=0;i<8;i++)
{
output_d(duz); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi
}
}//if
if(al=='a'){
for(i=0;i<8;i++)
{

output_d(sol); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi
}
}//if
if(al=='d'){
for(i=0;i<8;i++)
{

output_d(sag); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi
}
}//if
}//while(true)
}//main



teşekkürler kardeş uğraşın için.bunu 2 pic arasında deneyeyim umarım aynı sonucu verir.yalnız yazdığın programda for döngüsünün motoru 1 tur döndürmesi gerekir sürekliliği nasıl sağlıyor?süreklilik için sürekli w'ya basmak gerekmezmi?

birde bildiğim kadarıyla kbhit() klavyeden karakter alındığı taktirde 1 bilgisini veriyor.Fakat ben bilgiyi klavyeden değilde diğer picten alıcam o yüzden kbhit() orada kullanılır mıki? mesela for döngüsünden çıkmak için döngünün sonuna if(kbhit()) break; ifadesini koydum yinede çıkmamıştı döngüden. kbhit kullanamayız gibi geliyor iki pic iletişiminde.
 
Moderatör tarafında düzenlendi:
2 tane 16f628, 1 tane de 16f84 kullanmıştım.
16f628 lerden birisi verici, diğeri alıcı. verici sürekli veri gönderiyor. boşta kaldığı zaman @ karakterini gönderiyorum. butona basılı olduğu sürece de o butona atadığım karakteri gönderiyorum.
böylece alıcı vericide uyku v.s. problemi olmuyor. alıcıda alma işlemini kesme ile yaptırmıyorum. bir while döngüsü ile sürekli veriyi alıp kontrol ettiriyorum getch();
ile. gelen verinin durumuna göre A portunun iki-üç çıkışını 00, 01, 10, 11 gibi ayarlıyorum. mesela sağ için 11, sol için, 01 geri için 10 gibi. bu uçları da 16f84a nın a portuna bağlıyorum. bu uçları sürekli kontrol edip ona göre step motoru çalıştırıyor.

gayet te güzel ve sorunsuz çalıştır bende araba. :)
 
2 tane 16f628, 1 tane de 16f84 kullanmıştım.
16f628 lerden birisi verici, diğeri alıcı. verici sürekli veri gönderiyor. boşta kaldığı zaman @ karakterini gönderiyorum. butona basılı olduğu sürece de o butona atadığım karakteri gönderiyorum.
böylece alıcı vericide uyku v.s. problemi olmuyor. alıcıda alma işlemini kesme ile yaptırmıyorum. bir while döngüsü ile sürekli veriyi alıp kontrol ettiriyorum getch();
ile. gelen verinin durumuna göre A portunun iki-üç çıkışını 00, 01, 10, 11 gibi ayarlıyorum. mesela sağ için 11, sol için, 01 geri için 10 gibi. bu uçları da 16f84a nın a portuna bağlıyorum. bu uçları sürekli kontrol edip ona göre step motoru çalıştırıyor.

gayet te güzel ve sorunsuz çalıştır bende araba. :)
peki kardeş butona bastığında düz gitme işlemini yapıyorken diğer butona bastığında diğer işlemi nasıl yaptırıyosun?benim sorunum orada.yani mesela 10 bilgisini aldığında düz gitsin diyorum.sonra geri gitmesi için diğer butona bastığımda işlemiyor düz gitme işleminde takılıyor.ilk başta verdiğim programda o sorun var bu konuda yardımcı olursan sevinirim. for döngüsü içinde getch komutunun atandığı değişken değeri değişmiyor asıl sorun bu işte.

kardeş buraya yazdığım program ve devreyi ekledim bi bakar mısın?yani çalıştırdığında sorunu daha iyi görürsün.

çözümü buldum arkadaşlar saolun ilginiz için.
 
Moderatör tarafında düzenlendi:
benim for döngüsünün mantğı sonsuz döngü değil zaten programı ilk başta while(1) ile sonsuz döngüye sokuyorsun.Oyüzden for işlemini bir kere gerçekleştirecek sonra al değişmediyse while(1) döngüsü zaten ordaki for döngüsünü tekrar işleme sokacaktır.ikincisi kbhit kullanılır senin çıkmamasının sebebi for döngüsünü sonsuz döngü yapman senin programın orada takılıp kalıyor senin o if(kbhit()) komutların fln hiç işleme bile girmez senin kodlarında yazdığın şekildeyse.Benim yazdığım kodlarda al değişkeni her defasında değişmeyecek sadece veri geldiğinde değişecektir o yüzden basılı tutmana da gerek yok
ayrıca çözümü buldum demişsin nasıl bulduğunu yazarsan biz de belki bi şeyler öğreniriz.
 
saol verdiğin bilgiler için.Benim çözümüm şöyle oldu:
for döngüsü içinde döngüden çıkamadığı için haliyle getch() komutuyla yeni gelen bilgileri almıyordu.Döngü içine veriyi alabilmesi için getch() komutunu koydum fakat bu haliylede döngü 1kere çalışıp getch() komutuna geldiğinde bilgi istediği için program duruyordu.Bunu önlemek için verici devreden herhangi bir butona basılmadığı takdirde sürekli bilgi gönderdim uyanık kalması için.program şu hale geldi:
VERİCİ:
basla:
if(!input(pin_b0)||!input(pin_b0)||!input(pin_b0)||!input(pin_b0))
putc('X');
if(input(pin_b0))
{ delay_ms(100);
ver='B';

goto gonder;
}

if(input(pin_b1))
{delay_ms(100);
ver='A';

goto gonder;
}

if(input(pin_b2))
{delay_ms(100);
ver='C';

goto gonder;
}

if(input(pin_b3))
{delay_ms(100);
ver='D';

goto gonder;
}

goto basla;


gonder:
putc(ver); //alıcıya ver değişkeni içindeki bilgi gönderiliyor
goto basla;
}

ALICI:
int al,i=0,hiz=100;
const int duz[]={0x11,0x33,0x22,0x66,0x44,0xCC,0x88,0x99}; // Step motor yarım adım dönüş adımları
const int sag[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
const int sol[]={0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

// TODO: USER CODE!!
output_b(0x00);

while(1){

al=getch(); //vericiden gönderilen bilgi alınıyor

if (al=='B') //eğer alınan bilgi 10 ise
{
for(i=0;i<8;i++)
{

output_b(sag); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi

if (i==7) i=-1; // i değişkeni 7 olunca i değeri -1 olsun

al=getch();
if(al=='A'||al=='C'||al=='D') break;

}

}

if (al=='A')
{
for(i=0;i<8;i++)
{

output_b(sol); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi

if (i==7) i=-1; // i değişkeni 7 olunca i değeri -1 olsun
al=getch();
if(al=='B'||al=='C'||al=='D') break;
}
}

if (al=='C')
{
for(i=0;i<8;i++)
{

output_b(duz); // Step motor 1 adım ileri
delay_ms(hiz); // Adımlar arası bekleme süresi

if (i==7) i=-1; // i değişkeni 7 olunca i değeri -1 olsun
al=getch();
if(al=='A'||al=='B'||al=='D') break;
}
}
if(al=='D')
{

for(i=7;i>=-1;i--)
{
if (i==-1) i=7; // i değişkeni -1 ise i değeri 7 olsun

output_b(duz); // Step motora 1 adım geri
delay_ms(hiz); // Adımlar arası bekleme süresi

al=getch();
if(al=='A'||al=='C'||al=='B') break;
}
}
}

}

başka çözümü olan arkadaşlar yazarlarsa daha güzel olur.
 

Forum istatistikleri

Konular
128,197
Mesajlar
915,761
Kullanıcılar
449,977
Son üye
keskiyan

Yeni konular

Geri
Üst