YARDIM--- Buton Saydırma

Başlatan designer.21, 11 Kasım 2019, 23:03:23

designer.21

Merhabalar, yapmak istediğim bir program var ama nasıl yapmam gerektiği hakkında bir kaynak bulamadım. kendim deneme yanılma yolu ile yapmak istedim beceremedim maalesef. şöyle ki;

elimde, düğmesine basınca led'i 15 kez yanıp sönen bir cihaz var ve bu led çıkışını PORTA.0'a buton'a basıyormuşum gibi entegre edip çıkış alacam velhasıl kelam

misal PORTA.0'a 15 kez basınca PORTB.0 HIGH olsun

bu konuyla yardımcı olursanız çok sevinirim. şimdiden teşekürler

onurinci

hazır kod paylaşmak forum ilkelerine ter düşüyor,yöneticide kurallar çiğnensin istemiyor,fakat bir hoş geldin diyelim,size 10 basışta çıkışı aktif eden bir program veriyorum,15 adet gayretinide sizden bekleyelim..

designer.21

cevabınız için çok çok teşekkür ederim. benim kullandığım pic 16f84 olduğundan dolayı yazmış olduğunuz kodu bu pic'e uyarlamaya çalıştım fakat şöyle bir sorunla karşılaştım; mesela 10 basışta aktif edecek değeri girdiğimde bazen 10. basışta bazen 8 bazen de 9. basışta aktif oluyor. 30 yaptığımda da 20 ile 30 basış arasında aktif oluyor.
sizleri rahatsız etmemek adına 16f84'e uyarlamaya çalıştım uğraştım ama yapamadım. biliyorum ilerleyen zamanlarda böyle bir yardım istediğim için kendimden utanacağım ama şimdilik elimden bişey gelmiyor : )

ete

Buton saydırma konusundaki isteğini ve neler yapamayacağın konusundaki samimi itirafını dikkate alarak bu işi sana öğretmeye yada en azından öğreterek bir örnek vermeye karar verdim.

Öncelikle işlemcilerin çok hızlı çalıştıklarını ve ms'ler mertebesinde işlem yapabildiklerini açıklayarak işe başlayalım.
Bir buton saydırma işi yapacağımıza göre önce işlemci ardından bu işlemcide en uygun port pinini seçmemiz gerekiyor. İşlemciyi seçmişsin. En geri zekalı olanı maalesef. Taşdevrinde kaldı artık o işlemci almayın şunları dünyada bizden başka kullanan kalmadı. Her neyse Bu tür işlemcilerde PORTB giriş için düşünülmüş ama aynı zamanda çıkış işlemlerinde de kullanılabilen bir port olduğu için Buton giriş pini olarak PORTB.0 pinini seçiyorum. Led için ise PORTA.0 pinini seçiyorum.
Sen bunun tam aksini düşünmüşsün ama neden bunu seçtiğimi açıklayayım. Bir buton pininin çalışabilmesi yada butona basılıp bırakıldığını işlemcinin anlayabilmesi için pinin lojik konum değiştirmesi gerekir. Kısaca Pin LOW da bekletilir ve butona basınca pine HIGH gelir. Yada daha doğrusu (en doğrusu) Pin HIGH da bekletilir ve butona basılınca pine LOW verilir. En doğrusu bu diyorum çünki PORTB de entegre içinde yer alan ve programla aktif edilebilen pullup dirençleri vardır. Böylece o pine ayrıca direnç bağlaman gerekmez. Ama PORTA.0 pinine buton bağlarsan mutlaka birde Pullup direnci bağlaman gerekir. Pullup direnci diyorum Türkçesi yukarı çekme direnci demek oluyor.Burada yukarı kelimeside +5V tu anlatıyor. Aşağı terimi de GND ye eşdeğer oluyor. Bu terimleri iyi öğren sıklıkla karşılaşacaksın.

