avatar_ete

SAYAC (0-9999), 7SEGMENT

Başlatan ete, 23 Şubat 2016, 10:23:11

ete

Projeler arasında 7 segment çalışan bir sayac projesi olduğunu sanıyordum ama yokmuş.
İlişikte koyduğum projede 0-9999 arası sayabilen bir sayac sistemi mevcut. 7 segment ve kesme ile tarama yönetimi ile çalışmaktadır.

Ete

enginkanat

Herkese iyi akşamlar. PORTB ile UDN2981 tetikleyerek sayıları, PORTA.0, PORTA.1 ve PORTA.2 ile ULN2803 tetikleyerek segmentleri çalıştırdım. PORTA.7 ve PORTA.6 yı giriş olarak ayarlayarak dışarıdan pull-up dirençleri kullanarak ( + ), ( - ) sayma yaptırdım evde gayet güzel çalışıyordu. iş yerine götürüp bağladığımda ise zaman zaman ileri zaman zaman kendi kendine geri saydığını farkettim. 12 volt switchmode adaptör ile 7805 kullanarak pic beslemesini yaptım. filitre için 100 n kondansatör ekledim, buton uçlarına da 100 n kondansatör bağladım

segmentleri 12 volt ile sürüyorum. TRIS ayarlarında sadece PORTA.6 ve PORTA.7 giriş diğerleri çıkış. Kullanılmayan pinleri boşta bıraktım. program ve şema yanımda olmadığından şu an sunamıyorum. Bir arkadaşım tüm pinlere kondansatör bağlamamı, giriş pinlerine ise buton ile paralel bağlı diyot ve kondansatör bağlamamı sağlık verdi. bana bu konuda fikir verecek herkese şimdiden teşekkür ederim

ete

#2
Ortada kontrol edecek bir şey olmadığına göre bize yalnızca tahminde bulunmak düşüyor. Sistemin çalışmasında bir sorun yok ama sayac bazen ileri bazen geri sayıyor ise buton pinlerinde sorun olsa gerek. Dışarıdan pullup yaptığına göre pulluplar doğru çalışmıyor olsa gerek. Yada pullup lar bölgesinde bir soğuk lehim veya benzeri temassızlık söz konusu. Pullup dirençleri değerini bir kademe düşür mesela 10k bağlamış isen 4k7 yap onları. Bağlantılarınıda iyice kontrol et. En önemli kontrol boşta beklerken buton pinlerinde high (+5v ) varmı kontrol et. Var ise sorun olmaması gerekir. Yinede sorun var ise programa bakmak gerekiyor.
Kondansatör bağlama senin sorununu çözmez. Zaten 7 segment pinlerine bir şey bağlaman yersiz ve gereksiz. Buton pinlerine bağlayabilirsin ancak oda butona basılınca bir tıkta birden fazla sayma yaptırıyor ise gereklidir. Bu debouncing denilen sorundur türkçesi tuş titremesi yada bir anda yüzlerce kez o tuş kontaklarının birleşip açılması anlamına gelirki senin sorunun zaten boşta kendi kendine meydana geliyor.
Sonuçta pullup dirençleri ve bağlantılarını kontrol etmen gerekiyor.

Şema olmadığından emin olamadığım bir konu kafama takıldı. Segmentleri portA ya bağladın sanırım. Peki portA.5 de buna dahilmidir? Bu Mclr bacağıdır ve yalnızca giriş olabiliyor. Belki bilmiyorsun diye söyledim. Şayet bu şekilde kullandın ise sistemin doğru çalışması mümkün değil bence. Bu konuyada bir açıklık getirirsen iyi olacak.

Ete

enginkanat

Hocam 3 segment kullandım ve bunları A.0 A.1 A.2 ye bağladım PORTA.5 ve PORTA.4 ile daha önce hiç tecrübem olmadığı için TRISA=%11001000 olarak ayarlayarak çıkış yaptım. PORTA.3 butonu sıfırlamak için PORTA.6 ve PORTA.7 butonları +,- olarak kullandım. bütün girişleri harici pull-up ile gerçekleştirdim yani CMCON=7

