CCS C yardım!!

myurdabak

Üye
Katılım
31 Ocak 2008
Mesajlar
499
Puanları
1
Arkadaşlar 2pic arasında seri iletişim kurmaya çalışıyorum.verici devredeki 1.butona bastığımda alıcı devrede for döngüsü işleme girecek.Yine verici devredeki diğer butona bastığımda alıcı devredeki pic başka bir programa atlicak yani başka bir döngüye atlayamıyorum.bu programı bi türlü yazamadım yardımcı olursanız çok sevinirim.
bu programa ne eklemeliyim? Yapmak istediğim devrenin şemasınıda gönderdim.Butonlara bastığımda step motor kontrolü sağlanacak.Fakat ilk çalıştırmamda herhangi bir butona basınca o buton görevini görüyor ama sonra başka butona basınca for döngüsünden çıkamadığı için devre kilitleniyor orada.For döngüsünden nasıl çıkabilirm yazdğım programın bi kıısmı aşağıda:

verici programım:
basla:

if(input(pin_b0))
{ ver=10;
while(input(pin_b0));
goto gonder;
}
if(input(pin_b1))
{
ver=22;
while(input(pin_b1));
goto gonder;
}
goto basla;

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


Alıcı PRORAMI
while(1){

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

if (al==10) //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

//mesela verici devrede diğer butona bastığımda bu döngüden çıkması lazım devrenin


}

}

if (al==22)
{
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

}
}
 
öncelikle meraba.ne kadar yardımı olur kodun tamamını görmeden söyleyemem ama sanırım oradaki
if (i==7) i=-1; // i değişkeni 7 olunca i değeri -1 olsun
satırını ordan çıkarmazsan sonsuz döngü derçekleşir çğünkü for döngüsü i=0 başlayarak birer artıyor daha sonra i=7 değerine ulaştığında sen tekrar işlemi başa alıyorsun bunu çıkarıp dene bence çalışırsa söyle ;)
 
arkadaşım anladığım kadarıyla sen sistem çalışırken de buton denetimi yapmak istiyorsun. onun için oradaki for döngülerinin içerisinede birer buton denetlemesi koyman gerekir. buna benzer bi program yazdım orada da butona bastıkça hangi butona basıdığı Lcd ekranda yazıyor dediğin olayda var sistem birinci butona basıldı yazarken diğer butona basıldığında ikinci butona basıdı yazıyor programı incelediğinde göreceksin.

void main()
{
lcd_init();
basla:
if(input(pin_a0))
{
ver=10;
while(input(pin_a0));
goto gonder;
}
if(input(pin_a1))
{
ver=22;
while(input(pin_a1));
goto gonder;
}
goto basla;
gonder:
if(ver==10)
{
for(;;)
{
printf(lcd_putc,"\f birinci buton");
delay_ms(30);
if(input(pin_a0))
{
ver=10;
while(input(pin_a0));
goto gonder;
}
if(input(pin_a1))
{
ver=22;
while(input(pin_a1));
goto gonder;
}
}
}
for(;;)
{
if(ver==22)
{
printf(lcd_putc,"\fikinci buton");
delay_ms(30);
if(input(pin_a0))
{
ver=10;
while(input(pin_a0));
goto gonder;
}
if(input(pin_a1))
{
ver=22;
while(input(pin_a1));
goto gonder;
}
}
}
}
 
arkadaşlar öncelikle ilgilendiğiniz için teşekkürler.ak47if dediğin şeyi devreden çıkaramam çünkü step motor sadece 1 tur döner ve sonra durur eğer çıkarırsam. naki kardeş doğru anlamışın ama ben 2pice seri iletişim kurdurmak istiyorum o yüzden diğer picten diğer pice döngü içinde nasıl buton kontrolü yapabiliriz onu soruyorum.yani döngü içinde program işlerken butona basınca diğer döngüye atlicak anlatabilmişimdir umarım.normal tek picte bunu rahatça yapılıyor ama alıcı vericili bir devre olduğu için yapamadım bi türlü.yazdığım programın tamamını gönderdim
ALICI programı:
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!!

while(1){

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

if (al==10) //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



}

}

if (al==22)
{
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

}
}

if (al==33)
{
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

}
}
if(al=44)
{

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



}
}
}

}


VERİCİ programı:
int ver;
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!!


basla:

if(input(pin_b0))
{ ver=10;
while(input(pin_b0));
goto gonder;
}
if(input(pin_b1))
{
ver=22;
while(input(pin_b1));
goto gonder;
}

if(input(pin_b2))
{
ver=33;
while(input(pin_b2));
goto gonder;
}
if(input(pin_b3))
{
ver=44;
while(input(pin_b3));
goto gonder;
}
goto basla;


gonder:
putc(ver); //alıcıya ver değişkeni içindeki bilgi gönderiliyor
goto basla;
}
 
bu programın fordan çıkmaması çok normal çünkü i hiç bi zaman 8 olmaz!
 
bu programın fordan çıkmaması çok normal çünkü i hiç bi zaman 8 olmaz!

zaten arkadaşta istenmediği sürece yani butona basılmadığı sürece for'dan çıkmasını istemiyor.
-------------------------------------------------------------------------

peki bu pic'ler yanyanamı yoksa alıcı verici devreleri uzak mesafedemi? aklıma gelen tek yol ikici pic'e de butonların uçlarının götürülemesi. uygunsa ilk cevapta yazdığım gibi buton komutlarını ikinci pic'in komutlarına eklersen tabi ordaki giriş uçları farklı olacak ona göre uygun şekilde halledilebilir.
 
zaten arkadaşta istenmediği sürece yani butona basılmadığı sürece for'dan çıkmasını istemiyor.
-------------------------------------------------------------------------

peki bu pic'ler yanyanamı yoksa alıcı verici devreleri uzak mesafedemi? aklıma gelen tek yol ikici pic'e de butonların uçlarının götürülemesi. uygunsa ilk cevapta yazdığım gibi buton komutlarını ikinci pic'in komutlarına eklersen tabi ordaki giriş uçları farklı olacak ona göre uygun şekilde halledilebilir.

naki kardeş rf alıcı verici kullanıcam devrede o yüzden uzak mesafede olucak.Yani yazılımsal bir çözüm bulmalıyım.Seri iletişimde istediğimde fordan nasıl çıkabilirim hiç bi yerde bulamadım bunu.

bu programın fordan çıkmaması çok normal çünkü i hiç bi zaman 8 olmaz!

kardeş for dan sadece istediğim zaman çıkıcam yani başka bir butona bastığımda fordan çıkıp diğer for'a girecek.
 
Moderatör tarafında düzenlendi:
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...
 
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
 

Ekli dosyalar

  • adsız.jpg
    adsız.jpg
    77.2 KB · Görüntüleme: 21
bu işlem yapılırken rf ile veri gönderiminde kaçan veriler olabilir ancak kullanılabilir. :)
 

Forum istatistikleri

Konular
129,808
Mesajlar
930,314
Kullanıcılar
452,615
Son üye
ismail_gök

Yeni konular

Geri
Üst