pic basicte yardım

Başlatan cifci, 19 Temmuz 2006, 18:09:59

cifci

Arkadaşlar pic16f84 kullanarak giriş pinlerine öncelik vermeden aynı anda 6 tane girişin kontrolunu nasıl yapabilirim. Yani if döngüsü kullandıgımda yazdığım giriş sırasına göre işlem yapıyor ama benim istedigim kesme olayı gibi bişey ama pic16f84te kesme pini fazla olmadıgı için programla yapmam mumkunmu. Umarım ne istedigimi anlamıssınızdır yardım ederseniz sevinirim.(PortB nin 0,1,2,3,4,5 pinlerini kontrol edip PortA nın 0,1,2,3 pinlerine veri gonderecegim ama pinlerde oncelik olmayacak)
Lütfen yardım edin.  8O

ete

Bu işin koloya yolu bütün pinleri tek bir komutla kontrol etmektir.

Diyelimki bu 6 adet pine birer buton bağlı.
Pinler normalde pull-up durumunda olsun butona basılınca pin low'a çekilsin,
Normalde PORTB nin durumu hiç butona basılı değil iken şöyledir;
PortB=%xx111111 yani rakamsal karşılığı 1+2+4+8+16+32=63
Son iki biti işlem dışı bırakmak için önce;
B=PortB & %00111111 komutunu vermen gerekir.
Böylece B değişkeninde yalnızca butonların durumu kalacaktır.
Şayet B=63 ise hiç bir tuşa basılmadı veya girişlerden hiç biri low olmadı demektir.
Şimdi PortB.0 daki butona basıldığını düşünelim;
Bu durumda B,
B=%00111110=62 olacaktır.
Diyelimki 1. bite bağlı butona basılmış olsun;
B=%00111101=61 olacaktır.
Diyelimki 2. bite bağlı butona basılmış olsun;
B=%00111011 =59 olacaktır.
Diyelimki 3. bite bağlı butona basılı olsun;
B=%00110111=55 olacaktır.
Bu mantık ile aynı anda basılı olan butonları bile görebilir ve B değerini hesaplayabilirsin.
Diyelimki 2. ve 4. bitler low olmuş (veya bu butonlara basılmış) olsun;
B=%00101011=43 bulunacaktır.

Açıklamalarından anladığım sorunun bu idi ve uygun cevabı verdiğimi umuyorum. Gerisi sana kalmış.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

elektroombank

Ya

Selecet CASE kullanırsın.


yada PORTA yı komple okuyup.İşlem yaptırıp PORTB ye gönderisin.

PORT sayım az diyor isen;

74HC/LS vs kullanıp çoğullanabiliyor.Yada PIC15f877 kullanırsın

cifci

@ete

yardımınız icin cok teşekkür ederim demek istediginizi anladım ama benim asıl sorunum PortB yi okurken kullanmam gereken komutta. Ben asagıdaki gibi okutuyorum
basla:
if portb.0=1   then   goto    xxx
else
goto  yyy
if  portb.1=1   then    goto   zzz
else
goto   yyy
...
...
...
endif
endif
goto   basla
xxx:
.
.
yyy:
.
.

böyle yapınca program once 0. sonra 1.pini sonra 2 3 4 5 okuyup islem yapıyo ikisi aynı anda 1 olursa once olana gore islem yapıyo benim istedigim program calisirken oncelik vermeden calisması. 1. pin 1 olursa onu yapması 5.pin 1 olursa onun işlemini yapması yada ikiside aynı anda 1 olursa once olanın işlemlerini yapması. Programlamaya yeni başladım kurdugum mantık yanlıs olabilir bunlarıda duzeltirseniz sevinirim. Yardımınız icin tekrardan teşekkür ederim.

OG

Önceliksiz işlem diye birşey olamaz ki. Muhakkak hep bir öncelik vardır.Fakat çok hızlıdır.


yeni_b var byte
eski_b var byte

eski_b=PORTB&%00111111

oku:
 yeni_b=PORTB&%00111111

 if yeni_b<>eski_b then farkne
 eski_b=yeni_b
 goto oku

farkne:

'Burada değişen bitleri tespit eder ve gerekeni yaparsın.

 eski_b=yeni_b
goto oku
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

cifci

cok teşekkür ederim yardımınız icin yazdıgınız programı uygulayacagım. benim istedigim interrupt gibi bir olayı interrupt kullanmadan yapabilecegimmiydi ama sanırım bu mumkun değil