Adaptörüm 12 volt 1 amper tüm segmentler açılsa bile 0,58A akım çekeceğini hesapladım. Sigorta ayarlarını Brenner8 yükleyici ile kullandığım için USB Burn programından yapıyorum. Bu akşam mesai çıkışı önerinizi değerlendirerek 4K7 ile deneyeceğim.

ete

#4
Adına 7 segment demişler. Neden biliyormusun? Bütün rakamlar ancak 7 adet segment ile gösterilebiliyor. Sen 3 segment ile nasıl rakam gösteriyorsun anlamış değilim.
.
Ete

enginkanat

3 adet 7 segment 0-999 ortak katot portb segment çıkışları ra.0, ra.1, ra.2 display çıkışları. benim tanımlamam da hata var hocam.
'****************************************************************
'*  Name    : sayıcı.BAS                                      *
'*  Author  : [Kanat]                    *
'*  Notice  : Copyright (c) 2016 Kanat *
'*          : All Rights Reserved                               *
'*  Date    : 14.08.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

PORTA=0:TRISA=%11001000
PORTB=0:TRISB=%00000000
CMCON=7
OPTION_REG=%00000100   
INTCON=%00100000       
'—————————————————————–

'—————————————————————–
DEFINE OSC 4
'————————————————————————-
SAYAC    var WORD
SAYAC_TEMP  VAR     WORD
SIRA    var BYTE 
SINYAL      VAR     BYTE
SINYAL_TEMP VAR     BYTE
BIRLER  var BYTE 
ONLAR    VAR BYTE 
YUZLER      VAR BYTE

I        VAR BYTE
SAYI    VAR BYTE
X        VAR BYTE
Y           VAR     BYTE
DEGER       VAR     BIT
YER         VAR     BIT
READ 0, SAYAC.LOWBYTE
READ 1, SAYAC.HIGHBYTE
READ 2, SINYAL
IF SINYAL>5 THEN SINYAL=1
YER=0
DEGER=0
SINYAL_TEMP=0

SYMBOL Disp0=PORTA.2
SYMBOL Disp1=PORTA.1     
SYMBOL Disp2=PORTA.0
SYMBOL GIRIS=PORTA.3 'GERIYE SAYMA BUTONU
SYMBOL TUS_2=PORTA.7

PAUSE 100
INTCON.7=1
TMR0=150
ON INTERRUPT GoTo KESME

BASLA:

IF GIRIS=0 then
    FOR Y=0 TO 150:NEXT
    SINYAL_TEMP=SINYAL_TEMP+1
        IF SINYAL_TEMP=SINYAL THEN
            SAYAC=SAYAC+1
            IF SAYAC=999 THEN SAYAC=0
            WRITE 0, SAYAC.LOWBYTE
            WRITE 1, SAYAC.HIGHBYTE
            SINYAL_TEMP=0
        ENDIF
    WHILE GIRIS=0
    WEND
    YER=0
    GOTO SEC
ENDIF
IF TUS_1=0 AND YER=0 THEN
    FOR Y=0 TO 150:NEXT
    I=0
    WHILE TUS_1=0
        I=I+1
        PAUSE 5
        IF I=250 THEN
            SAYAC=0
            WRITE 0, SAYAC.LOWBYTE
            WRITE 1, SAYAC.HIGHBYTE
            SINYAL_TEMP=0
            I=0
            YER=1
            GOTO SEC
        ENDIF
    WEND
    SAYAC=SAYAC-1
    WRITE 0, SAYAC.LOWBYTE
    WRITE 1, SAYAC.HIGHBYTE
    SINYAL_TEMP=SINYAL_TEMP-1
    IF SINYAL_TEMP>5 THEN SINYAL_TEMP=0
    YER=0
   
GOTO SEC       
ENDIF
IF TUS_2=0 AND DEGER=0 THEN
    FOR Y=0 TO 150:NEXT
    WHILE TUS_2=0
    WEND
    DEGER=1
   
AA:
    X=11:GOSUB AL:YUZLER=SAYI
    X=12:GOSUB AL:ONLAR=SAYI
    X=SINYAL:GOSUB AL:BIRLER=SAYI
    IF TUS_1=0 THEN
        FOR Y=0 TO 150:NEXT
        SINYAL=SINYAL+1
        IF SINYAL>5 THEN SINYAL=1
        WHILE TUS_1=0
        WEND
       
        IF TUS_2=0 AND DEGER=1 THEN
            FOR Y=0 TO 150:NEXT
            SAYAC_TEMP=SAYAC_TEMP+1
            DEGER=0
            WRITE 2, SINYAL
            GOTO SEC
        ENDIF
    ENDIF
