225 display (38mm) Fiyat Panosu 16f877a+eeprom+max232

Başlatan picagor, 02 Eylül 2014, 01:26:32

picagor

3 yıl önce yaptığım bir proje.. Belki benden az bilen birilerine lazım olur..
225 adet displayde fiyatlar yazar. Güncelleme PC deki Visual Basic programı ile yapılır.. Datalar Harici eepromda tutulur..
Kod:


'***************************************************************************
'*  Name    : MALATYA ÖĞRETMENEVİ BİLGİ PANOSU PRJ                          *
'*  Author  : hakanaras1978@gmail.com   __Hakan ARAS Elektronik Öğretmeni   *
'*  Notice  : Copyright (c) 2011                                            *
'*          : All Rights Reserved                                           *
'*  Date    : 10.04.2011                                                    *
'*  Version : 2.0                                                           *
'*  Notes   :225 x 38mm  ortak katot display fiyat bilgi panosu             *
'****************************************************************************

'===================================================================== INITALIZE
@ DEVICE PIC16F877A                                                   
@ DEVICE PIC16F877A, WDT_OFF             
@ DEVICE PIC16F877A, PWRT_OFF           
@ DEVICE PIC16F877A, PROTECT_OFF       
@ DEVICE PIC16F877A, XT_OSC             

Include "MODEDEFS.BAS"  'Seri İletişim İçin Gerekli

Define OSC 4            '4 Mhz harici osilatör kullanılacak

DEFINE I2C_SLOW 1       ' I2C Tipi EEPROM İletişim hızını biraz yavaşlat

ADCON1 = 7
CMCON=7                 'tüm pinleri dijital yap. analogla hiç bi işin yok

TrisA=0:TrisB=0:TrisC=0:TrisC.7=1:TrisC.6=0:TrisD=0:TrisE=0
PortA=0:PortB=%00000000:PortC=0:PortD=0:PortE=0:

TEMP VAR BYTE           'kesme bayrağı geçici değişken
i var byte              'show portd sayaç değişkeni
k var byte              'flash led sayaç değişkeni

'====================================4 Mhz ve 2400 Baud için COM port ayarları  ;

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_BAUD 2400

'YUKARIDAKİ 2400 BAUD 4MHZ USART AYARLARI kaynak: PICMULTICALC.EXE

'============================================================= EEPROM TANIMLARI
    DPIN var PortC.4            'EPROM DATA pini
    CPIN var PortC.3            'EPROM CLOCK pini
    DTA   VAR  BYTE             'EPROMA yazılacak DATA
    ADRS  VAR  WORD
    KONT Con %10100000     'EPROM KONTROL KODU

'==================not ASCII TABLOSU==========================================
'0--> ASCII CODE DECIMAL << 48 >>
'1--> ASCII CODE DECIMAL << 49 >>
'2--> ASCII CODE DECIMAL << 50 >>
'3--> ASCII CODE DECIMAL << 51 >>
'4--> ASCII CODE DECIMAL << 52 >>
'5--> ASCII CODE DECIMAL << 53 >>
'6--> ASCII CODE DECIMAL << 54 >>
'7--> ASCII CODE DECIMAL << 55 >>
'8--> ASCII CODE DECIMAL << 56 >>
'9--> ASCII CODE DECIMAL << 57 >>
'=============================================================================

symbol DATA_GIRIS = PORTD.0        '74595 DATA PİNİ
symbol CLOCKPALS= PORTD.1          'CLOCK PİNİ
SYMBOL KILIT= PORTD.2              'KİLİT PİNİ
symbol ANAPROGRAM_LED=PORTB.2      'ANAPROGRAMIN ÇALIŞTIĞINI GÖSTEREN LED
SYMBOL EPROMWRITE_LED=PORTB.1      'EPROMA YAZILDIĞINI GÖSTERİR LED

hakandata var byte  'RS232 den gelen her byte
z var byte          '225lik döngü sayacı değişkeni
SAYISEC var byte
   
G_SEGMENT    var byte
F_SEGMENT    var byte
E_SEGMENT    var byte
D_SEGMENT    var byte
C_SEGMENT    var byte
B_SEGMENT    var byte
A_SEGMENT    var byte

'======================================================= USART KESME TANIMLARI
INTCON.7=1   
INTCON.6=1
PIE1.5=1

ON INTERRUPT GoTo COMPORTOKU

'================================================A N A  P R O G R A M  B A Ş L A
'===============================================================================

    ANAPROGRAMBASLA:
       
        PIE1.5=1                'KESMELER AKTİF
       
        ANAPROGRAM_LED=1        'ANA PROGRAMDA OLDUĞUNA DAİR LEDE FLASH YAPTIR
        GOSUB GECIKME
        ANAPROGRAM_LED=0
        GOSUB GECIKME       
               
