877 ile buton kontrolu yapamadım arkadaslar bi yrdm ednn

Başlatan bahdiyarusta, 19 Şubat 2013, 23:26:53

bahdiyarusta

porta ya bağlı 3 tane butondan hangsine basarsam portb de ona karsılık gelen led yanık kalsın istiyorum ama ... isiste çalıstıramadın ledler devamlı yanıyorç...
<<<***bahdiyarusta****>>>
                  - 66 -

MS_59

bunu bi dene bakalım

TRISA=%11111111
TRISB=%00000000
PORTB=0
PORTA=0
SYMBOL TUS1=PORTA.0
SYMBOL TUS2=PORTA.1
SYMBOL TUS3=PORTA.2
ADCON1=7

BASLA:
    IF  TUS1=0 THEN PORTB=%00000001
    IF  TUS2=0 THEN PORTB=%00000010
    IF  TUS3=0 THEN PORTB=%00000100
    GOTO BASLA   
    END
mehmet

bahdiyarusta

<<<***bahdiyarusta****>>>
                  - 66 -

bahdiyarusta

sizin verdğiniz kodları çoğaltıp daha fazla buton eklameye çalıştım ama ... olmuyor o sekıl bakar mısnız bi
<<<***bahdiyarusta****>>>
                  - 66 -

bahdiyarusta

 6 tus kabul edıyor ama ben 16 tus 16 led istiyorum ... programda 6 dan sonrası sıkıntı veryır anlaymadın neden ??
<<<***bahdiyarusta****>>>
                  - 66 -

İlyas KAYA

Sayın bahtiyar ;

PortA nın zaten 6 bitini kullanmışsınız daha fazla A portu ile yapamazsınız.

Diğer portlarda bile 8 bit yani 8 buton bağlayabilirsiniz.

Her buton için ayrı port olmak zorunda değil ise tarama yöntemi ile tuşları bağlamalı yada encoder/decoder kullanarak portları çoğullamalısınız.

Devrenizin tam amacını söylerseniz yardımcı olmaya çalışalım.

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

bahdiyarusta

devremin tam amacı 16 farklı buton ile çıkıştaki 16 farklı röleyi sürerek. kontrol yamak istrorum .... çok fazla program bılgım yok onun oçın ıcın en basıtıne kaçtım ...
<<<***bahdiyarusta****>>>
                  - 66 -

BİDİL

16 adet led veya roleyi B ve D portlarını kullanarak zaten yapabiliyorsun tek sorun 16 adet butonu a portundan çalıştırmak. Zannediyorum şu şekilde yapabilirsin;

1. Butonu porta.0 a bağa
IF PORTA.0=1 THEN HIGH LED1

2. Butonu porta.1 e bağa
IF PORTA.1=1 THEN HIGH LED2

3. Butonu porta.2 ye bağa
IF PORTA.2=1 THEN HIGH LED3

4. Butonu porta.3 e bağa
IF PORTA.3=1 THEN HIGH LED4

5. Butonu porta.4 e bağa
IF PORTA.4=1 THEN HIGH LED5

6. Butonu porta.5 e bağa
IF PORTA.5=1 THEN HIGH LED6

7. Butonu porta.6 ya bağa       **********16F877 de böyle bir pin varmı acaba? Baktınızmı hiç??????????? (ETE)
IF PORTA.6=1 THEN HIGH LED7

8. Butonu porta.7 ye bağa       **********16F877 de böyle bir pin varmı acaba? Baktınızmı hiç??????????? (ETE)
IF PORTA.7=1 THEN HIGH LED8

9. Butonu porta.0 ve porta.1 e aynı anda bağla
IF (PORTA.0=1)AND(PORTA.1=1) THEN  HIGH LED9

10. Butonu porta.1 ve porta.2 ye aynı anda bağla
IF (PORTA.1=1)AND(PORTA.2=1) THEN  HIGH LED10

11. Butonu porta.2 ve porta.3 e aynı anda bağla
IF (PORTA.2=1)AND(PORTA.3=1) THEN  HIGH LED11

12. Butonu porta.3 ve porta.4 e aynı anda bağla
IF (PORTA.3=1)AND(PORTA.4=1) THEN  HIGH LED12

13. Butonu porta.4 ve porta.5 e aynı anda bağla
IF (PORTA.4=1)AND(PORTA.5=1) THEN  HIGH LED13

14. Butonu porta.5 ve porta.6 ya aynı anda bağla
IF (PORTA.5=1)AND(PORTA.6=1) THEN  HIGH LED14

15. Butonu porta.6 ve porta.7 ye aynı anda bağla
IF (PORTA.6=1)AND(PORTA.7=1) THEN  HIGH LED15

16. Butonu porta.7 ve porta.0 a aynı anda bağla
IF (PORTA.7=1)AND(PORTA.0=1) THEN  HIGH LED16

Biraz fazla kastık ama çalışacağından eminim.


pwm.c

#8
16 Buton için 32 adet pin kullanmaya gerek yok.
böylesi daha pratik olur:


devrenin dosyaları:
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

onurinci

aradığım bir proje idi önce sevindim sonra buruldum. :-\ elektriği kesip verdiğimizde baştan başlıyor.

aynı posizyonu koruyabilse idi pek havalı olurdu..

pwm.c

Alıntı yapılan: onurinci - 21 Şubat 2013, 00:54:09
aradığım bir proje idi önce sevindim sonra buruldum. :-\ elektriği kesip verdiğimizde baştan başlıyor.

