12 Buton kullanımı

Başlatan blueboard, 03 Eylül 2022, 09:36:46

blueboard

Ete Hocam, 12 buton ile 12 çıkış elde etmek istiyorum. 12 butondan hangisine basılırsa mikrodenetleyicinin belirlenen pininin çıkış vermesini istiyorum. Pin sayısının uygun olması bakımından 16F883'ü tercih ettim. Kodları yazdım. Ancak sebebinin bilmediğim bir durumdan itibaren 16F883'ün A4 ve A5 pinleri hiç butona basılmadığı halde anlamsız olarak dönüşümlü olarak çıkış veriyor. Dosyaları ekliyorum. Size zahmet hatamı bulabilir misiniz.
'**********************  Tanımlama Blokları ******************

@ DEVICE PIC16F883
@ DEVICE PIC16F883, WRT_OFF
@ DEVICE PIC16F883, BOR21V
@ DEVICE PIC16F883, LVP_OFF
@ DEVICE PIC16F883, FCMEN_ON
@ DEVICE PIC16F883, IESO_OFF
@ DEVICE PIC16F883, BOD_OFF
@ DEVICE PIC16F883, CPD_ON
@ DEVICE PIC16F883, PROTECT_ON
@ DEVICE PIC16F883, MCLR_OFF
@ DEVICE PIC16F883, PWRT_ON
@ DEVICE PIC16F883, WDT_ON  
@ DEVICE PIC16F883, INTRC_OSC_NOCLKOUT

PCON=%00000000
DEFINE OSC  8
OSCCON=%01111110 'dahili osc 8Mhz e ayarlandı
      
        

option_reg=1        'PORTB Pulluplar iptal
                    '(Pullup=Portb' nin tüm uçlarını +5V a çekmektir.lojik 1)

TRISB=%11111111        'PORTB  tamamı giriş olarak ayarlandı
PORTB=%11111111
TRISA=%00001111    ' porta a0-a3 giriş diğerleri çıkış
porta=%00001111
TRISC=%00000000    'PORTC Tüm uçlar çıkış olarak ayarlandı
portc=%00000000            'PORTC yi 0 yap

ADCON1.7=1  '%10000100 'AN0 , AN1 ve AN3 analog diğerleri digital oldu.
ANSEL= 3 'A portu analog pinler iptal
ANSELH=0  'B portu Analog pinler iptal
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal
WPUB=0  

SYMBOL BUTON0=PORTB.0
SYMBOL BUTON1=PORTB.1
SYMBOL BUTON2=PORTB.2
SYMBOL BUTON3=PORTB.3
SYMBOL BUTON4=PORTB.4
SYMBOL BUTON5=PORTB.5
SYMBOL BUTON6=PORTB.6
SYMBOL BUTON7=PORTB.7
SYMBOL BUTON8=PORTa.0
SYMBOL BUTON9=PORTa.1
SYMBOL BUTON10=PORTa.2
SYMBOL BUTON11=PORTa.3

anadongu:


IF BUTON0=0 then  portc.0=1 : pause 1000: portc=0
IF BUTON1=0 then  portc.1=1 : pause 1000: portc=0
IF BUTON2=0 then  portc.2=1 : pause 1000: portc=0
IF BUTON3=0 then  portc.3=1 : pause 1000: portc=0
IF BUTON4=0 then  portc.4=1 : pause 1000: portc=0
IF BUTON5=0 then  portc.5=1 : pause 1000: portc=0
IF BUTON6=0 then  portc.6=1 : pause 1000: portc=0
IF BUTON7=0 then  portc.7=1 : pause 1000: portc=0
IF BUTON8=0 then  porta.4=1 : pause 1000: porta.4=0
IF BUTON9=0 then  porta.5=1 : pause 1000: porta.5=0
IF BUTON10=0 then  porta.6=1 : pause 1000: porta.6=0
IF BUTON11=0 then  porta.7=1 : pause 1000: porta.7=0 

goto anadongu



end 

ete

Önemli hatalardan bir tanesi ANSEL registerine değer vermiş olma. ANSEL=3 verince PORTA nın ilk 3 pini Analog oluyor ve normal input output işlemlerinde kullanılamaz hale geliyor idi.
ANADONGU etiketinden önce mutlaka 300ms kadar bir açılış gecikmesi verilmesi gerekir.
Bu gecikme işlemci dahili registerlerinin ayarlanması için gereklidir ve her programda olması gerekir.

