Arkadaşlar herkese iyi günler
pic 16f877 ile butonlu 0-99 ileri geri sayıcı yapmaya çalıştım. Artırma işleminde sıkıntı yok ama eksiltmeye gelince istemediğim sonuçlar meydana geliyor.
resim eklemeye çalışacam ama ekleyemezsem yardım etmek isteyenlere mail de atabilirim. ayrıca programı aşağıya yazıyorum
TRISD=%00000111
TRISB=%00000000
TRISC=%00000000
P1 VAR WORD
P2 VAR WORD
K VAR WORD
L VAR WORD
ART VAR PORTD.0
EKS VAR PORTD.1
RES VAR PORTD.2
P1=200
P2=1000
L=0
K=0
PORTB=0
PORTC=0
BASLA:
PORTB=K
PORTC=L
PAUSE P1
RESET:
IF RES=0 THEN
K=0
L=0
ENDIF
ARTTIR:
IF ART=0 THEN
WHILE ART=0
WEND
L=L+1
IF L>9 THEN
L=0
K=K+1
ENDIF
ENDIF
EKSILT:
IF EKS=0 THEN
WHILE EKS=0
WEND
L=L-1
IF L=0 AND EKS=0 THEN
L=9
K=K-1
ENDIF
ENDIF
GOTO BASLA
END
ayrıca 2 ayrı display kullandım birini B portundan , diğerini C portundan ayrı ayrı 4511 entegreleriyle sürdüm Resmi yüklemeye çalıştım eğer olmadıysa linkleri var bakmak isteyenlere
(http://[url=http://bit.ly/c25MCx%5D%5Bimg%5Dhttp://c1202.hizliresim.com/u/n/2w0jw.jpg)[/url][/img]
(http://c1202.hizliresim.com/u/n/2w0jw.jpg) (http://bit.ly/c25MCx)
Öncelikle kullandığın buton kontrol mantığını çok da doğru olduğunu söyleyemiyeceğim.
Kullandığın değişkenleri neden WORD tipinde seçtin ? buda anlamsız. Mademki 0-99 sayacı yapıyorsun o halde değişkenlerin Byte cisniden olmalı. Önce bunların tipini değiştirmeni öneririm.
Tuş kontrollerinide aşağıdaki şekilde yaparsan daha uygun olur;
ARTTIR:
IF ART=0 THEN
L=L+1
IF L>9 THEN
L=0
K=K+1
ENDIF
WHILE ART=0:WEND
pause 50
ENDI
EKSILT:
IF EKS=0 THEN
L=L-1
IF L=255 then
L=9
K=K-1
ENDIF
WHILE EKS=0:WEND
pause 50
ENDIF
Görünüşe göre tuşlar Pullup lı çalışmaktadır. Bunların her birine 10K lık birer pullup direnci bağlaman gerekiyor. Yok ise hemen bağlamalısın.
Ayrıca programda ne sigorta ayarı ne register ayarı hiç bir şey gözükmüyor.
A portu ile ilgili bir ayarlamada yapılmamış. Bu port default olarak Analog açılır. Şayet gerekli önlemleri almaz isen programın bile doğru çalışmayabilir.
Programın başına en azından ADCON1=7 komutunu koyman gerekiyor. Şayet kullandığın 16F877A ise birde CMCON=7 komutunuda ilave etmen gerekir.
Ete
Hocam ilginize çok teşekkür ederim.
Dediklerinizi yaptım ve sonuç olumlu. Değişken tanımımda mı sıkıntı vardı ?. Halbuki sıkıntı olmasın diye WORD kullanmıştım. Ayrıca sigorta ayarlarının herzaman kullanılan yani default olan komutları nelerdir? Bi de a portunun ayarlamaları demişsiniz onu anlamadım ::(((
Önce sigorta ayarlarını verelim;
@ DEVICE pic16F877A 'işlemci 16F877a
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_ON
@ DEVICE pic16F877A, BOD_ON
@ DEVICE pic16F877A, XT_OSC
Define OSC 4
En altta yer alan Define komutunuda ihmal etme bu sistemin kaç MHz de çalıştığını gösterir. Bütün zamanlama komutlarıda bu komuta pararlel doğru çalışırlar.
16F877 de A portu ADC girişlerine ayrılmıştır. Buna E portu da dahildir. Hiç bir komut vermez isen bu portların pinleri Analog çalışırlar.
Her hangi bir analog dan digital e çevirim işin yok ise portları digital yapman gerekir. Bunu yapan komut;
ADCON1=7 komutudur.
877 nin birde A tipi vardır. 16F877A için bir ilave özellik daha avrdır buda A portunun Komparatör olarak çalışmasıdır. Bu da default olarak önce komparatör olarak çalışır. Komparatörü iptal ederseniz ki bunun komutu CMCON=7 şeklinde verilir. A portu bu sefer analog'a döner. Onuda iptal etmek için yine ADCON1=7 komutunu vermen gerekir.
Programın başına bu komutları koyup sonra TRISA ve TRISE registerlerinede uygun değerleri vermen gerekiyor. Hepsi çıkışise sıfır giriş olan pinler için "1" kullanman gerekir. Sende bu portlar kullanılmıyor. Bu durumda TRISA=0 ve TRISE=0 komutlarını vermen yeterlidir.
Her programın başlangıcına açılış gecikmesi verilemsi gerekir. Bu işlemci registerlerinin yerli yerine oturuması için gerekli süredir. Minimum 150 ms maksimum 300 ms dolayında verilebilir. Bunuda programına Basla satırından evvel eklersen hiçde fena olmaz.
Ete
Hocam verdiğiniz bilgiler için çok teşekkür ederim
bundan sonraki programlarda kesinlikle kullanacağım