16F877A ile giriş okuma

Başlatan Erdem , 28 Eylül 2012, 21:47:23

Erdem

16F877A'nın RA1 ucunda bir düğme var. Normalde RA1 yüksek oluyor.
        5V
        |
        R1
RA1 ____|
        |
         \ S1
        |
       _|_
        -

R1=1K S1= bas çek düğme

Düğmeye basınca D1 ucunda bulunan ledi yakmasını istiyorum. Asıl yapmak istediğim düğmeye her basışta program içindeki bir değişkeni arttırmasını sağlamak.

Şu şekilde bir kod yazdım ama bunu yapmanın doğru yolu bu mu emin olamadım.

#include <pic.h>
#include "secenek.h"

int main()
{
    /* PORT D'yi çıkış, PORTA'yı giriş yap */
    TRISD = 0;
    TRISA = 0xff;

    /* AN0 analog AN1 dijital */
    ADCON1 = 0x8e;

    /* PORTD'nin uçlarını 0 yap */
    PORTD = 0;

    for (; {
        /* RA1 düşük ise */
        if (RA1 == 0) {
            /* PORTD'nin 1 numaralı ucundaki ledi yak */
            if (RD1 == 0) {
                RD1 = 1;
            } else {
                RD1 = 0;
            }
             __delay_ms(250);
        }


    }
}

ayhan_eee

Bu nun içib RB kesmelerini kullanman daha doğru olacaktır.
Birde burada sıkıntı olur.Sanırım pull-up kullanımı yaptın.Ama sen elini basılı tuttuğun sürece içeri girecektir.bunun için elini butondan çekinceye kadar döngüde kalmasını sağlamalısın bence.
while(!RA0); komutu ile buton basılı olduğu sürece burada kalmasını sağlayabilirsin.
Ama dediğim gibi bu iş için sanki kesme daha uygun

mcan

Arttırdıgın degısken hangısı ö bıde for dongusu bana eksık gozukuyor parantezı kapatılmamısç

Erdem

Evet bende sanki kesme falan bir şeyler hatırlıyorum ama Hitech C ile internette doğru düzgün kaynak bulamadım. Prof. Dr. Doğan İbrahim hocanın kitaplarından almayı düşünüyordum ama onun da yayınevinde baskısı bitmiş sanırım.

Döngüyü while döngüsü kullanacak şekilde değiştirdikten ve biraz kısalttıktan sonra şöyle oldu:

    for (; {
        /* RA1 düşük ise */
        while (RA1 == 0) {

            /* özel veya ile sıfırsa bir, birse 0 yap */
            RD1 ^= 1;

            __delay_ms(250);
        }
    }


Şu an düşündüğüm gibi çalışıyor gibi. Düğmeye bir kere basınca yanıyor, ikinci kez basınca sönüyor. Sürekli basılı tutunca da yanıp sönüyor. Ama asıl program üzerinde denemedim henüz.

Örneğin sıcaklığı ölçüyoruz. Kullanıcının istediği en düşük sıcaklık sınırını belirleyebilecek. Asıl yapmak istediğim buzdolapları, fırınlar gibi düğmeye basılınca arttıracak bir süre daha basılınca hızlı hızlı artmaya başlayacak.

sseedat

bu şekilde led yakıp söndürebilirsin.

#include <htc.h>
#include <delay.c>


main(void)
{

          TRISA=0x01;
          ADCON1=0x07;
		  TRISB=0;
		  PORTB=0;


     	for(;;)
 {       
	     	if(RA0 & 0x01)
	     	{
	     		RB0=1;
	     		while(RA0);
	     	}
	     	else RB0=0;
	     	
}
}

Görünmez bir mezarlıktır Zaman...

Erdem

Alıntı yapılan: mcan - 28 Eylül 2012, 22:16:16
Arttırdıgın degısken hangısı ö bıde for dongusu bana eksık gozukuyor parantezı kapatılmamısç

Sanırım forumun kod bölümünde bir problem var. Örneğin for (; ; ) { gibi bir ifadeyi göz kırpan adama çeviriyor. Sonra da siliyor anladığım kadarıyla.

    for (; ;) {

Değişken herhangi bir değişken olabilir. Örneğin düşük sıcaklığı gösteren int türü bir değişken.

@ sseedat: Teşekkürler.