Pic16f877a yardım

vözvölö

Üye
Katılım
4 Şub 2010
Mesajlar
53
Puanları
1
Yaş
43
merhaba arkadaşlar pic proglamlamadan hiç anlamıyorum desem yeridir, öğrenmeye çalışıyorum. şimdi bir program yazdım, programın butona her basışımda i değişkenini bir artırsın, i değişkeni 10a eşit yada büyük olduğunda birinci led 15e eşit yada büyük olduğunda iki led birden yansın istiyorum. programı aşşağıdaki şekilde yazdım ve isiste çalıştırdığım zaman birinci problem butona basılı tutarsam bi süre sonra ledler yanıyor, ikinci problem butona basarken sayıyorum benim eşitliğini istediğim rakamlar tutmuyor, mesela bazen 5 kere basınca led yanıyor, bazen 20 kere basıyorum öyle yanıyor, şimdi problem programda mı isis te mi bende mi?
#include <buton.h>
#include <16F877A>
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#bit LED1 = PORTB.0
#bit LED2 = PORTB.1
#bit BUTON = PORTA.0
int i=0;
void main()
{
TRISA=0x01;
PORTA=0X00;
TRISB=0x00; //portb cikis olark yönlendiriliyor
PORTB=0X00; //tum b pinleri sıfırlanıyor
for(;;)
{
if(BUTON) //butona her basıldığında int bir artacak komutu bir türlü bulamadım
i++;
delay_ms(100);
{
if (i>=10)
LED1=1;
delay_ms(10);
if (i>=15) led2=1;
delay_ms(10);
}

}
setup_adc_ports(NO_ANALOGS);

}
 
sen butona 1 kere bastığını sanıyorsun ancak mikrodenetleyicin çok hızlı olduğu için sen butona 10 kere basmışsın sanıyor. yükselen kenar veya düşen kenar kullanman gerekiyor. yoksa sen basılı tuttukça i artmaya devam ediyor.
 
dış kesmelere bakabilirsin. pic dış kesme diye aratırsan bir şeyler çıkabilir.
ya da ödevi gösterirken butona çok hızlı basıp hemen elini çekmen de çözüm olabilir. :D
 
if(buton) parantezinin en son satırında
while(input(buton));
yazarsan butona bir daha basmayana kadar döngü tamamlanamayacağı için kendiliğinden artmayacaktır. Her basışta ister anlık sürsün ister bi kaç sn, basılı kaldığı sürece bir kez işlem yapar.
 
if(buton) parantezinin en son satırında
while(input(buton));
yazarsan butona bir daha basmayana kadar döngü tamamlanamayacağı için kendiliğinden artmayacaktır. Her basışta ister anlık sürsün ister bi kaç sn, basılı kaldığı sürece bir kez işlem yapar.

kardeş yazdığın komutu değil if parantezinin sonuna koymak, programda koymadığım yer kalmadı ama maalesef sonuç hep aynı..
 
Butonlu mikrodenetleyici uygulamalarında butonu sorgulattıktan sonra ardına gecikme koymalısın. Butona bir kez basıldığında yeterli gecikme yoksa mikrodenetleyicinin komut satırı çok hızlı işlendiğinden dolayı bir kaç kez butona basılmış gibi algılayabilir. (Bu da butonun mekaniksel yapısından kaynaklanır. Buton kontakları kapanırken sayıcıyı attıracak elektriksel tetiklemeler gelebilir arktan dolayı.)

Buton sorgulamalarının hemen ardına gecikme koyarak denedin mi hiç? Mesela 250 ms gibi..?
 
if(buton) parantezinin en son satırında
while(input(buton));
yazarsan butona bir daha basmayana kadar döngü tamamlanamayacağı için kendiliğinden artmayacaktır. Her basışta ister anlık sürsün ister bi kaç sn, basılı kaldığı sürece bir kez işlem yapar.

kardeş değil parantezin sonu komutu koymadığım yer kalmadı, her tarafta denedim, ama sonuç değişmedi..
 
gecikme 10ms den fazla olduğu zaman da bu sefer sayma işlemi hata veriyor. mesela 10 kere basınca yanması gerekirken 15 kere basınca yanıyor.
 
if(BUTON) //butona her basıldığında int bir artacak komutu bir türlü bulamadım
i++;
delay_ms(100);

Yazdığın kodların bu kısmında delay_ms(100) komutunu araya koyarak denesene bir. Senin yazdığın gecikme sayaçtan sonra. Butonu okuduktan sonra gecikmeyi konup deneyiver bi. Buton okuma ile sayaç arasında olsun. Yani şu şekilde:

if(BUTON) //butona her basıldığında int bir artacak komutu bir türlü bulamadım
delay_ms(100);
i++;

Eğer olmazsa akşama eve dönünce ben de uğraşayım bakalım bu kodlarla bi. Şu an iş yerimde olduğumdan dolayı deneyemiyorum.
 
Son düzenleme:

Forum istatistikleri

Konular
129,840
Mesajlar
930,680
Kullanıcılar
452,678
Son üye
TengRi

Yeni konular

Çevrimiçi üyeler

Geri
Üst