3 Buton ve döngüler

Başlatan mehmett, 27 Haziran 2022, 14:21:49

mehmett

Merhaba
Muhtemelen basit bir çözümü vardır ama bulamadım yardımcı olur musunuz. Herhangi bir pic işlemciyi mplab ile programlarken üç buton olduğunu düşünelim, birinci butona basıldığında bir döngüye girmesini, ikinci butona basıldığında ikinci bir döngüye girmesini, üçüncü butona basıldığında da tüm döngülerden çıkmasını programda nasıl sağlarız.
Teşekkürler

sifirzero

Merhaba kardesim hangi dil ile yazmayi dusunuyorsun. Ccs c ile ise

sifirzero
 Bu web sitede mevcut.
Baskabdille yazacak ise if komutu ile islem yapabilirsin.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

mehmett

mplab xc8 ile yazıyorum. program döngüsünü oturtamadım açıkçası. ilk butona basıldığında bir döngü içine girmişken ikinci butona basıldığının sorgusunu nasıl yaptırabiliriz.
aşağıdaki kodda RA0 1 olduğunda döngüye giriyor ama mesela RA1'in durumunu sorgulayıp döngüden çıkmıyor. İç içe sorgu koyduğumda da eğer "delay" kısmındaysa algılamıyor.

if (RA0==1)
      {
	 i=1;
	 while (i==1)
	 {
	 RB1=0;
	 __delay_ms(500);
	 RB0=1;
	 __delay_ms (500);
	 }
      }
   
      if (RA1==1)
      {   
	 RB0=0;
	 RB1=1;
      }
      
      if (RA2==1)
      {   
	 RB0=0;
	 RB1=0;
      }   

mehmett

interrupt ile aşağıdaki gibi çözüldü.

long i , b, c, d;
void interrupt  ISR(void)
{   
    if(RB4==1) { b=1; i=0; c=0;}
    if(RB5==1) { c=1; i=0; b=0;}
  RBIF=0;
}

void main(void)
 {
   TRISB=0xFF;
   TRISA=0;
   PORTB=0;
   PORTA=0;
    
  OPTION_REG |= 0b00000000;
  INTCON |= 0b10011000;
   
   while (1)
   {
      if (RB1==1)
      {
	 RA1=0;
	 i=1;
	 while (i==1)
	 {
	 RA0=1;
	 __delay_ms(100);
	 RA0=0;
	 __delay_ms (100);
	 }
      }
   
      if (b==1)
      {   
	 RA0=0;
	 RA1=1;
      }
      
      if (c==1)
      {   
	 RA0=0;
	 RA1=0;
      }   
    }  
 }
   

mehmet

Bir buton ile yaptığınız kodu paylaşın.
Diğerlerini burada düzenleyebiliriz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

z

Portun sifirinci, birinci ve ikinci bitlerine ait pinlerden GND'ye buton bagladigini, butonlari da 4K7 gibi birer direncle Vdd ye bagladigini varsayalim.

Portu okuyup 0x7 ile AND yapalim. Boylece ilk 3 bitin disindaki bitlerin etkisinden kurtulmus olursun.

Bu durumda;

Sadece 1. butona basarsan binary olarak 110 (Decimal 6)
Sadece 2. butona basarsan binary olarak 101 (Decimal 5)
Sadece 3. butona basarsan binary olarak 011 (Decimal 3) bilgileri elde edilir.

Birden fazla butona basarsan ayni sekilde 0..7 araliginda diger veriler de elde edilir.
Gerekiyorsa bu durumlara ozel fonksiyonlar yazabilirsin.

while (1)
 {
    OkunanPort=ReadPort() & 7 ; // ReadPort yerine sen kendi I/O erisim komutunu yazacaksin.

    if (OkunanPort==6)
      {
        while (OkunanPort & 4)  // 1. dongu
        {
          ....
        }
      }

    if (OkunanPort==5)
      {
        while (OkunanPort & 4)  // 2. dongu
        {
          ....
        }
      }
 }



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mehmett

Teşekkür ederim herkese, elinize sağlık🙏