2 Buton 3 Led Uygulama ( Yardım )

Başlatan Ekolan, 15 Ekim 2014, 16:32:32

Ekolan

Bütün Forum üyelerine Selamlar.
Ben de  Hobi  olarak  CCS C ile  bazı  videoları izleyerek küçük de  olsa  program yazmaya  çalışıyorum.
Tek buton ile   "İF-ELSE" ve  LCD uygulamalarını sorunsuz çalıştııryorum, 2. Butonu Eklediğimde hangi butona  basarsam basayım 1. butona basılmış gibi algılıyor.

Örn; D0 butonuna basıyorum A0 a bağlı LED yanıyor.
        D1 butonuna  bastığımda da  A0 Yanıyor.  A1 yanmasını istiyorum.

Şema ve Kod ektedir, Nerede Hata  Yaptığım konusunda  yardımcı olabilir misiniz.
Teşekkür Ederim.

Bu programla Asıl olarak Yapmak İstediğim;
D0 Butona basıldığı sürece, A0 Led yanacak.
D0 butonu kesildiğinde, A2 Ledi D1 girişinden sinyal gelene kadar Yanacak





#include "C:\Documents and Settings\Ekolan\Desktop\pic uygulama\LCD877.h"
#define use_portb_lcd TRUE
#include <lcd.c>

void main()
{
 
basla:

if(input(pin_d0)) 
{
output_high(pin_a2);
delay_ms(500);
output_low(pin_a2);
delay_ms(500);
}

else if (input(pin_d1))
{
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
}
else
{

output_high(pin_a0);
delay_ms(500);
output_low(pin_a0);
delay_ms(500);
}


goto basla;
}

Gökhan BEKEN

2 buton da sürekli basılıymış gibi davranır. Butona bastığında besleme kısa devre olur. Yazılımınızda sorun yok, devreniz yanlış. Pull-up veya pull-down yapın.
Özel mesaj okumuyorum, lütfen göndermeyin.

Recep METE

#2
Aşağıdaki kodları, senin kodundaki ilgili yerlere yazarsan program sorunsuz çalışacaktır.Butonları giriş, ledleri çıkış olarak ayarlaman gerekir.

#use fast_io(d) // Port yönlendirme komutları A portu için geçerli
#use fast_io(a) // Port yönlendirme komutları B portu için geçerli
                      .
                      .
                      .
                      .


set_tris_d(0x03);    // RD0-RD1 ucu giriş olarak ayarlandı.
   set_tris_a(0x00);    // RA0 portu tümüyle çıkış olarak ayarlandı.
   
   output_a(0x00);
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Gökhan BEKEN

@semfero hocam şemadaki buton bağlantısı yanlış, butona basınca besleme kısa devre oluyor. Direnç kullanılması lazım.
Yazılımla düzelecek bir sorun değil.
Özel mesaj okumuyorum, lütfen göndermeyin.

Ekolan

Cevaplarınız için Teşekkür ederim,
Meftun hocamızın dediği gibi  butonların önüne direnç ekledim sorun kalmadı.

Port giriş çıkış ayarlarını denemiştim sorunu çözememiştim, şimdilik buton olaylarını çözdük.


Aşağıda şemasını çizdiğim algoritmanın yazılım aşaması ne şekilde olmalıdır ?
if-else, goto   seklınde  bıseyler  yapmaya  calıısyorum ama beceremedım.
İnceleyebileceğim  buna benzer örnek yazılım ve  şemalar verebilir misiniz.
Şimdiden tesekkur ederım




Gökhan BEKEN

Zaten programın akış diyagramını çizmişsiniz, geriye birşey kalmamış. Ama akış diyagramınızda eksiklik var, mesela "a1 butonu" na basılmışsa "a2 portundaki ledi yak" diyor, peki ne kadar yakacak, yaktıktan sonra ne yapacak? Aynı şey, alttaki "a5 portundaki ledi" yak kısmında da geçerli.
Özel mesaj okumuyorum, lütfen göndermeyin.

vitruvius

@meftun'un dediği gibi akış diyagramında eksiklikler var. Şu aşamalarda da 5sn gibi uzun süreli zamanlarla çalışmanı tavsiye etmem. Serdar Çiçek'in CCS C ile Pic Programlama kitabı var onu şiddetle öneririm. Başlangıç için çok güzel bir kitaptır.

