dijital pin karşılaştırma

Başlatan ALakurt, 02 Ocak 2013, 14:35:22

ALakurt

arkadaşlar bir proje gereği rölelerden gelen 5 voltu karşılaştırmam gerekiyor.

3 tane pin kullanılacak örneğin A0, A1 ve A2 uçları karşılaştırılacak. B0, B1 ve B2 uçları da çıkış verecek.

örneğin, A0'a +5V gelince B0 çıkış verecek, ama bu sırada A1'den veya A2'den  +5V gelse dahi B1 veya B2 çıkış vermeyecek. A3 ucu resetleyene kadar. Reset attıktan sonra isteğe göre diğer butonlar kullanılarak çıkış değiştirilebilecek.

şöyle bi kod yazdım ama proteusda çalışmadı.

#include <16f84a.h>
#use delay(clock=4000000)

 #fuses XT, NOWDT,

void main(void)
{
   set_tris_a(0xFF);    // A portu tümüyle giriş olarak yönlendiriliyor
   set_tris_b(0x00);    // B portu tümüyle çıkış olarak yönlendiriliyor

   output_b(0x00);      // B portu çıkışları sıfırlanıyor


while(TRUE) // Sonsuz döngü
{
LED1:
if(input(PIN_A0)==0, (PIN_A1)==1 , (PIN_A2)==1 , (PIN_A3)==0 )  ;
{
output_high(PIN_B0); // Ledi yak
while(input(PIN_A3)==1); // Butonun bırakılmasını bekle
output_low(PIN_B0); // Ledi söndür
delay_ms(25);  //debounce süresi
goto LED1;
}

LED2:
if(input(PIN_A0)==1, (PIN_A1)==0 , (PIN_A2)==1 , (PIN_A3)==0 )  ;
{
output_high(PIN_B1); // Ledi yak
while(input(PIN_A3)==1); // Butonun bırakılmasını bekle
output_low(PIN_B1); // Ledi söndür
delay_ms(25);  //debounce süresi
goto LED2;
}


LED3:
if(input(PIN_A0)==1, (PIN_A1)==1 , (PIN_A2)==0 , (PIN_A3)==0 ) ;
{
output_high(PIN_B2); // Ledi yak
while(input(PIN_A3)==1); // Butonun bırakılmasını bekle
output_low(PIN_B2); // Ledi söndür
delay_ms(25);  //debounce süresi
goto LED3;
}





}
}



yada bu kod

#include <16f84a.h>
#use delay(clock=4000000)

#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

#use fast_io(a) // Port yönlendirme komutları B portu için geçerli
#fuses XT ,NOWDT
void main(void)
{
   set_tris_a(0xFF);    // A portu tümüyle giriş olarak yönlendiriliyor
   set_tris_b(0x00);    // B portu tümüyle çıkış olarak yönlendiriliyor
{


if(input(PIN_A0)==0 && input(PIN_A1)==1 && input(PIN_A2)==1 );
{
goto LED1;
}
if(input(PIN_A0)==1 && input(PIN_A1)==0 && input(PIN_A2)==1 );
{
goto LED2;
}
if(input(PIN_A0)==1 && input(PIN_A1)==1 && input(PIN_A2)==0 );
{
goto LED3;
}


{
LED1:
output_high(PIN_B0); // Ledi yak
output_low(PIN_B1); // Ledi söndür
output_low(PIN_B2); // Ledi söndür
}
 {
LED2:
output_low(PIN_B0); // Ledi söndür
output_high(PIN_B1); // Ledi yak
output_low(PIN_B2); // Ledi söndür
 }
{
LED3:
output_low(PIN_B0); // Ledi söndür
output_low(PIN_B1); // Ledi söndür
output_high(PIN_B2); // Ledi yak
}
}
}


bu kod ile sadece rb2 yanıyor enerjı verır vermez
yardımcı olan arkadaşlara şimdiden teşekkürler. iyi çalışmalar.

RaMu

Ben c den hiç anlamam, program mantığı veya asm kod isterseniz yardımcı olabilirim, yalnızca şunu denemenizi önerebilirim, 1. programda LED1 kısmının sonunda goto led1 yerine goto led2 ...  led2 kısmında goto led2 yerine goto led3  ... led3 kısmında goto led3 yerine goto led1 yazıp deneyin olmazsa zaten c bilenler yardım eder yada dediğim gibi asm kodu veya algoritma hakkında yardımcı olabilirim, bence 3 yarişmacı 3 buton gibi bir başlıkla aynı işi yapan bir orogram örneği bile bulabilirsiniz (bizim asm dersinde çözdüğümüz bir örnekti 3 yarışmacıya ait butonlar var ve herbiri için birer led hangi yarışmacı butona basar ise onun ledi yanıyor reset butonuna basılana kadar onun ledi yanık kalıyor)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

yusufburak

