16F876A ile 9999 sayıcıda kesme sorunu

Başlatan enginkanat, 23 Aralık 2012, 18:57:38

enginkanat

Herkese iyi akşamlar.
16f876 ile 1-9999 sayıcı yapmaya çalıştım. ancak tmr0 kesmesini bir türlü oluşturamadım. Erol hocanın  sayıcısı iskeleti oluşturuyor. Devrede harici bir sinyal kaynağı var, opto coupler ile porta.0 a giriş olarak verdim bu sinyal yukarıya doğru sayacı arttırıyor.
ayrıca bir arttırma bir eksitme ve birde onay butonu var. arttırma butonu sayıcıda arttırma yapmıyor. onay butonuna bastığımızda kaç sinyalde bir arttırma yapılacağı giriş yapılıyor ancak bu bölü programda şu anda yok.
önceden de belirttiğim gibi Erol Hocamın programını iskelet olarak kullandım, ancak hocam 628 kullanmıştı farklı olarak ben 876 kullanıyorum. Benim hatam nerede yardımcı olursanız sevinirim.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.12.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ device pic16f876A                                               
@ device pic16f876A, wdt_on       
@ device pic16f876A, pwrt_on       
@ device pic16f876A, protect_off   
@ device pic16f876A, XT_OSC     
DEFINE OSC 4
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000
TRISA=%00001111
TRISB=%00000000
TRISC=%00000000
OPTION_REG=%00000100
INTCON=%00100000
CMCON=7
SYMBOL GIRIS=PORTA.0
SYMBOL YUKARI=PORTA.1
SYMBOL ASAGI=PORTA.2
SYMBOL OK=PORTA.3

SAYAC var WORD
HAFIZA VAR WORD
SIRA var BYTE
PRGSAY VAR BYTE
BIRLER var BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE
BINLER VAR BYTE
I VAR BYTE
SAYI VAR BYTE
X VAR BYTE
SYMBOL Disp0=PORTC.4
SYMBOL Disp1=PORTC.5
SYMBOL Disp2=PORTC.6
SYMBOL Disp3=PORTC.7
PAUSE 100
INTCON.7=1
TMR0=99
SAYAC=0
SAYI=0
PRGSAY=0
I=0
X=0
ON INTERRUPT GoTo KESME
BASLA:

IF ASAGI=0 then
GOSUB DELAY
SAYAC=SAYAC-1
IF SAYAC<=0 then SAYAC=0
while ASAGI=0:wend
ENDIF

IF GIRIS=0 THEN
SAYAC=SAYAC+1
IF SAYAC>9999 THEN SAYAC=0
WHILE GIRIS=0:WEND
ENDIF

IF OK=0 THEN
WHILE OK=0:WEND
GOSUB PRG_MENU
ENDIF

X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
X=SAYAC DIG 3 :GOSUB AL:BINLER=SAYI

GOTO BASLA

AL: LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,115,64],SAYI :RETURN

DELAY:
for I=0 to 35000
PAUSEUS 5
Next
RETURN

PRG_MENU:
HAFIZA=SAYAC
SAYAC=0
X=13:GOSUB AL:BINLER=SAYI
X=14:GOSUB AL:YUZLER=SAYI
ONLAR=SAYI:BIRLER=SAYAC

IF YUKARI=0 THEN
SAYAC=SAYAC+1
IF SAYAC>9 THEN SAYAC=9
WHILE YUKARI=0:WEND
ENDIF

IF ASAGI=0 THEN
SAYAC=SAYAC-1
IF SAYAC<1 THEN SAYAC=1
WHILE ASAGI=0:WEND
ENDIF

IF OK=0 THEN
WHILE OK=0:WEND
SAYAC=HAFIZA
HAFIZA=0
RETURN
ENDIF

DISABLE

KESME:
SIRA=SIRA+1:IF SIRA>3 then SIRA=0
IF SIRA=0 then
DISP3=0
PORTB=BIRLER
DISP0=1
ENDIF
IF SIRA=1 THEN
DISP0=0
PORTB=ONLAR
DISP1=1
ENDIF
IF SIRA=2 THEN
DISP1=0
PORTB=YUZLER
DISP2=1
ENDIF
IF SIRA=3 THEN
DISP2=0
PORTB=BINLER
DISP3=1
ENDIF
TMR0=99
INTCON.2=0
RESUME
ENABLE
END


enginkanat

adcon1=7 komutunu koymamışım. yeni farkettim. şu anda displayler aktif, tarama yapıyor ancak sadece 0000 rakamları görünüyor.

enginkanat

şimdi yeniden bir şey farkettim uln2004 için pull-up dirençleri koymam gerekiyormuş. benim bilgisayarım pentium 4 3,02 simülasyon bunun için mi bu kadar yavaş acaba, yoksa benim bölme değerlerimde mi sorun var? Sabaha kadar bu devreyi hazırlayıp patrona göstermem gerek. inşallah üstatlardan ayakta olan vardır.

ete

Bu gibi durumlarda isis simulasyon devresinide eklemek gerekir.
Bazen programa bakarsın bakarsın bir kusur göremezsin. Ancak deneme amaçlı çalıştırınca aksaklığı yerinde görür ve o zaman nereye bakman gerektiğine karar verir sorunu bulursun.
Bende baktım pek kusur göremedim. Ama neden çalışmadığı konusunda fikrim yok maalesef. Eksik olan şey ULN çıkışlarının Pullup dirençleri. Her ne hikmet ise İsis bunu istiyor. Gerçek devrenizde bu gerekli değildir.
Simulasyon devresini koyarsan bakarım.

Ete


enginkanat

İlginiz için teşekkür ederim. dosya EK'tedir

ete

Sistemi çalışıtırınca bazı kusurları gördüm.
Birinci kusur; A portuna bağlı tuşlar çalışmıyordu. Bunun sebebi, A portunda default olarak açılan Analog (ADC) özelliği kapatmamışsın. Bunu yapacak komut ADCON1=7 komutudur. Bu komut analog pinleri digital yapar.

İkinci kusur, Sayac değerini akran formatına çevirmek için ayrı bir alt program kullanman gerekir.
Yoksa sen butona basınca sayı değişir ama onubir müddet sonra görürsün. Halbuki SAYAC=SAYAC+1 den sonra
GOSUB YERLESTIR desen ve YERLESTIR isimli alt programda şunlar olsa
YERLESTIR:
        X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
        X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
        X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
        X=SAYAC DIG 3 :GOSUB AL:BINLER=SAYI
        return
sistemin daha güzel çalışacaktır.

Üçüncü Kusur, Kesme kısmında kullandığın ve programın başında isimlendirdiğin DISP0-DISP1..DISP3 lerin pinleri ters olmuş.
İsimlendirmeyi tamamen tersine çevir. Yani DISP0=PORTC.7 olacak. DISP3=PORTC.4 olacak.

Birde  kesme süresini 1-1,5 ms ye ye düşür bunun için OPTION_REG=%00000010 (1/8 bölme oranı) ver ve TMR0=69 değerini kullan. Böylece sistem display değişikliklerine daha hızlı cevap verir daha az titreme olur.

Ete



enginkanat

Söylediklerinizi aynen uyguladım. sistem daha güzel çalışıyor şu anda. Teşekkür ederim

Powered by EzPortal