Aşağıda 16F877A için ufak bir kod yazdım. b0 butonuna basınca d0 ledini, b1 butonuna basınca d1 ledini yakıyor. Yazılım mantığı orada, sonra başka istediğin şartları ve zamanları aralara eklersin.

Kolay gelsin.



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

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

   set_tris_b(0b00000011); //A1 giris, gerisi cikis
   set_tris_d(0x00); //D portu cikis
   output_d(0x00); // D portu cikislarini sifirla
   
 while(1) // Sonsuz döngü
 
 {     
      if(input(pin_b0))
      {
         delay_ms(15); // buton arki icin
         output_high(pin_d0); // a3'ü yak
         output_low(pin_d1);  // a4'ü söndür
      }
      
      if(input(pin_b1))
      {      
         delay_ms(15); // buton arki icin
         output_high(pin_d1); // a4'ü yak
         output_low(pin_d0);  // a3'ü söndür
      }
 }
}

Ekolan

Alıntı yapılan: vitruvius - 18 Ekim 2014, 00:05:00
@meftun'un dediği gibi akış diyagramında eksiklikler var. Şu aşamalarda da 5sn gibi uzun süreli zamanlarla çalışmanı tavsiye etmem. Serdar Çiçek'in CCS C ile Pic Programlama kitabı var onu şiddetle öneririm. Başlangıç için çok güzel bir kitaptır.

Aşağıda 16F877A için ufak bir kod yazdım. b0 butonuna basınca d0 ledini, b1 butonuna basınca d1 ledini yakıyor. Yazılım mantığı orada, sonra başka istediğin şartları ve zamanları aralara eklersin.

Kolay gelsin.

(Resim gizlendi görmek için tıklayın.)

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

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

   set_tris_b(0b00000011); //A1 giris, gerisi cikis
   set_tris_d(0x00); //D portu cikis
   output_d(0x00); // D portu cikislarini sifirla
   
 while(1) // Sonsuz döngü
 
 {     
      if(input(pin_b0))
      {
         delay_ms(15); // buton arki icin
         output_high(pin_d0); // a3'ü yak
         output_low(pin_d1);  // a4'ü söndür
      }
      
      if(input(pin_b1))
      {      
         delay_ms(15); // buton arki icin
         output_high(pin_d1); // a4'ü yak
         output_low(pin_d0);  // a3'ü söndür
      }
 }
}



vitruvius hocam;
örneğiniz için teşekkürler.  programa ek olarak "else" ifadesini ekledim, butonların basılı olmamasında 3. ifadeyi çalıştırması için gerekli komutları yazdım şimdilik bu konu ile alakalı sorun kalmadı.

Meftun hocam,  yorum için teşekkür ederim.  programın akışını kafamda  algoritma olarak canlandırabiliyorum fakat hangi  komutları  kullanacağım konusunda  bilgi sahibi  değilim.
uygulamalı pic kitabı almak Gerekecek.
Yorumlarınız için tekrar tesekkur  ederım.   

vitruvius

Alıntı yapılan: Ekolan - 18 Ekim 2014, 19:00:24

vitruvius hocam;
örneğiniz için teşekkürler.  programa ek olarak "else" ifadesini ekledim, butonların basılı olmamasında 3. ifadeyi çalıştırması için gerekli komutları yazdım şimdilik bu konu ile alakalı sorun kalmadı.

Else'i eklerken dikkat et push-button kullandığın durumlarda. Çünkü sen butona basınca if'in içine girecek ama butonu hemen bırakacağın için if'ten çıkıp else'in içine girecek. If'in içindeki etkileri göremeyebilirsin. O gibi durumlar için fsm (finite state machine) modelini ve örneklerini inceleyebilirsin.

Ekolan

Alıntı yapılan: vitruvius - 18 Ekim 2014, 20:01:19
Else'i eklerken dikkat et push-button kullandığın durumlarda. Çünkü sen butona basınca if'in içine girecek ama butonu hemen bırakacağın için if'ten çıkıp else'in içine girecek. If'in içindeki etkileri göremeyebilirsin. O gibi durumlar için fsm (finite state machine) modelini ve örneklerini inceleyebilirsin.

Öneriniz için teşekkür ederim hocam