İki Ledi Aynı anda Yakmak

Başlatan vitruvius, 28 Nisan 2011, 18:58:48

vitruvius

Merhaba CCS'te yeniyim ve ilk çalışmamda biraz takıldım. Yapmak istediğim şey şu; birkaç tane trafik ışığının yanma sürelerini bilgisayardan kontrol etmek. Adım adım gideyim dedim öncelikle CCS'te trafik ışıklarını yakayım sonra bilgisayarlardan verileri alırım. Ancak CCS'te yazdığım kodları aynı anda işleme sokamıyorum. Yukarıdan aşağıya doğru sırayla işleme giriyor. Böyle olunca da önce 1. direğin kırmızı-sarı-yeşil ışığı yanıp sönüyor sonra ikinci direğin ışıkları yanmaya başlıyor. Benim istediğim iki direğin de ışıkları aynı anda aktif olabilsin. Direklerin kodlarını  { } parantezlerle ayırıp if'lerle bölüyorum çünkü bilgisayardan on/off bilgisini sorgulatmayı planlıyorum her direk için.  Yardımlarınızı bekliyorum, şimdilik 2 direk için yazdığım kod aşağıda. Teşekkürler.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
int i=1, k=1;
void main ()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);

output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);

//1. Direk
if (i==1)
{
output_high(pin_b0); //Kırmızı Işık Yandı
delay_ms(500);
output_low(pin_b0); //Kırmızı Işık Söndü
delay_ms(500);
output_high(pin_b1); //Sarı Işık Yandı
delay_ms(500);
output_low(pin_b1); // Sarı Işık Söndü
delay_ms(500);
output_high(pin_b2); // Yeşil Işık Yandu
delay_ms(500);
output_low(pin_b2); //Yeşil Işık Söndü
delay_ms(500);
}

// 2. Direk
if(k==1)
{
output_high(pin_b3); //Kırmızı Işık Yandı
delay_ms(500);
output_low(pin_b3); //Kırmızı Işık Söndü
delay_ms(500);
output_high(pin_b4); //Sarı Işık Yandı
delay_ms(500);
output_low(pin_b4); // Sarı Işık Söndü
delay_ms(500);
output_high(pin_b5); // Yeşil Işık Yandı
delay_ms(500);
output_low(pin_b5); //Yeşil Işık Söndü
delay_ms(500);
}
}

kudretuzuner

Merhaba
Kullandınız yazılım dilini bilmiyorum ama tarifinize göre {} arasındaki işlemler sadece tek direğe ait.Benim fikrimi sorarsanız her direğin kırmızı,sarı ve de yeşil renklerini ayrı ayrı {} arasına alırsanız algoritmayı kurmak daha kolay olacak gibi geliyor bana.Hatta bu bilgileri PC'de de işleyecekseniz gelecek dataları byte byte alarak PC'ye daha kolay işlem yaptırabilirsiniz.Kolay gelsin.
Amatör

vitruvius

Merhaba, C#'ta kodladığım kısmı şu linkte https://rapidshare.com/files/459644770/trafik_isiklari.zip

Aynen bu şekilde bir devre kurup o forma bir iki buton ekleyip ışıkları devremde yakacağım. C#'ta kodlarken checkbox'ın on/of durumuna göre her direk için tek tek {} ler arasında kodlamıştım. Orada kodlarken her direk için if yazıp checkbox'ı sorgulatıyorum {} içine de gerekli yanıp sönme kodlarını yazıyorum. C#'ta yukarıdan aşağı işlemiyor kodlar yani başlat butonuna bastığımda bütün direklerin kırmızı ışığı aynı anda yanıyor. CCS C'de de aynı şekilde kodlamaya çalışmıştım ama ledleri aynı anda yakmak için iki pini birden lojik-1 yapmayı başaramamıştım. Dediğiniz gibi ışık ışık kodlamayı deneyeceğim.

