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
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.
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;
}
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;
}
}
}
Bir buton ile yaptığınız kodu paylaşın.
Diğerlerini burada düzenleyebiliriz.
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
{
....
}
}
}
Teşekkür ederim herkese, elinize sağlık🙏