Bir Butona 2 görev vermek (kodlar içerde)

Başlatan sirhadim, 20 Şubat 2019, 15:49:14

sirhadim

arkadaşlar yeniyim. 3 butonlu 0-999 ileri geri devresini "pause özellikli" yapmak istedim. 3. buton devrede sayma yapılırken basıldığında "pause" edecek. Aşağıdaki devre çalıştı. ancak sorunum şu ki, aynı butona (3.buton (pin_e2)) tekrar bastığımda sayma işlemi kaldığı yerden devam etsin. bunu yapamadım. nasıl yapabilirim?

#include <16f877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT, NODEBUG, NOCPD 
#use delay(clock=4M)

char dizi[]={63,6,91,79,102,109,125,7,127,111};
char dizi2[]={111,127,7,125,109,102,79,91,6,63};
int x,y,z;


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0b00000111);
   
   output_b(dizi[0]);
   output_c(dizi[0]);
   output_d(dizi[0]);
      
   while(1)
   {
ileri:
      if (input(pin_e0)==1)
      {
      while(1)
      {   
         for(x=0; x<10; ++x)
         {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi[x]);
                  output_c(dizi[y]);
                  output_d(dizi[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause;
               
               }
            }
         }
      } 
      }
geri:
      if (input(pin_e1)==1)
      {
      while(1)
      {
        for(x=0; x<10; ++x)
        {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi2[x]);
                  output_c(dizi2[y]);
                  output_d(dizi2[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause2;
               }
           }
        } 
      }
      }      

pause:
       if(input(pin_e2)==1)
       {
          while(1)
          {
           output_b(dizi[x]);
           output_c(dizi[y]);
           output_d(dizi[z]);
           
           if(input(pin_e0)==1)
           goto ileri;
           if(input(pin_e1)==1)
           goto geri;
          }
       }
                 
pause2:

      if(input(pin_e2)==1)
      {
        while(1)
        {
         output_b(dizi2[x]); 
         output_c(dizi2[y]);
         output_d(dizi2[z]); 
        
         if(input(pin_e0)==1)
         goto ileri;
         if(input(pin_e1)==1)
         goto geri;
         }
        }
      
}

}

Ayrıca kodlar çok uzun olmuş, farklı döngü ve mantıkla yapabilirsin diyen üstatlardan yardım edenlere çok çok teşekkür ederim.

mehmet

#1
Bence;bundan önce "C" bilginizi
biraz gelişririn ve 'goto' komutundan
kurtulun.

Ayrıca bir buton ile led yakıp söndürme
temrini yapmış olmanız lazım.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

mustafa_cmbz

Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs

sirhadim

Alıntı yapılan: mehmet - 21 Şubat 2019, 17:49:06Bence;bundan önce "C" bilginizi
biraz gelişririn ve 'goto' komutundan
kurtulun.

Ayrıca bir buton ile led yakıp söndürme
temrini yapmış olmanız lazım.

Teşekkür ederim. Led yak söndür yaptım ama burda sayaç var, tek bit yerine ben burda displayde 8 biti (dp dahil) çalıştırıyorum. output_high/low ya da toggle ile led yak söndür yapmışken burda nasıl yapıcam

sirhadim

Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

bunu denedim. başka bir etikete dallandım ancak pause ettiğim yani diziden yakaladığım random değerleri ben nasıl devam ettiricem. for döngüsü ile programa yediremedim bir türlü. belki de yanlış yazıyordum bilmiyorum. mesela 687 de ileri sayarken pause ettim bunda sorun yok. ama 687 yi veya herhangi yakalanan değeri ileri yada geri saymasına devam ettiremiyorum. devreyi proteusta kurdum çalıştı board da kurdum orda da tamam ama en çok istediğim bu özellik yok

Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs

etmiyor işte hocam yani ettiremiyorum :) baştan başlatabiliyorum ama kaldığı yerden iler geri saydıramıyorum



M.Salim GÜLLÜCE

Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs
Aslında 1 adet bayrag (Flag) kullanacaksın butona her basıldığında durum değiştirecek. Bayrak kaldır indir...
 :)

