7-SEGMENTE ÇEVRİM

Başlatan Veli B., 28 Aralık 2003, 17:20:14

Veli B.

Merhaba arkadaşlar,
4 gündür siteye erişemiyordum, artık daral gelmişti.Kendimi yalnız

kalmış gibi hissetmeye başlamıştım. :cry:
 Şuan bir saat devresi üzerinde çalışıyorum.16f84 ve 74HC595 li, 6 dijitli (hh:mm:ss)bir saat ama bir sorunum var.Saat değerlerini 7 segmente göre

çevirmek ciddi bir problemim oldu.Birkaç yöntem geliştirdim ama çok yer kaplıyor ve aksamalara sebep oluyor.
Bu konuda bilgisi veya önerisi olan arkadaşlar var ise çok memnun

olacağım.
Şimdiden teşekkürler.

cnt

4.17.7. DIG

DIG returns the value of a decimal digit. Simply tell it the digit number
(0 - 4 with 0 being the

rightmost digit) you would like the value of, and voila.

B0 = 123 ‘ Set B0 to 123
B1 = B0 DIG 1 ‘ Sets B1 to 2 (digit 1 of 123)

Veli B.

Sevgili Cnt,
Hata bende, sanırım ben tam olarak anlatamadım.
3 basamaklı bir sayıyı, 3 parçaya ayırmak değil

istediğim.
farzedelimki saat 13:00 olsun.
saatin birinci dijitini (1x:xx)ayırdım ve 595 e göndermek istiyorum.Değişkendeki formatı ne olursa olsun(bin,hex,dec),  gönderirsem doğal olarak

7segmentte a segmenti ışık verecek, halbuki b segmentinin de yanması gerekli.
En içten teşekkürler... :)

Veli B.

Hadi arkadaşlar aklınızdan  birşeyler geçmiyor mu? Tam 26 kişi bakıyor ama sadece cnt  öneride bulunuyor.

Saçma gibi gelse de denemek istiyorum, siz söyleyin ben dinlerim.
İki gündür sıyırmama az kaldı.
Kurtarın bu Allah'ın kulunuuuuu. :?
Help me!!!

derwish

Re : katana
Bunun icin table yontemi kullanılır...
hatta table yonteminden baska bir yontem bilmiyorum

ben..
ama bu yontem cok kısa ve kullanıslı bir yontemdir..

595 in cikislerinin her birinin bir segment e denk geldigini ve displayinin ortak katotlu olduugunu varsayara

konusuyorum..
eger ortak anotlu display kullanıyorsan(ki ben olsam oyle yapardım) tabloyu degistirmen gerekir..

once displayde 0,1,2,3,4... rakamlarının gozukmesi icin hangi hex

sayıları gondermen gerektigini belirliyorsun.
ornegin 0 icin a,b,c,d,e,f  segmentleri 1 g segment 0 olmalıdır.
                       1111 1100 ==>FCh sayısı 0 ın karsılıgıdır.
1 icin sadece

b,c 1 olacak digerleri 0
                       0110 0000 ==> 60h sayısı 1 in karsılıgıdır..

bu sekşilde hepsini hazırlayıp elindeki sayı 5 ise onun tablodan karsılıgını bulup o sayıyı

gondereceksin.
en son 595 ini latch sinyalini de gonderirisen hicbir titreme olmadan cıktı alırsın..

gerci 6-7 display icin 164 te kullansan olurdu...

PIC assemblysinden fazla

anlamadıgımdan kod veremiyorum...
umarım anlatabilmisimdir..

DerWish.

cnt

dostum dig komutuyla böldükten sonra mesela sayiyi bir degiskene (ornekte x) yükle
daha sonra
SELECT CASE

x
CASE 0
segment = %01111110
CASE 1
segment = %00110000
CASE 2
segment = %01101101
....
....
....
....
CASE 9
segment =

%011111011
END SELECT
ve segmenti degiskenini cikis portuna gonder.

bu arada segment degiskeninin icerigi 0abcdefg şeklinde.

Veli B.

teşekkürler dostlar,
ilk denediğim yöntem kendi kendini takip ettirmekti ama çok yer kaplayacağı için

vazgeçtim.
Daha sonra dt yi denedim ama içime sinmedi, sana msg yazarken de başka bir yöntem üzerinde çalışıyordum ve tamamdır. Harika oldu.
Tabloyu binary olarak hazırlayıp

programlama aşamasında e2 ye gömdüm.
daha sonra dijitleri ayırıp adres counter olarak yine kendisini kullandım ve çok kısa ve hoşuma giden bir sonuç çıktı ;)
       ...
       G1A