Şimdi PORTB.0 pinine Buton bağladım ve butonun diğer ucunu GND ye bağladım. Buton'a basınca GND PORTB.0 pinine aktarılacak.
PORTA.0 pinine de 220 Ohm seri akım sınırlama direnci üzerinden birled bağladım. Ledin diğer ucu GND ye bağlı.
Gelelim programlama kısmına,
Öncelikle TRISA=%00000000  değerini veriyoruz. Buradaki sıfırla o port pinlerinin çıkış olduğunu gösteriyor.
TRISB=%00000001  burada sonda yer alan 1 rakamı ise Bit0 yani PORTB.0 pininin giriş yapıldığını gösteriyor. Diğerleri Çıkış olarak çalışacak.
Buton pinine dahili Pullup uygulayacağımız için bunu aktif etmemiz gerekiyor. OPTION_REG.7=0 komutu bunu yapar.
Şimdi sıra Sembol tanımlamasında.
SYMBOL BUTON=PORTB.0   'bu komut buton isimli bir tanımlama yaptığımızı ve onunda PORTB.0 da bağlı olduğunu gösteriyor.
SYMBOL LED=PORTA.0   'bu komut da benzer şekilde LED isimli bir tanımlama yaptığımızı gösteriyor.
Birde SAYAC değişkeni tanımlayalımki bastığımız buton sayısını bu değişkende tutalım.
SAYAC VAR BYTE   'byte yani maksimum 255 değere kadar bir değişken işimizi görecektir.
Program ana kodlarına geçmeden birde açılış gecikmesi vermemiz gerekiyor. Buda en azından 150-200 ms olmalıdır. Bunun komutu PAUSE 200 şeklinde veriliyor.
Ardından BASLA :  şeklinde bir etiket ismi vererek işe başlıyoruz.
Butona basıldığında Buton pini LOW (sıfır) olacağı için,
IF BUTON=0 THEN şeklinde bir komutla başlıyoruz. Anlamı butona basılmış ise
   SAYAC=SAYAC+1       'Her basışta Sayac değerini bir artır
   IF SAYAC=10 THEN    'şayet 10 defa basmış isem
     Led=1             'Led'i yak burada led=1 demekle led pinine HIGH uygulamış oluyoruz.
     Pause 100         'Led in yandığını görebilmek için en az 100 ms gecikme gerekir. Ama zaten söndürmeyecek isek bir gecikme vermekde gerekmez.
   ENDIF
   WHILE BUTON=0:WEND   'hala butona basılı tutuyorsam bırakıncaya kadar bekle
   Pause 100            'buton titremesini (kontakların bir anda yüzlerce kez açılıp kapanması) algılamasın diye 100 ms gecikme koyuyoruz.
ENDIF 'deyip işi bitiriyoruz.
GOTO BASLA
hepsi bu kadar. Burada Tuşun bırkaıldığını test etmek çok önemlidir. Zira siz bırakıncaya kadar o onlarca sayı sayabilir. Sendeki olumsuzluğun sebebi budur.
Bu kodları uygularsan doğru çalıştığını göreceksin.
Tabiiki bu kod da ledin söndürülme alternatifi yok. Onuda sen kararlaştırıp ekle nasıl söndürecek isen. Bir başka pini giriş yapıp birde söndürme butonu ekleye bilirsin.
Umarım unuttuğum bir şey yoktur ama bu sistemin yada mantığın doğru çalışması gerekir.

Ete

     

designer.21

ete hocam zamanınızı ayırıp anlattığınız konular çok çok teşekkür ederim. çoğu kişiye sorup ta cevabını alamadığım konuları tek tek açıklamışsınız. yazdıklarınızın her satırı kıymetli benim için. akşam bilgisayara geçince tüm bunları tek tek deneyeceğim.

Kullandığım pic ile ilgili olarak ta üniversitede olsun pic ile ilgili eğitim kitaplarında olsun hep 16f84'ü gördüm hep onunla karşılaştım maalesef. başlangıç, eğitim, kendimi geliştirmek için hangi işlemciyi önerirsiniz, veya sadece bir işlemci modeli üzerine yoğunlaşarak hata mı ediyorum acaba.

ete

Başlangıçta tek işlemci ile çalışmak iyidir. Hiç olmaz ise 16F628A kullan onun iyisi 16F1827 dir.
Hatta daha da iyisi 16F1825 (14 bacaklıdır) var.
Bunları kullanmaya çalış. Yardımcı olurum özelliklerinde.


Ete

onurinci

elinde 16F84A var diye kodları o işlemciye uyarladım,böylece 8 pinli mikrolarda port değişikliğini kolaylıkla öğrenirsin diye..
istek foğrultusu PortA 0 giriş olsun PortB 0 çıkış olsun dedin V1 aynen dediğin gibi oldu,fakat PortA işlemci içinden PullUp dirençleri barındırmadığından,buttonun bir ucundan +5 volta 10Kohm gibi bir direç bağlaman gerekiyor.