sirhadim

hm bayrak konusunu daha görmedim teşekkürler.. başlangıçtayım arkadaşlar dediğim gibi, C dilini üni de dersi geçmek için üstün körü görmüştüm, 1.5 aylık çalışmam var daha henüz. hem serdar çiçek in kitabını, hem youtube videoları hem proteus hem C hem breadboard a devre kurulumlarını hem entegrelerin datasheetlerini inceleme vs hepsini bi arada götürüyorum aksilik yok yazılım kısmı zaten zorlayıcı olanı...

sadogan

proteus dosyalarını yükleyebilirmisiniz ?

mustafa_cmbz

co2_ON_OFF_DURUM     = co2_ON_OFF_DURUM    ^ 1 

geçen şöyle birşeye ihtiyacım oldu örnek olması açısından faydalı olabilir.

sıcaklık nem ve co2 ölçen bir sistemim var co2 sensörünü kullanmak istemediğim zaman kapatmam gerekliydi bunuda şöyle yaptım.

CO2_ON_OFF durum isimli bir byte tanımladım ve buna açılışta 1 verdim kapatmak istediğim zaman ilgili satırda gelip yukarıdaki gibi 1 ile xor işlemine tabi tuttum.kısacası butona bastıkça bu satıra gelip ilgili bytı 1 ile xor yaptığım için sırası ile 1 ise 0  0 ise 1 oluyor. yani toggle yapıyorum.mevcuttaki durumu neyse tersine çeviriyorum..

Sonra okuma rutini içinde bu byte ı ıf ile şartlandırıyorum 1 ise sensörü oku 0 ise sensörü okuma gibi...


Sende aynı döngü içinde böyle birşey yapabilirsin.hatta döngü içinde butona basıldığında ilgili byte ı 0 yapıp gosub gibi bir komutla başka bir yere dallanıp bu byte ı devamlı kontrol ederek 1 olduğunda geri dön diye bilirsin.Böylece sayac değişkenini bir yerlere yazmadan geri döndüğünde kaldığın değerden devam edersin.

Tabi bunları kurduğun dönüyü ve c bilmediğimi farz ederek değerlendir gerekirse programı tekrardan buna göre kurgula..



sadogan

Resim olarak deyil de proje dosyası olarak bir yere yüklerseniz.

serkan

burada xc8 için olanı yükledim.belki fikir verir.  https://www.dosyaupload.com/65a0

kudretuzuner

#12
Merhaba,
Breabordtaki bağlantınız resimdeki gibi ise eksiklik var.Şöyleki RE0-RE1-RE2 leri POZİTİFE çekildi mi diye kontrol ettiğinize göre basılmadığı süre içinde şaseye bağlı olması lazım.asm de BTSSS komutu ile kontrol edebilirsiniz.Benim önerim  RE0-RE1-RE2 leri programınızda giriş olarak ayarlayın (ki muhtemelen öyledir CCS C bilmiyorum) butonlarla pinlerin şaseye çekilip çekilmediklerini kontrol edin(zaten isis de dikkat ederseniz pinler sağlıklı çalışmayıp gri gözükmektedir)Böylece RE2 butonunun şaseye çekilip çekilmediğini kontrol ederek sonuca varırsınız.
KOD olarak

BUTON_3_KONTROL
BTFSC PORTE,2;****porte,2 şaseye çekildi mi? çekilmedi ise SAY'a atlar sayma devam eder şaseye çekildi ise GOTO BUTON_3_KONTROL komutuna atlar ;BUTON_3_KONTROL'a  gider döngü böyle devam eder.
GOTO_SAY;*********
CALL BEKLE;*********BUTON SPARKINI ENGELLEME İÇİN GECİKME
GOTO BUTON_3_KONTROL;******buton basılı ise tekrar yukarı döner ve BUTON_3_KONTROL dan porte,2 nin şasede olup olmadığını kontrol eder.
SAY
Bu kod parçacığı buton sürekli basılı olup olmadığını kontrol eder.Bıraktığınız anda SAY'a atlar ve seymaya devam eder.isiste deneyin problem olursa tekrar yazışalım.Kolay gelsin.
Amatör