Ben olsam PORTB nin dahili pullup dirençlerinide aktive eder o pinlere bağlı pullup dirençlerini kaldırırdım.

Butonların kontrolünü yapmak için farklı bir yöntem kullandım. Bakarsın beğenirsen kullanırsın. Beğenmez isen senin kodlarda çalışıyor tekrar onlara dönersin.

Ete

blueboard


parametre

#3
Sayın ete cep tellerle bakıyoruz her zaman bilgisayar yanında olamayabılıyoruz programı kullanamıyoruz semaları resım olarak kodlarda tagla yazılsa fena olmaz boyle durumda yeni kişiler ogrenemiyor fikir vereceklerde sadece bakmak zorunda kalabilmektedir saygılar

mehmet

İşinize yarar umarım:
https://www.mehmetbilgi.net.tr/pic16f877a-ile-16-buton-16-led/

Debounce 10mS. Gerekirse uzatılabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

parametre

#5
Alıntı yapılan: mehmet - 03 Eylül 2022, 23:57:12İşinize yarar umarım:
https://www.mehmetbilgi.net.tr/pic16f877a-ile-16-buton-16-led/

Debounce 10mS. Gerekirse uzatılabilir.
Semayı goremedım yanlısmı baktım  kodlar ıyı guzel olmuş Tsk ederım

onurinci

Mehmet'in izni olmadan gıcık PortA.4'dü PortE.2 ile değiştirdim, simulasyon dosyası ektedir..

mehmet

#7
Alıntı yapılan: onurinci - 04 Eylül 2022, 12:08:45Mehmet'in izni olmadan gıcık PortA.4'dü PortE.2 ile değiştirdim, simulasyon dosyası ektedir..
İşinize yaradıysa sorun yok. Neyi isterseniz
değiştirin.  8)

Şema çizmedim. Port tanımlamalarından bakarak
düzenleyebilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Kod kısmını dahada kısaltmak mümkün. Aşağıdaki kod da güzel çalışabiliyor.

Ete

'@ DEVICE PIC16F883
'@ DEVICE PIC16F883, WRT_OFF
'@ DEVICE PIC16F883, BOR21V
'@ DEVICE PIC16F883, LVP_OFF
'@ DEVICE PIC16F883, FCMEN_ON
'@ DEVICE PIC16F883, IESO_OFF
'@ DEVICE PIC16F883, BOD_OFF
'@ DEVICE PIC16F883, CPD_ON
'@ DEVICE PIC16F883, PROTECT_ON
'@ DEVICE PIC16F883, MCLR_OFF
'@ DEVICE PIC16F883, PWRT_ON
'@ DEVICE PIC16F883, WDT_ON  
'@ DEVICE PIC16F883, INTRC_OSC_NOCLKOUT
#CONFIG 
 __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
 __config _CONFIG2,_WRT_OFF & _BOR21V
#ENDCONFIG

PCON=%00000000
DEFINE OSC 8
OSCCON=%01110000 'dahili osc 8Mhz e ayarlandı
             
option_reg=1        'PORTB Pulluplar iptal                    '(Pullup=Portb' nin tüm uçlarını +5V a çekmektir.lojik 1)

TRISB=%11111111         'PORTB  tamamı giriş olarak ayarlandı
PORTB=0
TRISA=%00001111    ' porta a0-a3 giriş diğerleri çıkış
porta=0
TRISC=%00000000     'PORTC Tüm uçlar çıkış olarak ayarlandı
portc=%00000000            'PORTC yi 0 yap

'ADCON1.7=1  '%10000100 'AN0 , AN1 ve AN3 analog diğerleri digital oldu.
ANSEL= 0 'A portu analog pinler iptal
ANSELH=0  'B portu Analog pinler iptal
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal

WPUB=0   

TUSB VAR BYTE 56
TUSA VAR BYTE 57


PORTA=0
PORTC=0
pause 300

ANADONGU:
         TUSB=PORTB
         PORTC=255-PORTB
         
         TUSA=PORTA & (%00001111)
         PORTA=(15-TUSA)<<4

         GOTO ANADONGU

alisumer

her butona ayrı direnç değerleri ile voltaj bölücü yaparak biraz basit hesaplama ile tek bir ADC kanal kullanarak birsürü giriş yapıp ayrı ayrı çıkış alınabilir bacak sıkıntısı varsa çok işe yarar
Hep meraktan

parametre

#10
Burada adc 12 buton kontrolu verılmış ornek amacıyla koydum
https://etepic.com/index.php/topic,1610.msg16679.html#msg16679

Powered by EzPortal