'==============================================EPROMU OKU sayisec Değişkenine yaz
'okunansayi_ne altprogramına git sayı neymiş öğren
'bu iş adres her seferinde 1 artarak toplam 225 kere yapılıyor

    E_OKU:
        FOR ADRS=1 TO 225     
        I2CREAD DPIN, CPIN, KONT, ADRS, [sayisec]
        pauseus 5
        gosub OKUNANSAYI_NE
        NEXT ADRS

'============================================================================== 
goto anaprogrambasla
'=========================================G İ T -->A N A P R O G R A M B A S L A
'===============================================================================

DISABLE

'=================================================K E S M E  B A Ş L A N G I C I
COMPORTOKU:

ADRS=0
FOR Z=1 TO 225
 
    HSERIN 5,ATLA,[WAIT ("a"),hakandata] 
'"a" dan sonra gelen 1 baytı (8 biti) hakandata değişkenine yaz
E_YAZ: '=====================================================24C128 EEPROMA YAZ
         
      ADRS=ADRS+1       
      DTA=hakandata
      I2CWRITE DPIN,CPIN,KONT,ADRS,[DTA] 'adresi bir arttırarak her gelen yeni datayı hücrelerine yaz..
      Pause 5                            '5 ms bekle ki EEPROM tozutmasın...

NEXT Z

'===============================================================================

'================================= YAZILDIĞINA DAİR LEDE FLASH YAPTIR           
for k=1 to 10
       
       EPROMWRITE_LED=1
       
       GOSUB EPROMLEDFLASHDELAY
       GOSUB EPROMLEDFLASHDELAY
       GOSUB EPROMLEDFLASHDELAY

       EPROMWRITE_LED=0
       
       GOSUB EPROMLEDFLASHDELAY
       GOSUB EPROMLEDFLASHDELAY
       GOSUB EPROMLEDFLASHDELAY
       
next k
'================================================================             

Atla:         '5ms içinde veri girişi olmazsa ana programa dön
    'RCIF=0   '
    'GIE=1    '
    TEMP=RCREG
    PIE1.5=0  'bu komut kesme bayrağının sıfırlanmasını sağlaR
    Resume
    enable

'===============================================================================
GECIKME:             
   
     For I=0 to 3
       Pauseus 5
     next i   

RETURN
'===============================================================================

'===============================================================================
DISPLAYS_SHIFT:
   
   DATA_GIRIS=G_SEGMENT     
   PAUSEUS 5
   CLOCKPALS=0         
   PAUSEUS 5
   CLOCKPALS=1         
   
   GOSUB GECIKME
   DATA_GIRIS=F_SEGMENT       
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1
   
   GOSUB GECIKME
   DATA_GIRIS=E_SEGMENT
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1
   
   GOSUB GECIKME
   DATA_GIRIS=D_SEGMENT 
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1
   
   GOSUB GECIKME
   DATA_GIRIS=C_SEGMENT 
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1
   
   GOSUB GECIKME
   DATA_GIRIS=B_SEGMENT
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1
   
   GOSUB GECIKME
   DATA_GIRIS=A_SEGMENT 
   PAUSEUS 5
   CLOCKPALS=0
   PAUSEUS 5
   CLOCKPALS=1

   GOSUB GECIKME

GOSUB ENSONDISPLAYMI

return
'===============================================================================

'===============================================================================
OKUNANSAYI_NE:

select case SAYISEC 'data pini için grafik tablosu
     
case 48  'sıfır için 7 segmentin sırası şu olacak g:0 f:1 e:1 d:1 c:1 b:1 a:1
G_SEGMENT=0
F_SEGMENT=1
E_SEGMENT=1
D_SEGMENT=1
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
     
case 49  'bir için  7 segmentin sırası şu olacak g:0 f:0 e:0 d:0 c:1 b:1 a:0
G_SEGMENT=0
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=0
gosub displays_shift
     
case 50  'iki için   artık anlaşılmıştır sanırım.. segmentlerin gerisini yazmıyorum 
G_SEGMENT=1
F_SEGMENT=0
E_SEGMENT=1
D_SEGMENT=1
C_SEGMENT=0
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
     
case 51  'üç için
G_SEGMENT=1
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=1
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
     
case 52  'dort için
G_SEGMENT=1
F_SEGMENT=1
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=0
gosub displays_shift
     
case 53  'beş için
G_SEGMENT=1
F_SEGMENT=1
E_SEGMENT=0
D_SEGMENT=1
C_SEGMENT=1
B_SEGMENT=0
A_SEGMENT=1
gosub displays_shift
     