Bu arada sanal comport linkinde dosya bulunamıyor diyor. Yeniden yüklemenizi bekliyorum sabırsızlıkla =)

Teşekkürler.

kudretuzuner

Merhaba
Programınızı indirdim ama açamadım.Driver linkini veriyorum.Buyrun.
https://rapidshare.com/files/459647824/PL-2303_Driver_Installer.rar
Amatör

vitruvius

Vs 2010 kullanıyorum ondan olabilir mi acaba?

Driver'ı yükledim fakat açamadım. Çünkü nereye yüklediğini bulamıyorum bir türlü. Windows 7 uyumlu mu? Ayrıca bu program kablonun bilgisayara uyumu için gerekli bir program mı, yoksa simulasyonlarımda da kablo bağlamadan usb'yi port olarak gösteriyor mu? Teşekkürler.

kudretuzuner

Merhaba
USB portlarından birini com olarak atıyor.Benim notbukta 3 USB var programı setup ile çalıştırdıktan sonra com3 görüyorum.VB Net ile de çalışıyorum.Program muhtemelen belgelerime veya C:\ yüklenmiştir.Driver'ı çift tıklayıp çalıştırmanız lazım.
Amatör

rree

Yazdığınız program akış diyagramı direklere bağlı değil. Zamana bağlı olması lazım.İlk önce minum zaman belirlemeli bu sarı ışık zamanı olabilir. Her zaman adımı bu zaman dilimi ayarlarında olabilri.

     Başla:
Zaman1
    --Yanacak lambalar
    Bekle 200 ms
Zaman2
   -- Yanacak lambalar
    Bekle 200 ms
.
.
.
Zaman x
      -- Yanacak lambalar
    Bekle 200 ms


Goto başla
                Şeklinde olmalı bence

vitruvius

Alıntı yapılan: kudretuzuner - 28 Nisan 2011, 22:52:07
Merhaba
USB portlarından birini com olarak atıyor.Benim notbukta 3 USB var programı setup ile çalıştırdıktan sonra com3 görüyorum.VB Net ile de çalışıyorum.Program muhtemelen belgelerime veya C:\ yüklenmiştir.Driver'ı çift tıklayıp çalıştırmanız lazım.

Yok bulamıyorum ne diye aratmam gerekiyor? Windows 7'ye uyumlu değil mi?

ehliseyf

bilgilerin aynı anda yüklemesi için bütün bir portu aynı anda aktif etmelisin.Yani output_b(0xFF) gibi yada shift  register kullanabilirsin.bu şekilde tam anlamıyla aynı anda yanıp sönme yakalayabilirsin.komutları teker teker işleme alırsan ki eğer her iki komut arasında 1 clock bekleme yapar.Tamam bunu sen göz ile görmezsin ama sonsuz dongude problem çıkartır.bahsettigim iki yontemde işe yarıyabilir.birde lambaları birbirlerine paralel baglamış olsan diyorum.

mesela bir ısıgın kırmızısı ile digerinin yeşili
aynı ısıgın yeşili ile  diğerinin kırmızısı bu şekilde olabilirmi diyorum ama pek emin değilim kaba taslak düşündüm yazdım.
Code'm mu oturturum !

GreeN

Bir arkadaş bahsetmiş şu direk bu direk diye değilde kavşak olarak düşün. şu kavşağa geçiş izni ver , diğerini duedur gibi düşünsen. Bu durumun lambalarını gruplayıp konutu pc den gönderebilirsin. 3 de durum olur. dur hazır geç gibi. kavşak 1 dur kavşak 1 hazır kavşa 1 geç.
Terörü Lanetliyoruz.

rree

#10
"http://doveda.byl.cz/konstrukce/semafor/index.htm"

Yukarıdaki linkte zaman dilimleri ile  trafik lambaları nasıl tasarlanmış.

vitruvius

Alıntı yapılan: rree - 29 Nisan 2011, 22:20:38
"http://doveda.byl.cz/konstrukce/semafor/index.htm"

