buton led program sorunu ?

Başlatan kupabjk, 07 Mart 2012, 18:30:14

kupabjk

arkadaşlar daha bu işlerde yeniyim.Bu sitede bir tane soru gördüm bir arkadaş yazmış biri de cevabını yazmış ben o kodu mplab ta yazıp pıc e attım fakat butona basmadan ledler kendi kendine yanıp sönüyor.Soru şöyle
RB0 Butonuna
1.BASMADA RC1 VE RC2 LEDLERİ YANACAK
2.BASMADA RC1 SÖNECEK,RC2 YANACAK
3.BASMADA RC1 YANACAK RC2 SÖNECEK
4.BASMADA PROGRAM BAŞA DÖNECEK.
Bu soruyla çok uğraştım ve hala uğraşıyorum ben kendim yaptığımda sadece 2.basamakta bir sorun oluşuyor.Butona 2.kez bastığımda RC1 sönüyor RC2 yanık kalıyor ama butonu bıraktığımda RC2 de sönüyor fakat sönmemesi lazım.Lütfen biri yardımcı olsun programı tekrar Hi-Tech ile yazarsa çok mutlu olacağım teşekkürler.Benim yazdığım programsa şöyle:

#include<htc.h>
#include<pic.h>
int a,b,c,d;
a=0;b=0;c=0;d=0;
void main ( )
{
TRISB=0x01;
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;

while(1)

{
if(RB0)
a=1;
while(a)
{

RC1=1;
RC2=1;
if(RB0==0&&RC1==1&&RC2==1)
b=1;
while(b)
{
if(RB0)
RC1=0;

       
    if(RB0==0&&RC1==0)
    c=1;
    while(c)
    {
    if(RB0)
   
    RC1=1;
                                    RC2=0;
   
    if(RB0==0&&RC1==1&&RC2==0)
    d=1;
    while(d)
    {
    if(RB0)
    PORTC=0;
    if(RB0==0&&PORTC==0)
    {
    a=0;
    b=0;
    c=0;
    d=0;
    }

}   
}   
   
}    

}    
   
}    
   
         
         
   

   

veli dayı

Dediğin işi yapacak programı yazdım ama pic basic dilinde.
ikincisi ben porta.0 ı giriş olarak kullandım.sen işine geldiği gibi değiştir.
üçüncüsü mevzu bahis olan programlama olduğu için 16f84 ün osc. ve besleme katlarını göstermedim.
hex ve diğer programları ayrı bir klasörde gönderdim.ayrıyeten inceleyebilesin diye derlenmemiş hazır pic basic komutlarını ayrı bir notepad da gönderdim.proteus şemasıda içinde simüle edip deneyebilirsin
gerisi sana kalmış kolay gelsin.

kupabjk

teşekkürler usta.şu an telden giriyorum birazdan bakacagım gondermış oldugunuz dosyaya.bize hi-tech te gosterıyorlar okulda inşaallah sizin gondermişm oldugunuz programı kendiminkine uyarlayabilirim ve benim pıc 16f877a çok teşekkür ederim ilginiz için.Teşekkürler.

veli dayı


vitruvius

Şöyle bir mantıkla yapabilirsiniz. Butona her basıldığında i tamsayısını \"bir\" arttırırsınız. Tabi bunu kesme içinde yaparsınız. Ana programda da i\'nin değerini kotrol edersiniz. i=1 iken iki ledi yakarsınız, i=2 iken birini söndürürsünüz, i=3 iken diğerini söndürüp i=0 yaparsınız. Böylece i sıfırlanmış olur, yani tekrar başa dönmüş olursunuz. Ben programı CCS C\'de yazdım, HI TECH bilmediğimden kodları vermedim, mantığını anlattım. Kolay gelsin.

kupabjk

yani ben a b c d li yaptım sizin dediğiniz i leri benim yaptığım programda nereye koyacağım?a lar b ler yine duracak mı acaba?

vitruvius

Dediğim gibi HI TECH bilmiyorum. CCS C\'de yazdığım kodu vereyim ona göre uyarlayın. Tekrar belirteyim butona basıldığını kesme ile algılıyorum. Kolay gelsin.

#include <16f877A.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b)
int i=0;

#int_ext
void ext_kesmesi()
{
      i++;
}

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_c(0x00);
   set_tris_b(0x01);
   output_c(0x00);
   output_b(0x00);
   
   ext_int_edge(L_TO_H);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
  while(1)
  {
  if (i==1)
      {
      output_high(pin_c1);     
      output_high(pin_c2);     
      }
      else if (i==2)
      {
      output_low(pin_c1);     
      }
      else if (i==3)
      { 
      output_high(pin_c1);
      output_low(pin_c2); 
      }
      else if (i==4)
      {
      output_low(pin_c1);
      output_low(pin_c2);
      i=0;
      }
  }

}

kupabjk

sağolasın usta Allah razı olsun inşaallah Hi-Tech e göre uyarlayabilirim:))

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