case 54  'altı için
G_SEGMENT=1
F_SEGMENT=1
E_SEGMENT=1
D_SEGMENT=1
C_SEGMENT=1
B_SEGMENT=0
A_SEGMENT=1 '**OPSİYONEL** 6 DA a segmenti yakılmak istenmezse burası 0 yapılabilir

gosub displays_shift     
case 55  'yedi için
G_SEGMENT=0
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
case 56  'sekiz için
G_SEGMENT=1
F_SEGMENT=1
E_SEGMENT=1
D_SEGMENT=1
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
case 57  'dokuz için
G_SEGMENT=1
F_SEGMENT=1
E_SEGMENT=0
D_SEGMENT=1 '**OPSİYONEL** 9 DA d segmenti yakılmak istenmezse burası 0 yapılabilir
C_SEGMENT=1
B_SEGMENT=1
A_SEGMENT=1
gosub displays_shift
case "T"  'boş için   'haa unutmadan adam displayi boş bırakırsa 7 tane 0 göndersinki sıra kaymasın
G_SEGMENT=0                'bunuda bilgisayardan örneğin "T" göndererek yapıyoruz. T nin bi özelliği yok yani
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=0
B_SEGMENT=0
A_SEGMENT=0
gosub displays_shift
case "t"  'boş için   'işimiz garanti olsun
G_SEGMENT=0
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=0
B_SEGMENT=0
A_SEGMENT=0
gosub displays_shift
case 84  'boş girilen bilgi için     'belki T nin ascii si gelir dahada bi garanti edelim..
G_SEGMENT=0
F_SEGMENT=0
E_SEGMENT=0
D_SEGMENT=0
C_SEGMENT=0
B_SEGMENT=0
A_SEGMENT=0
gosub displays_shift
end select
return
'===============================================================================

'===============================================================================
ENSONDISPLAYMI:

IF ADRS <> 225 THEN    'SON DATA ADRESİ KONTROLÜ
   
   GOSUB GECIKME
   DATA_GIRIS=1
   PAUSEUS 5
   CLOCKPALS=0
   KILIT=0
   
   GOSUB GECIKME
   DATA_GIRIS=1
   PAUSEUS 5
   CLOCKPALS=1
   KILIT=0
   GOSUB GECIKME
   
   ELSE
   
   GOSUB GECIKME
   DATA_GIRIS=1
   PAUSEUS 5
   CLOCKPALS=0
   KILIT=0
   GOSUB GECIKME
   DATA_GIRIS=1
   PAUSEUS 5
   CLOCKPALS=0                       
   PAUSEUS 5
   KILIT=1   'TÜM DİSPLAYLERİ GÖSTER..
   
   GOSUB GECIKME
   
   GOTO ANAPROGRAMBASLA
   
   ENDIF

RETURN
'===============================================================================

'===============================================================================
EPROMLEDFLASHDELAY:

    For I=0 to 255
    Pauseus 5
    next i

RETURN
'===============================================================================

'===============================================================================
END   
'===============================================================================
'===============================================================================
'===============================================================================
'===============================================================================
'===============================================================================

'A  Ç  I  K  L  A  M  A  L  A  R

'Tarama metodu kullanılmadan PIC in sadece 3 pini kullanılarak tüm 74595 ler sürüldü
'Bilindiği üzere shift register entegreleri DATA girişlerine uygulanan lojik bilgileri,
'yine ayrı bir pinleri olan CLOCK pinlerine dışarıdan saat sinyali geldiği sürece çıkışta
'kaydırarak ilerletirler.Bu devre bu mantıktan hareketle geliştirildi. 74595 i diğer shift registerlardan
'ayıran en temel pin Kilit pinidir.Kilit pinlerine lojik 1 uygulanmadığı sürece herhangi bir çıkış vermezler.
'Kilit HIGH yapıldığı anda ise entegre artık harici clock sinyalinden etkilenmez. Ve hali hazırda
'içinde biriktirdiği DATA yı çıkışlarına yansıtır

'Örnek:

'DATA: 1 CLOCK:1 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 0 CLOCK:0 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 0 CLOCK:1 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 1 CLOCK:0 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 1 CLOCK:1 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 0 CLOCK:0 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 1 CLOCK:1 KİLİT:0    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:0 Q4:0 Q5:0 Q6:0 Q7:0
'DATA: 1 CLOCK:1 KİLİT:1    ÇIKIŞLAR :  Q0:0  Q1:0 Q2:0 Q3:1 Q4:1 Q5:0 Q6:0 Q7:1