Yukarıdaki linkte zaman dilimleri ile  trafik lambaları nasıl tasarlanmış.

Güzel tasarlanmış =) Özellikle üstteki semafor ile gösterilen kısım benim çalışmama daha uygun. Ama ben bu süreleri bilgisayardan kullanıcının kendisinin girmesini istediğim için direk direk {} ile ayırmaya çalışmıştım. Bilgisayarla iletişimi programlamaya çalışıyorum, halledince dediklerinizi deneyeceğim. Teşekkürler.

vitruvius

#12
Arkadaşlar bilgisayar ile iletişimi kurdum. Verileri alabiliyorum. Tek direk için sorun yok ancak direklerin sayısı arttığında CCS C'nin yukardan aşağı çalışma sorununu çözemedim hala. Tekrar bir özet geçersem her bir direğe ait kodları {} arasına alıyorum ancak bir direğin işlemleri bitmeden bir sonraki direğe sıra gelmiyor. Her bir direğin her bir ışığı için değerler tek tek bilgisayardan girileceğinden bu bir sorun oluşturuyor. Yoksa 3 tane delay_ms() ile çözerdim.  {}'ler arasına yazdığım kodların aynı anda çalışmasını nasıl sağlayabilirim? Yani kodlardaki 1. direk ile 2. direğin aynı anda çalışmasını istiyorum. Teşekkürler.

Çalıştığım devrenin basit halinin kodları:

#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)

unsigned long k1=1000; 
unsigned long s1=200;
unsigned long y1=800;

unsigned long k2=900;
unsigned long s2=300;
unsigned long y2=600;

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_b(0x00); //tümüyle çıkış olsun
set_tris_c(0x00); //tümüyle çıkış olsun
output_b(0x00); //Sıfırlayalım
output_c(0x00); //Sıfırlayalım

//Direk 1
{
output_high(pin_b0);
delay_ms(k1);
output_low(pin_b0);
output_high(pin_b1);
delay_ms(s1);
output_low(pin_b1);
output_high(pin_b2);
delay_ms(y1);
output_low(pin_b2);
}

//Direk 2
{
output_high(pin_c0);
delay_ms(k2);
output_low(pin_c0);
output_high(pin_c1);
delay_ms(s2);
output_low(pin_c1);
output_high(pin_c2);
delay_ms(y2);
output_low(pin_c2);
}

}

GreeN

b0 - direk1 kırmızı
b1 - direk1 sarı
b2 - direk1 yeşil
b3 - 0
b4 - 0
b5 - direk2 kırmızı
b6 - direk2 sarı
b7 - direk2 yeşil

1- direk1 kırmızı yanarken direk2 yeşil. output_b(10000001);
2- direk1 yeşil yanarken direk2 kırmızı  output_b(00100100);
...
...

output_b(d2y,d2s,d2k,0,0,d1y,d1s,d1k); bu satır ile direklerin sinyallarini aynı anda gönderebilirsin.
Terörü Lanetliyoruz.

vitruvius

İlginiz için teşekkür ediyorum. Nedense başaramadım işi, output_b(11111111) yapsam da b3, b4, b5 pinleri yanmıyor. Ancak esas derdim aralara delay_ms() koyarken oluşuyor. Şöyle ki output_b(00100001) ile iki direğin de kırmızı ışığını yaktık. Ancak ben iki kırmızının da ,ve diğer bütün ışıkların, farklı sürelerde yanmasını istiyorum. Yani output_b(00100001)'tan sonra delay_ms() koyup output_b(01000010) ile sarı ışığa geçersem iki kırmızı da aynı süre yanmış olacak.

b3, b4, b5 pinlerinin yanmamasının sebebi belki koddandır diye kopyalıyorum:

#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io (b)

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_b(0x00); //tümüyle çıkış olsun

output_b(11111111);
}


Teşekkürler.