VAR BYTE
       G1B VAR BYTE
       G2A VAR BYTE
       G2B VAR BYTE
       G3A VAR BYTE
       G3B VAR BYTE
       D1 VAR BYTE
       

D2 VAR BYTE
       D3 VAR BYTE
       D4 VAR BYTE
       D5 VAR BYTE
       D6 VAR BYTE        
       GUNCELLE VAR BIT
       I VAR BYTE
     

 WRITE 0,%00111111
       WRITE 1,%00000110
       WRITE 2,%01011011    
       WRITE 3,%01001111
       WRITE 4,%01100110
       WRITE

5,%01101101
       WRITE 6,%01111101
       WRITE 7,%00000111
       WRITE 8,%01111111
       WRITE 9,%01101111
       .
       .
       .
       

DECIMAL:
     
       G1A=SANI DIG 1
       G1B=SANI DIG 0
       G2A=DAKI DIG 1
       G2B=DAKI DIG 0
       G3A=SAAT DIG 1
       

G3B=SAAT DIG 0
       READ G1A, G1A
       READ G1B, G1B
       READ G2A, G2A
       READ G2B, G2B
       READ G3A, G3A
       READ G3B, G3B  


      .
      .
      .
       
    SHIFTOUT DPIN, CPIN, 1, [G1B,G1A,G2B,G2A,G3B,G3A]
    PULSOUT YAZ, 10
   
   
    GOTO

ANADONGU
    .
    .
    .

    gibi.

    Bir arkadaşım daha öncesinde yazdırıp tasarlattığı bir iş içindi.
    Halı sahalar için bir scoreboard+time devresi

idi.
   Pek çok yere dağıtmış ve devreyi değiştiremiyor.O yüzden devreye göre program yazıyorum.Ben olsam bu tarz da yapmazdım ama ne yaparsın hatır işte.
  Şimdi RB0 ile ilgili bir

sorunum var, onunla boğuşuyorum. :twisted:
RBPU dan pullup düşmüyor kafayı şimdi buna bozdum.
 Yardımınız için teşekkür ederim...

Veli B.

Bir kaç güne kadar gruba upload edeceğim.
önerilerinizi beklerim  :) ( eleştrilerinizide) :evil:
sevgiler...

fsan

selam, gercekten ilginc bir konu
belki asagdaki sema ve pbp kodlarindan yararlanarak  74HC595 ile bir uygulama

yapabiliriz.

'*********************************************

*******************
'*  Name    : 7-seg UP_DN_Counter.BAS                           *                                                

*
'****************************************************************
@ device  xt_osc, wdt_off, pwrt_on, protect_off

'***** Seven Seg code 'depending on how each seg is hooked 

to the port 

Zero con %11000000 'abcdef 
One con %11111001 'bc 
Two con %10100100 'abdeg 
Three con %10110000 'abcdg 
Four con %10011001 'bcfg 


Five con %10010010 'acdfg 
Six con %10000010 'acdefg 
Seven con %11111000 'abc 
Eight con %10000000 'abcdefg 
Nine con %10011000 'abcfg 

X 

var byte 
Counter var word 
PBup var porta.0 
PBdn var porta.4 

DoOnce var bit 

Trisa=%10001 
Trisb=%00000000 
porta = 0
portb = 

0
DoOnce = 0
Counter = 880

Main: 
   For X = 0 to 2 '***number of digits 'three in this case 
      '***code to do something, must not pause for anything 


      '***or the display will look jerky 
      If (PBup = 1) and (DoOnce = 0) then 
         DoOnce = 1 
         Counter = Counter + 1 
      else 
        

 If (PBdn = 1) and (DoOnce = 0) then 
            DoOnce = 1 
            Counter = Counter - 1 
         endif
      Endif 

      If (PBup = 0) 

and (PBdn = 0) and (DoOnce = 1) then DoOnce = 0
      
      Lookup (Counter dig 

(X)),[Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine],Portb 
      '***drive for all segments 
      Lookup X,[2,4,8],Porta 
      '***drive 

for common anode connection, 
      '***Porta.1 for display 1, Porta.2 for display 2, Porta.3 for display 3 
      pause 10
      Next X    
Goto Main 

End

http://home.no/fsan/projects/Diverse/7-seg

UP_DN_Counter/

Veli B.

Benim şu an yazdığım kodlar aşağıda, Henüz detayına inmedim ama sorunsuz simüle edebiliyorum.595 mdf siiçin üstat