V2'de bu direnç gereksinimi ortadan kaldırmak maksadıyla portları yer değiştirdim zira OPTION_REG.7= 0 dedikmi giriş olarak ayarlanmış portlara işlemcinin içindeki PullUp dirençlerini bağlıyor..

designer.21

cevaplarınız ayrı ayrı teşekkür ederim çok sağolun. devreyi yapmakla beraber yeni bilgiler de öğrenmiş oldum. tekrardan teşekkür ederim.

ete hocam işlemci ile ilgili olarak elimde 16f628A da var. sizin de tavsiyeniz ile bundan böyle bu işlemci üzerinde uğraşacağım. bu işlemci ile ilgili bilmem gerekenler ile ilgili olarak başlangıç seviyesindeki biri için kısa bir bilgilendirme yapabilirseniz çok sevinirim.

ete

BU işi yapacak isen öncek-likle data sheet incelemeyi bileceksin. Lisan bilmeye gerek yok.
İşlemci Data sheetlerininbaşında ne gibi özellikler olduğunu açıklıyorlar. Index'e bakınca Analog to Digital yani analog bilginin digitale dönüştürülmesi, varsa Digital to Analog yani digital bilgiden analog bilgi elde edilmesi, Capacitive Touch yani kapasitif dokunma, Comparator yani karşılaştırıcı , PWMyani pals width Modulasyon , Capture puls yakalama, USART veya Eusart yani seri Port gibi özellikleri olup olmadığını görebiliyorsun demektir.
16F628 de Comparatör, USART ve HPWM (Tek kanal donanımsal PWM) özellikleri mevcut. ADC özelliği yok. Dahili osilatörü var ayrıca kristal bağlamadan çalışabilir. Hepsi bu kadar.
Açılışta komparatörler aktif açılır. Dolayısıyla iptal etmek gerekir komutu CMCON=7 dir.
Dahii OSC seçimi sigorta ayarlarında yapılır. Standart sigorta ayarı aşağıdaki şekilde yapılabilir.
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
bu ayar ile dahili (4Mhz) osc seçilmiş olur. MCLR pini iptaldir. Giriş pini olarak kullanılabilir. Oraya direnç de bağlamak gerekmez.

Ete

designer.21

teşekkür ederim ete hocam. başlangıç için faydalı olabilecek bilgiler. daha önce de dediğim gibi bir çok yerde sorup ta cevabını alamadığım konular bu forumda aydınlığa kavuştu. artık biliyorum ki takılacağım yerde (tabiki uğraşıp çabalayıp yapamadağım zamanlar : ) artık yalnız değilim.
artık ne zaman olur bilemem ama vakti zamanı geldiğinde ben de burada sorulacak sorunlara çözüm olabilmek için can atıyorum.

designer.21

eskileri yad ederken zamanında yaptığım paylaşımımı gördüm de hemen 2 dakka şu kodları yazayım dedim : )
bu vesileyle, benim gibi öğrenmek isteyenlere yardımcı olan yardımını esirgemeyen herkese tekrardan teşekkürlerimi sunuyorum

bu ilerleme sizler için küçük ama benim için çok olmasa da büyük bir adım : )


LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_BODEN_OFF &_PWRTE_ON &_MCLRE_OFF &_WDT_OFF &_LVP_OFF &_CP_OFF
CBLOCK 0X20
SAYI, SAYAC1, SAYAC2
ENDC

ORG 0X00
CLRF        PORTB
BSF        STATUS,5
CLRF        TRISB
MOVLW        0XFF
MOVWF        TRISA
BCF        STATUS,5
MOVLW        0X07
MOVWF        CMCON

MOVLW        D'0'
MOVWF        SAYI

BUTON
    BTFSC    PORTA,0
    GOTO    BUTON
            
        BUTON_GECIKME1
            MOVLW        0XFF
            MOVWF        SAYAC1
        BUTON_GECIKME2
            MOVLW        0XFF
            MOVWF        SAYAC2
        BUTON_GECIKME3
            DECFSZ        SAYAC2,F
            GOTO        BUTON_GECIKME3
            DECFSZ        SAYAC1,F
            GOTO        BUTON_GECIKME2
    
    INCF        SAYI,F
    MOVLW        D'15'
    SUBWF        SAYI,W
    BTFSS        STATUS,Z
    GOTO        BUTON
    BSF        PORTB,0
DONGU
    GOTO        DONGU
    END

Powered by EzPortal