'Yani en temel Flip Flop mantığı üzere veriyi geçici bir süre kaydeder. Taki elektrik kesilene kadar... Elektrikler
'kesilirse nolacak peki? Bilgiler silinecekmi? Elbette hayır. Bunuda 24c128 EPROMu ile çözüyoruz.

'Gel gelelim bizim bu devreye.. Devrede PIC sürekli ana programda çalışıp durmaktadır. Ana programda yapılan iş şudur.
'PIC EPROMA derki: EPROM kardeş sen şu adreslerinde yer alan DATA ları bana bi ver bakıyım.
'Ben bi onları kontrol edeyimde hafızandaki adreslerde artık hangi rakamlar varsa onlara göre
'şu 74595 lere CLOCK, DATA ve Kilit sinyali göndereyim. PIC Epromun 1. adresine bakar bide bakarkı orda örneğin 1 rakamı var
'Tabi 1 in kendisi yok ASCII karşılığı var (yani 49) . O zaman displayde 1 yazdıracak uygun data tablosunu  3 pininden
'İlk 74595 e uygular. İlk 74595 bu datayı içinde kaydırır... kaydırır... ve gelir en son displayde dururmu? Tabiki durmaz
'İŞte tam o sırada PIC bi kilit sinyali gönderir. Takkkk tüm 74595 ler kilitlenir. O an içlerinde bulunan tüm dataları
'displayleri sürerek gösterirler. Bu kısım ana programın özetiydi...

'İkinci bölüm ise cihazın bilgisayardan gelen sinyalleri, yani panodaki güncelleme bilgilerini alarak
'USART kesme alt fonksiyonunu çalıştırma kısmı. Bizim PIC ana programda dönüp dolaşırken insanoğlunun biri
'panodaki bilgileri güncellemek isterse RS232 portundan sinyal gönderir (Visual basic ile yazılan programdan tabi..)
'PIC işlemcisinin normal işlerini yaptığı yerde portttan gelen bu sinyali hemencecik yakalaması ve yeni gelen DATA
'dizisini EPROMA kaydetme görevi öncelik taşır.. Dikkat edilirse programın en başında şöyle bi satır
'vardır. ON INTERRUPT GoTo COMPORTOKU   bu şu anlamı taşır. Ey PIC .. Şimdi anaprogramdasın oRDAaki işlerle
'meşgulsün biliyorum ..ama işin herneyse hemen bırak ve COMPORTOKU: adlı programa git ordaki işleri yap..
' HSERIN komutu ile RS232 den gelen data dizisini alır ve sonra I2CWRITE komutu ile EPROMUN 1. adresinden 225. adresine
'kadar gelen yeni dataları yazar. Daha sonra EPROMA yazdığını belli etmek için Flash LED efekti yaptırır. Bu işten sonra
'hemen anaprograma gider ordaki işlere devam eder.. YANİ EPROMDAKİ YENİ DATALARI OKUR VE DİSPLAYDE GÖSTERİR....

'özet bu devrede display sayısı önemli değildir güç kaynağınıza güveniyorsanız 1000 display de kullansanız farketmez..
'tabi 1000 display için epromun 1000 adresini ve 1000 adet 74595 kullanacaksınız..

'Visual Basic programı her bir baytı (yani her bir rakamı) önüne "a" stringini koyarak gönderirki 2400.8N1 formatına
'göre start biti kullandığımız için datalar birbirine karışmasın..  VB den bu devreye gönderilen bilgi miktarı 225 byte ve 224 adet "a" harfidir.

'Devreyi farklı sayıda display ile yapacaklar için Display sayısı kaç adetse 225 rakamı o sayıyla değiştirilmelidir. Ufak bi değişiklikte VB programında yapılmalıdır.
'BU DEVRE AKTİF OLARAK MALATYA ÖĞRETMEN EVİNDE 3 YILDIR KULLANILMAKTADIR. HERHANGİ BİR ŞEKİLDE BOZULMAMIŞTIR.

'SON NOT : UYGULAMADA ÇIKAN KÜÇÜCÜK PÜRÜZLERDEN ÖTÜRÜ KİLİT VE CLOCK SİNYALLERİ AND KAPISI TAMPON YAPILARAK
'AKIM ARTTIRILMIŞTIR..

'HER 15 DİSPLAY KARTI 1 ADET 7805 İLE BESLENMEKTEDİR.

'BESLEME TRAFOSU 12 VOLT 150 WATT, 35A KÖPRÜ DİYOT KULLANILMIŞTIR.. 1000 UF KAPASİTÖR


'hakanaras1978@gmail.com

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



Powered by EzPortal