if-elseif yapısını kullanarak yapsan ? şartı sağladıktan sonra döngü içerisinde diğer girişleri pasif etsen ?  denemkte fayda var bence :S ya da resetlemek içiçn belli bi süre gecikme yap o kadar süre geciktir hem reset ne zaman gelicek bilemeyiz ki :S ? reset gelince girişler aktif olur ve yeniden bi lojik1 gelene kadar yanmakta olan led yanmaya devam eder ?
Öğretici aranıyor :)

sadogan

#include <16f84a.h>

#fuses XT, NOWDT,PUT
#use delay(clock=4000000)

int temizle_flag=1;

void main(void)
{
   set_tris_a(0xFF);    // A portu tümüyle giriş olarak yönlendiriliyor
   set_tris_b(0x00);    // B portu tümüyle çıkış olarak yönlendiriliyor

   output_b(0x00);      // B portu çıkışları sıfırlanıyor


while(TRUE) // Sonsuz döngü
{
  if(temizle_flag)
  {
    if(input(PIN_A0))
    {
      output_high(PIN_B0);
      temizle_flag=0;
    }
    else if(input(PIN_A2))
    {
      output_high(PIN_B2);
      temizle_flag=0;
    }
    else if(input(PIN_A3))
    {
      output_high(PIN_B3);
      temizle_flag=0;
    }
    
  }
 

 
  if(input(PIN_A4))
  {
      temizle_flag=1;
      output_low(PIN_B0);
      output_low(PIN_B1);
      output_low(PIN_B2);
  }
////////////////////////////////////  


}
}


z

Alıntı Yap3 tane pin kullanılacak örneğin A0, A1 ve A2 uçları karşılaştırılacak. B0, B1 ve B2 uçları da çıkış verecek.
örneğin, A0'a +5V gelince B0 çıkış verecek, ama bu sırada A1'den veya A2'den  +5V gelse dahi B1 veya B2 çıkış vermeyecek. A3 ucu resetleyene kadar. Reset attıktan sonra isteğe göre diğer butonlar kullanılarak çıkış değiştirilebilecek.

Komut listesini bilmiyorum. Tahmine dayalı kısa bir kod. (input_a() a portunu oku anlamında)

#include <16f84a.h>
#fuses XT, NOWDT,PUT
#use delay(clock=4000000)

void main(void)
{
   set_tris_a(0xFF);    // A portu tümüyle giriş olarak yönlendiriliyor
   set_tris_b(0x00);   // B portu tümüyle çıkış olarak yönlendiriliyor

while(TRUE) 
{
     while(input(PIN_A3)==0) output_b(input_a() & 1); 
     while(TRUE) output_b(input_a());      
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sadogan

while(TRUE) output_b(input_a());     

@Z hocam
Burda porta daki değişimler aynen portb ye yansımazmı ?

z

Reset attıktan sonra A daki değişimler B ye yansısın isteniyor zaten.

Eğer b4, b5, b6, b7 başka işler için kullanılacaksa ilave maskelemer gerekir. O kısmı es geçtim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

sadogan

Hocam ben şöyle anladım:
Porta nın pinlerinden harhangi bir pini "1"oldugunda
Portb ye yansıyacak daha sonra a daki değişimler dikkate
alınmayacak taki reset olama kadar.
yanlış anlamış olabilirim.

ALakurt

Alıntı yapılan: sadogan - 03 Ocak 2013, 13:28:55
Hocam ben şöyle anladım:
Porta nın pinlerinden harhangi bir pini "1"oldugunda
Portb ye yansıyacak daha sonra a daki değişimler dikkate
alınmayacak taki reset olama kadar.
yanlış anlamış olabilirim.

aynen dediğin gibi

açıkça.
porta 0'a 5V geldi diyelim, portb0 çıkış verecek. bu esnada porta1 veya 2 den bilgi gelse dahi portb1 veya portb2 çıkış vermeyecek.
taki porta3  +5V olana kadar. porta3 +5V olunca reset atacak. daha sonra talebe göre porta1 veya 2 ye basılarak o ralardan çıkış alınabilecek. yani bi çıkış aktifken diğer çıkışlar kesinlikle aktif olamayacak resete kadar.


z

Aslında bu tip sorularda, soruyu soran doğruluk tablosu verse yanlış anlamalar olmaz.

Not: b4,b5,b6,b7 için önlem alınmadı.

#include <16f84a.h>
#fuses XT, NOWDT,PUT
#use delay(clock=4000000)

void main(void)
{
   set_tris_a(0xFF);    // A portu tümüyle giriş olarak yönlendiriliyor
   set_tris_b(0x00);   // B portu tümüyle çıkış olarak yönlendiriliyor

while(TRUE) 
{
     while((input_a()&0x07)==0);
     output_b(input_a());      
     while(input(PIN_A3)==0);
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com