M.Salim GÜLLÜCE

Alıntı yapılan: kudretuzuner - 22 Şubat 2019, 15:54:35Merhaba,
Breabordtaki bağlantınız resimdeki gibi ise eksiklik var.Şöyleki RE0-RE1-RE2 leri POZİTİFE çekildi mi diye kontrol ettiğinize göre basılmadığı süre içinde şaseye bağlı olması lazım.asm de BTSSS komutu ile kontrol edebilirsiniz.Benim önerim  RE0-RE1-RE2 leri programınızda giriş olarak ayarlayın (ki muhtemelen öyledir CCS C bilmiyorum) butonlarla pinlerin şaseye çekilip çekilmediklerini kontrol edin(zaten isis de dikkat ederseniz pinler sağlıklı çalışmayıp gri gözükmektedir)Böylece RE2 butonunun şaseye çekilip çekilmediğini kontrol ederek sonuca varırsınız.
KOD olarak

BUTON_3_KONTROL
BTFSC PORTE,2;****porte,2 şaseye çekildi mi? çekilmedi ise SAY'a atlar sayma devam eder şaseye çekildi ise GOTO BUTON_3_KONTROL komutuna atlar ;BUTON_3_KONTROL'a  gider döngü böyle devam eder.
GOTO_SAY;*********
CALL BEKLE;*********BUTON SPARKINI ENGELLEME İÇİN GECİKME
GOTO BUTON_3_KONTROL;******buton basılı ise tekrar yukarı döner ve BUTON_3_KONTROL dan porte,2 nin şasede olup olmadığını kontrol eder.
SAY
Bu kod parçacığı buton sürekli basılı olup olmadığını kontrol eder.Bıraktığınız anda SAY'a atlar ve seymaya devam eder.isiste deneyin problem olursa tekrar yazışalım.Kolay gelsin.
yani özet olarak buton giriş portlarında olması gereken pull-down dirençleriniz eksik.

sirhadim

evet ben isis'te pull down dirençlerini kullanmadım ama boardda 4.7k dirençlerim butonu basılmasdığı sürece e portunun üç pinini de 0 a çekiyor. ayrıca isiste dp pini de boşta ama boardda oarasıda pic e bağlı. o yüzden zaten dizimin elemanları ona göre tanımlandı

char dizi[]={63,6,91,79,102,109,125,7,127,111};
char dizi2[]={111,127,7,125,109,102,79,91,6,63};

boardda dirençler şaseye bağlı yani.. o iş tamam... ama acaba isis te dirençler bağlı değil diye böyle bir eksiklik isiste sorun teşkil eder mi? çünkü ben çalışmadı diye şuan sizlerden yardım istediğim kısım için yazdığım (ama çalışmayan) kodları programımdan sildim. dikkat ederseniz en üstteki amatör yazılımımda yardım talep ettiğim kısımlar için kod yok!

Üstatlarım amacım benim yazılımımı incelemeniz ve talep ettiğim kodu yazmam yönünde direk bana formülü söylemeniz.. bahsettiğiniz çoğu şeyi sadece sadece anlamaya çalışıyorum.

mesela ben de goto deyimini kullanmanın yazılımcılar tarafından uygun görülmediğini duyuyordum. ancak bu şekilde yazmadan dallandıramadım. mesela bi videoda hocamız

if(input(pin_e2)==1)
break;

yazıp döngüden direk çıkıp istediği if seçeneğine geliyordu. aynısını ben yazdım benimki yemedi. videoda int,char vs tarzında değişkenleri anlatan hocamız void main() içinde bunları tanıtabilirken ben void içinde tanıtınca derleyici error veriyordu bende bunları ön işlemci komutları kısmında ("#define" yazılan alanda) yazıyordum. burdaki kodlarımda da böyle yaptım. ben CCS C 4 versiyonu kullanıyorum o 5 i kullanıyordu. acaba derleyicinin eski sürümlerinde hata mı var? bunlar hep soru benim için.