XNHCX ' in verdiğiği dosyayıaldım.2 taneden fazla kullanılırsa bazı ayarlar yapılması gerekiyor en azından bende böyle oldu.
sevgiler... :D

isis ve pbp olarak gruba aktarıyorum

ama henüz bitmedi.Bitirmeden önerileriniz olursa sevinirim. :o
'***********************************************
       INCLUDE "modedefs.bas"
'KESME KORUMA

TANIMLARI

     
@       DEVICE WDT_OFF

'BUTON TANIMLAMALARI              
      DPIN VAR PORTA.0
      CPIN VAR PORTA.1
     

YAZ VAR PORTA.2      
      ZIL VAR   PORTA.3
      RENK VAR PORTA.4
'YAZMAC TANIMLAMALARI
       TRISA =0
       PORTA=0
       SAAT

VAR BYTE
       DAKI VAR BYTE        
       SANI VAR BYTE        
       SKES VAR BYTE
       MACDAKI VAR BYTE
       ASCORE VAR BYTE
       

BSCORE VAR BYTE
       G1A VAR BYTE
       G1B VAR BYTE
       G2A VAR BYTE
       G2B VAR BYTE
       G3A VAR BYTE
       G3B VAR

BYTE
       A1 VAR BYTE
       A2 VAR BYTE
       S1 VAR BYTE
       S2 VAR BYTE
       B1 VAR BYTE
       B2 VAR BYTE
         
       

GUNCELLE VAR BIT
       I VAR BYTE
       WRITE 0,%00111111
       WRITE 1,%00000110
       WRITE 2,%01011011    
       WRITE 3,%01001111
       

WRITE 4,%01100110
       WRITE 5,%01101101
       WRITE 6,%01111101
       WRITE 7,%00000111
       WRITE 8,%01111111
       WRITE 9,%01101111
 

   
       
'ANA PROGRAM          

   
'********************************************************************
    SANI=0
    DAKI=0
    SAAT=0
   

MACDAKI=0
    ASCORE=0
    BSCORE=0
    G1A=0
    G1B=0  
    G2A=0
    G2B=0
    G3A=0
    G3B=0
    A1=0
    A2=0
 

  S1=0
    S2=0
    B1=0
    B2=0
    OPTION_REG =$D5
    INTCON=%00100000    
    ON INTERRUPT GOTO ZSAAT
    TRISB=1  
   

PORTB=0

'----------------------------------------------------------------------
'*********************************************************************

ANADONGU:
         IF

PORTB=%00010100 THEN DAKUP
         IF PORTB=%00011000 THEN DAKDN
         IF PORTB=%00010001 THEN SAATUP
         IF PORTB=%00010010 THEN

SAATDN
KONTROL:

   
    SHIFTOUT DPIN, CPIN, 1, [G1B,G1A,G2B,G2A,G3B,G3A]
    PULSOUT YAZ, 10
   
         IF PORTB=%00100000

THEN  MAC_ANADONGU
   
    GOTO ANADONGU

 
'*******************************************************************
DAKUP:
   

DAKI=DAKI+1
               IF DAKI>59 THEN
                  DAKI=0
                  SAAT=SAAT+1
                             IF SAAT>23 THEN
                               

SAAT=0
                             ENDIF
                ENDIF
                GOTO DEBOUNCE
'******************************************************************
DAKDN:
   

DAKI=DAKI-1
               IF DAKI>59 THEN
                  DAKI=59
                  SAAT=SAAT-1
                             IF SAAT>23 THEN
                               

SAAT=23
                             ENDIF
                ENDIF
                GOTO DEBOUNCE
'*****************************************************************
SAATUP:
 

     SAAT=SAAT+1
               IF SAAT>23 THEN
               SAAT=0
               ENDIF
               GOTO

DEBOUNCE
'******************************************************************
SAATDN:
       SAAT=SAAT-1
               IF SAAT>23 THEN
                   

SAAT=23
               ENDIF
'*****************************************************************
DEBOUNCE:
        FOR I= 1 TO 25
        PAUSE 10
        NEXT

I
     
GOTO KONTROL
DISABLE
'*******************************************************************
ZSAAT:
    SKES= SKES+1
    IF SKES<61 THEN

KCIK
       SKES=0
       SANI=SANI+1        
       IF SANI>59 THEN
          SANI=0
          DAKI=DAKI+1
           IF DAKI>59 THEN
             

DAKI=0
             SAAT=SAAT+1
             IF SAAT>23 THEN
                        SAAT=0
             ENDIF
          ENDIF
       ENDIF
   
   