IF TUS_2=0 AND DEGER=1 THEN
    FOR Y=0 TO 150:NEXT
    WHILE TUS_2=0
    WEND
    WRITE 2, SINYAL
    SAYAC_TEMP=SAYAC_TEMP+1
    DEGER=0
    GOTO SEC
ENDIF
GOTO AA   

ENDIF

SEC:
IF SAYAC=SAYAC_TEMP THEN GOTO BASLA
X=SAYAC DIG 0 :GOSUB  AL:BIRLER=SAYI
X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
IF X=0 AND SAYAC<10 THEN ONLAR=0
X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
IF X=0 AND SAYAC<100 THEN YUZLER=0
'X=SAYAC DIG 3 :GOSUB AL:BINLER=SAYI
SAYAC_TEMP=SAYAC

'PAUSE 500
GOTO BASLA

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


DISABLE
KESME:

SIRA=SIRA+1:IF SIRA>3 then SIRA=0

IF SIRA=0 then
DISP2=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



TMR0=150         
INTCON.2=0
RESUME
ENABLE

END

ete

Her zaman derim ya şema her şeyi açıklar diye. Olmayınca ve kullanılan terimler yanlış olunca mesajlardan yanlış anlam çıkartıyoruz burada olduğu gibi. Displaylerin ortak katod uçlarını A portuna bağlamışsın ben ise 3 adet segment bağladığını sanmıştım.
Programda bir hata göremedim. Sen yinede devrene bak en iyisi.
Ete

enginkanat

İlgi ve alakanız için teşekkür ederim. ben isis kullanamıyorum linux kullanıcısı olduğum için pcb leridel delikli perliktans üzerinde gerçekleştiriyorum. karalama defterim var orada birkaç çizim yaparak devreyi oluşturuyorum. o sebeple şemam yok. microcode studio wine diye bir programımız var orada çalışıyor fakat sigorta ayarlarını yapamıyoruz derlerken. onuda programı yüklerken hallediyorum vs. vs. eve geldim birazdan 10K ları söküp 4K7 ile değiştireceğim

Elektronikprojem

Kolay gelsin hocam linkler kırık gözüküyor . Acaba bende mi sorun var yoksa linklerde mi anlayamadım

ete

Link kırık değil yüklüyor.
Ete

Elektronikprojem

#10
Hocam günaydın,
Ben bu projeyi saat ve sayıcı bir olarak gerçeğe aktardım. 3 adet yaptım. Yaptıklarımdan 1 tanesinin fotoğrafını da ekliyorum.
Bir sorum olacak. Sayma işlemi sırasında sayının 10 ve katları olması durumunda eeproma kayıt yapma şansımız var mı?

ete

Var elbette,
IF SAYAC//10=0 THEN GOSUB YAZDIR
şeklinde olur Bu  bir MOD alma işlemidir. SAYAC değişken değerini 10'a böler ve kalanı hesaplar. Kalan sıfır ise o sayı 10 un katıdır demektir.  Ama sayac aynı yerde durduğu zaman sürekli kayıt yapmasınıda engllemen gerekir. Bunun için ,
kayıt yaptıktan sonra ESKI=SAYAC dersin. Yenisine bakarken;
IF SAYAC//10=0 and ESKI!=SAYAC THEN YAZDIR şeklinde bir komut kullanırsın.
Burada kalan sıfır ise ve eski sayac değerine eşit değil ise git yazdır işlemi uygulanır.

Ete

Elektronikprojem

yani şu şekilde mi olacak hocam.

BASLA:
if sayi//10=0 and eski!=sayi then
gosub kayit
endif
eski=sayi

ete

ESKI=SAYAC  komutunu kayıt kısmında vermen daha doğru olur. Anlamı en son kayıt edilmiş değer dir. Sonradan sayac değeri değişmiş ise yenisi benzer şekilde kayıt edilir değer değişmemiş ise hiç bir zaman ikinci kayıt alınmamış olur.
Ete

Elektronikprojem

Çok teşekkür ederim hocam

Powered by EzPortal