karaşimşek devresi

Başlatan ercanskose, 06 Nisan 2020, 14:08:06

ercanskose

arkadaşlar merhaba,

16f628a ile 14 kanal karaşimşek devresi yaptım. C kodu kullandım. herşey normal çalışıyor fakat aynı anda 2 ledi aynı anda yapmak istiyorum. mesela RA2 ve RA3 çıkışındaki ledi aynı anda yakmak istiyorum. yeni başladım kodlamaya.  olarak kodunu bilen arkadaşlar yardım edebilirmi. kullandığım kodlar aşağıdadır.

#include <main.h>

#use FIXED_IO( A_outputs=PIN_A7,PIN_A6,PIN_A4,PIN_A3,PIN_A2,PIN_A1,PIN_A0 )
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#use delay(internal=8MHz)
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES PROTECT                  //Code protected from reads


void main()
{
 int bekle=200;

set_tris_b(0b00000000);                                // B Portu Çıkış olarak ayarlandı.
output_b(0b00000000); 
set_tris_a(0b00000000);
output_a(0b000000000);
   while(TRUE)
   {
   //  output_b(0b00000000);
  //    output_a(0b00000000);
   //   delay_ms(bekle);
   
     
     
      output_a(0b00000100);  //3.led - RA2 - soldan sağa
      delay_ms(bekle);
      output_a(0b00001000);  //4.led - RA3
      delay_ms(bekle);
      output_a(0b000000000);
      output_b(0b00000001);  //8.led - RB0
      delay_ms(bekle);
      output_b(0b00000010);  //9.led - RB1
      delay_ms(bekle);
      output_b(0b00000100);  //10.led - RB2
      delay_ms(bekle);
      output_b(0b00001000);  //11.led - RB3
      delay_ms(bekle);
      output_b(0b00010000);  //12.led - RB4
      delay_ms(bekle);
      output_b(0b00100000);  //13.led - RB5
      delay_ms(bekle);
      output_b(0b01000000);  //14.led - RB6
      delay_ms(bekle);
      output_b(0b10000000);  //15.led - RB7
      delay_ms(bekle);
      output_b(0b000000000);
       output_a(0b01000000);  //6.led - RA6
      delay_ms(bekle);
      output_a(0b10000000);  //7.led - RA7
      delay_ms(bekle);
      output_a(0b00000001);  //1.led - RA0
      delay_ms(bekle);
      output_a(0b00000010);  //2.led - RA1
      delay_ms(50);
     
      output_a(0b00000010);  //2.led - RA1 - sağdan sola
      delay_ms(bekle);
      output_a(0b00000001);  //1.led - RA0
      delay_ms(bekle);
      output_a(0b10000000);  //7.led - RA7
      delay_ms(bekle);
      output_a(0b01000000);  //6.led - RA6
      delay_ms(bekle);
       output_a(0b000000000);
      output_b(0b10000000);  //15.led - RB7
      delay_ms(bekle);
      output_b(0b01000000);  //14.led - RB6
      delay_ms(bekle);
      output_b(0b00100000);  //13.led - RB5
      delay_ms(bekle);
      output_b(0b00010000);  //12.led - RB4
      delay_ms(bekle);
      output_b(0b00001000);  //11.led - RB3
      delay_ms(bekle);
      output_b(0b00000100);  //10.led - RB2
      delay_ms(bekle);
      output_b(0b00000010);  //9.led - RB1
      delay_ms(bekle);
      output_b(0b00000001);  //8.led - RB0
      delay_ms(bekle);
      output_b(0b000000000);
      output_a(0b00001000);  //4.led - RA3
      delay_ms(bekle);
      output_a(0b00000100);  //3.led - RA2
      delay_ms(50);
     
   }

}

thekme

Aynı anda 2 çıkışı yakmak istiyorsan çıkışa o pinlere denk gelen byte verisini göndermen lazım yani

output_a(0b00000010); şu tek bir pini çıkış
output_a(0b00000011); şu ise 2 pinin çıkış yapılmış halidir.

Yani aynı andan kaç bit çıkış vermek istiyorsan onları 1 yap.Sağdan solan RA0 RA1 diye gidiyor.
Tabi bu 1 ve 0 işi devrenin tasarımına göre de değişebilir aklında bulunsun.
Derin olan kuyu değil, kısa olan iptir.