'******************************************************************        
DECIMAL:
     
       G1A=SANI DIG 1
       G1B=SANI DIG 0
       G2A=DAKI DIG

1
       G2B=DAKI DIG 0
       G3A=SAAT DIG 1
       G3B=SAAT DIG 0
       READ G1A, G1A
       READ G1B, G1B
       READ G2A, G2A
       

READ G2B, G2B
       READ G3A, G3A
       READ G3B, G3B

'********************************************************************
'KESME

SON
'********************************************************************
KCIK:
    INTCON.2=0
    RESUME
   ENABLE        


'********************************************************************
'MAÇ

AYARLARI
'********************************************************************
MAC_ANADONGU:
         IF PORTB=%00010000 THEN ANADONGU
         IF

PORTB= 00000001THEN
         BSCORE=BSCORE+1
         GOTO MACDEBOUNCE
         ENDIF
         IF PORTB=%00000010 THEN
         

BSCORE=BSCORE-1
         GOTO MACDEBOUNCE
         ENDIF
         IF PORTB=%00000100 THEN
         ASCORE=ASCORE+1
         GOTO

MACDEBOUNCE
         ENDIF
         IF PORTB=%00001000 THEN
         ASCORE=ASCORE-1
         GOTO MACDEBOUNCE
         ENDIF
         IF

PORTB=%00100010 THEN MACDAKUP
         IF PORTB=%00100001 THEN MACDAKDN
         IF PORTB=%01000000 THEN MACBASLA
         IF

PORTB=%10000000 THEN
         HIGH ZIL
         FOR I= 1 TO 1000
         PAUSE 5
         NEXT I
         LOW ZIL
         GOTO ANADONGU
         

ENDIF
'DECMAC
      A1=ASCORE DIG 1
      A2=ASCORE DIG 0
      S1=MACDAKI DIG 1
      S2=MACDAKI DIG 0
      B1=BSCORE DIG 1
   

  B2=BSCORE DIG 0
      READ A1,A1
      READ A2,A2
      READ S1,S1
      READ S2,S2
      READ B1,B1
      READ B2,B2      



MAC_KONT:

   
    SHIFTOUT DPIN, CPIN, 1, [B2,B1,S2,S1,A2,A1]
    PULSOUT YAZ, 10
GOTO

MAC_ANADONGU
'**************************************************
                       
MACDAKUP:
MACDAKI=MACDAKI+1
               IF MACDAKI>99

THEN DAKI=00
               GOTO MACDEBOUNCE

MACDAKDN:
MACDAKI=MACDAKI-1
               IF MACDAKI>99 THEN DAKI=00
             


               

MACDEBOUNCE:
        FOR I= 1 TO 25
        PAUSE 10
        NEXT I
   
GOTO

MAC_ANADONGU
MACBASLA:
S1=0
S2=0
HIGH ZIL
FOR I= 1 TO 1000
PAUSE 5
NEXT I
LOW ZIL
GOTO MAC_ANADONGU    



  end

Veli B.

Tamamdır.
Gruba aktardım ve yorumlarınızı

bekliyorum.:)

http://groups.yahoo.com/group/PicProjeUP1/files/katana/[url]

Veli B.

Arkadaşlar kesinlikle epromdan okuma ve yazma olayını böyle sık kullanımlar için tavsiye etmiyorum.Arkadaşlardan birisi 1000.000.000 dan fazla yazma yapınca sarhoş oluyor demişti(Kafam karışık ismi hatırlayamıyorum,özür dilerim).Kesinlikle doğru.Pic 20 gün çalıştı ve aptallaştı.Data table kullanmanız çok daha sağlıklı :?

erhanmete

eepromlarında bir yazma okuma ömrü var.o yüzden dengeli kullanmak lazım.ben exelde çok basit bir çevrim tablosu yaptım port uçlarını ve segmentleri ayarlıyorsun sana direk ascii yi yedi segmente çeviren table oluşturuyor.kopyala yapıştır yaparak programa ekliyorum.hem ascii gönderince yazabildiği sembol veya harfleride yazıyor, ayrıca birşey yapmaya gerek kalmıyor.

ise

mcu flash epromların yazılım ömrü 100.000  kezdir fakat i2c veya normal paralel epromların yazılım ömrü 1000.000 kezdir(bu firmaya görede değişiyor)  yerinden çıkarmazsan pek bir şey olmuyor.

Veli B.

Özür dilerim. 3 sıfır fazla yazmışım.