aynı posizyonu koruyabilse idi pek havalı olurdu..

eeprom hafızaya yazarak yapabilirim ama sağlıklı olmaz çünkü eeproma sürekli veri yazmak ömrünü kısaltır. onun için hafıza tutucu pil kullan daha iyi olur yada enerji kesintisini algılayıp o anda eeproma kaydet.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

BİDİL


ete

16 adet buton'u toplam 5 adet pin kullanarak kontrol edebilirsiniz.
Bunun için gerekenleri aşağıdaki şemada gösterdim.
Şemaya bakarsanız, 4067 nin ABCD girişlerini işlemciye gireceksiniz ve 0 - 15 arası adres vererek tarayacaksınız.
4067 nin X bacağı yani çıkış pullup lı olarak beklemektedir. Bu çıkışı bir giriş pinine bağladıktan sonra her adres değişiminde bu pini LOW olmuş mu diye kontrol edeceksiniz.  Adres değeri;
%0000 iken X=0 olmuş ise 0 nolu butona basılmıştır.
%0001 iken X=0 olmuş ise 1 nolu butona basılmıştır.
%0010 iken X=0 olmuş ise 2 nolu butona basılmıştır
%0011 iken X=0 olmuş ise 3 nolu butona basılmıştır
...
%1111 iken x=0 olmuş ise 15 nolu butona basılmıştır şeklinde tespit yapabilirsiniz.
Ete


Mucit23

Alıntı yapılan: pwm.c - 21 Şubat 2013, 00:45:40
16 Buton için 32 adet pin kullanmaya gerek yok.
böylesi daha pratik olur:


devrenin dosyaları:

@pwm.c,

Burada nasıl bir mantık kullanıyorsun?

Butona basıldığı süre röle devrede olur. O sırada işlemcinin pini çıkış ve 0 konumunda olursa işlemcinin portu yanar, Aynı anda hem butondan bilgi alıp, röleye bilgi vermek imkansız. Yada röleye dokunmadan butonları okumak mümkün değil

Anlayamadım meseleyi  ???
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

pwm.c

Alıntı yapılan: Mucit23 - 21 Şubat 2013, 12:17:39
@pwm.c,

Burada nasıl bir mantık kullanıyorsun?

Butona basıldığı süre röle devrede olur. O sırada işlemcinin pini çıkış ve 0 konumunda olursa işlemcinin portu yanar, Aynı anda hem butondan bilgi alıp, röleye bilgi vermek imkansız. Yada röleye dokunmadan butonları okumak mümkün değil

Anlayamadım meseleyi  ???

Mucit arkadaşım, sen PBP biliyorsun zaten.  şimdi yazdığım kodları tek tek inceleyerek olayı kavrayalım.

öncelikle bütün portları giriş olarak ayarlıyoruz.
TRISA=%11111111             
TRISB=%11111111
TRISC=%11111111
TRISD=%11111111             
TRISE=%11111111


buradaki TRIS registeri 1 olunca giriş, 0 olunca çıkış olmuyor mu? evet.
ozaman ilk başta giriş olarak ayarladığım PORTB yi okursam pull-down dirençlerinden dolayı hepsi 0 olur. peki bunun tersini alıp TRISB registerine yazarsam
TRISB=~PORTB

PORTB nin hepsi 0 idi ve ~ operatörü ile bitleri tersledim yani ASM deki COMF komutu gibi işler.
o halde TRIS registerine tüm bitleri 1 olarak yazar yani yine giriş olarak kalır.

peki butonlardan birine basılınca ne  olur?
o butonun değerini 1 olarak alır ve TRIS registerine tersini taşıdığında o pin çıkış olur. PORTB de zaten 1 değeri vardı üzerine tekrar 1 değerini yazarsak değişen bişey olur mu?
PORTB=~TRISB


butona basılı tutsan bile çıkıştan 1 aldığın için ve butonda +5v a bağlı olduğundan dolayı kısadevre olmayacaktır.

gördüğün gibi portlardan lojik 0 çıkaramıyorsun. okunan değerin tersi alındığı için 0 değeri 1 olur ve orası giriş portuna dönüşür.
şimdi meseleyi anlatabildim mi?

Daha sonra ne yapıyoruz?
önce PORTB nin son konumunu yedekliyoruz.
PRTB=~TRISB

sonrasında 100ms bir zaman bekliyorum. bu süre içinde butonlardan başka birine basılmış ise PORTB de sayı değişikliği olacaktır. ozaman PORTB nin yeni konumu ile yedeklediğim eski konumunu karşılaştırıyorum.
IF PORTB<>PRTB THEN
TRISB=255
TRISC=255
ENDIF

bu ikisi birbirine eşit değilse tüm portları tekrar giriş yapıp döngüyü başa alıyorum.

evet biraz kaşık bir mesele ve bende açıklarken zorlandım.
bu sistem ile tüm portları aynı anda okuyup kaydedebiliyorsun ve çok sayıda pin tasarrufu sağlıyorsun. tek dez avantajı var oda butona basılma anında çok kısa süreliğine 2 röle aynı anda çalışabilir. belki buna donanılmsal ve yazılımsal birtakım önlemler alınabilinir ve devrenin türüne göre bunlar değişiklik gösterir. o kısımada biraz kafa yormak gerekiyor. örneğin rölenin çekme ve bırakma sürelerinden faydalanabilirsin yada donanımsal gecikme eklersin.

_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Powered by EzPortal