ercanskose

#2
teşekkür ederim arkadaşım. peki port isimleri değişikse nasıl olucak. Mesela RA0 portla RB0 portu aynı anda yakıcam.

thekme

output_b(0b000000001);
output_a(0b000000001);

hangi portun pinini aktif yapacaksan o port'a 1 vermen yeterli.Yani RA0 ı yakıcaksan porta ya 00000001 verisini yazman gerekli aynı şekil RB0 içinde portb ye 00000001 verisini yazman gerekli.ikisinide yakıcaksan ikisine de aynı kodu vermen gerekli
Derin olan kuyu değil, kısa olan iptir.

ercanskose

teşekkür ederim arkadaşım. demekki araya delay_ms komutu yazmazsan aynı anda yakıyo. Peki birşey daha sorabilirmiyim. Proteusta bir ledi yaktım sonra 6. (RA0) portuna 5v geldiğinde ledi söndürüp başka ledi yaktım sorunsuz çalışıyor fakat gerçek uygulamaya geçtiğimde çalışmıyor. sebebi ne olabilir.

thekme

Gerçek hayatta pek çok nedeni olabilir kullanıdığın pic in bağlantılarını doğru yapıyormusun (MCLR,5V,GND ),yazılımın pice yüklendiğinden eminmisin ,ledleri kurduğun devre yazdığın koda uygun mu (Sen picden çıkışı 5V olarak yapıyorsan ledin katotu toprağa gitmesi ,pici giriş yaptığın zaman ledin anodunu 5v a katotunu pice bağlamak gibi) Çünkü proteus simülasyon için çoğu bağlantıyı kendisi otomatik yapıyor.Gerçek hayatta donanımı iyi bilmek gerekiyor.
Derin olan kuyu değil, kısa olan iptir.

ercanskose

aynene deiğiniz gibi yaptım ledin katodu pic bacağında anotu ortak. mclr bacağına direnç atıp artı ya bağladım 5. bacağı toprak 14. bacağı artı ucu. herşey nomal kodu aşağıdaki gibi. bacak bağlantılarıda düzgün. çıkdırmak üzereyim altı üstü 2 tane led 3 direnç 1 tane pic var. ledler 3 voltluk 100ohm diren. bağladım. mclr bacağınada 10k direnç bağladım.

void main()
{
trisb=0b00000000;                                // B Portu Çıkış olarak ayarlandı.
portb=0b00000000;
trisa=0b00000000;                                // B Portu Çıkış olarak ayarlandı.
porta=0b00000000;

while(1)                                            //while(1) demektir.
{
if (PORTB.RB0==1)
 {
portb.RB1=0;
 porta.ra1=1;

 }
 else
 {
 porta.ra1=ra0;
delay_ms(300);
portb.RB1=1;
}
}
}

thekme

#7
Pic protona benziyor yazdığın platform tam emin olamadım ama bana yabancı geldi kod tipleri.Hangi platformu kullanıyorsun.

Sen porta ve portb yi çıkış tanımlamışsın ama if de portb den buton okumaya çalışıyorsun. Button okuma yapacağın pini giriş yapmak zorundasın.
led yakacağın pini çıkış yapmak zorundasın(aynene deiğiniz gibi yaptım ledin katodu pic bacağında anotu ortak : demişsin anot ortak ise bağladığın pini giriş yapmalısın).
porta.ra1=ra0; burda napmışsın anlamadım direk 1 yada 0 yap.
Birde buton okumadan sonra bir gecikme ver ki ledin yanıp yanmadığını gör.
Hangi programlayıcı kullanıyorsun belki programı atamıyorsundur.

Birde çıldırmak üzereyim demişsin :D daha bu başlangıç devreyi duvara vurduğun gün çıldırdığını anlarsın :D
Derin olan kuyu değil, kısa olan iptir.

Hızlı Yanıt

Not: Bu konu bir moderatör tarafından onaylanmadan görüntülenmeyecektir.

Adı:
E-Posta:
Doğrulama:
Lütfen bu kutuyu boş bırakın:
IRFP250 Nedir:
kısayollar: göndermek için alt+s veya önizleme yapmak için alt+p'ye basın