Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Microchip PIC => Konuyu başlatan: mehmett - 27 Haziran 2022, 14:21:49

Başlık: 3 Buton ve döngüler
Gönderen: mehmett - 27 Haziran 2022, 14:21:49
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
Başlık: Ynt: 3 Buton ve döngüler
Gönderen: sifirzero - 27 Haziran 2022, 15:30:18
Merhaba kardesim hangi dil ile yazmayi dusunuyorsun. Ccs c ile ise

sifirzero (https://www.sifirzero.com/)
 Bu web sitede mevcut.
Baskabdille yazacak ise if komutu ile islem yapabilirsin.
Başlık: Ynt: 3 Buton ve döngüler
Gönderen: mehmett - 27 Haziran 2022, 15:55:01
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;
      }   
Başlık: Ynt: 3 Buton ve döngüler
Gönderen: mehmett - 27 Haziran 2022, 16:51:27
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;
      }   
    } 
 }
   
Başlık: Ynt: 3 Buton ve döngüler
Gönderen: mehmet - 27 Haziran 2022, 17:19:32
Bir buton ile yaptığınız kodu paylaşın.
Diğerlerini burada düzenleyebiliriz.
Başlık: Ynt: 3 Buton ve döngüler
Gönderen: z - 27 Haziran 2022, 19:44:49
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
        {
          ....
        }
      }
 }



Başlık: Ynt: 3 Buton ve döngüler
Gönderen: mehmett - 27 Haziran 2022, 22:52:49
Teşekkür ederim herkese, elinize sağlık🙏