16f648a Mutfak Saat

Başlatan aRci, 03 Ağustos 2021, 20:32:06

muyat

tM1637 Yi tekrar incelemeye çalışıyorum.
Anlamadıgım şey şu:
16f628a ile yapılan simulasyonda aşagıdaki kod segmentleri test ettikten sonra,simulasyonda 0'dan 4 saniyeye yaklaşık 30 saniyede saydırıyor.


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 31.12.2019                                        *
'*  Version : 1.0                                              *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************

@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT  

 
DEFINE OSC 4        
CMCON=7
PORTB = %00000011
TRISB = %11111100
PORTB = %00000011  
TRISA=%0000000 
INTCON=0
OPTION_REG=%10001111

SEGMENT        VAR Byte
DONGU_CIKIS    VAR BYTE 
INDEX          VAR BYTE
SURULEN_BITLER VAR BYTE
DIGIT_DEGER    VAR BYTE
SEGMENT_CIKISA VAR BYTE

EKRAN_DEGERI  VAR WORD

NOKTA_YAK      VAR BIT
''' sürülmek istenen GRID çıkışları için, datasheet'den bakınız 2- Address command setting 
GRID_0 CON $C0  ; %11000000 GRID1 çıkış adresi  
GRID_1 CON $C1  ; %11000001 GRID2 çıkış adresi 
GRID_2 CON $C2  ; %11000010 GRID3 çıkış adresi  
GRID_3 CON $C3  ; %11000011 GRID4 çıkış adresi
GRID_4 CON $C4  ; %11000100 GRID4 çıkış adresi
GRID_5 CON $C5  ; %11000101 GRID4 çıkış adresi  

''' Display ışığı degerleri, bakınız datasheet 3- Display control 
DISP_ISIK_MAX  CON $8F    ; %10001111    ( Işık Full )
DISP_ISIK_OFF  con $87    ; %10000111    ( Işık Off  )
DISP_ISIK_1_16  CON $88    ; %10001000    ( Işık  1/16 )
DISP_ISIK_2_16  CON $89    ; %10001001    ( Işık  2/16 )
DISP_ISIK_4_16  CON $8A    ; %10001010    ( Işık  4/16 )
DISP_ISIK_10_16 CON $8B  ; %10001011    ( Işık 10/16 )
DISP_ISIK_11_16 CON $8C  ; %10001100    ( Işık 11/16 )
DISP_ISIK_12_16 CON $8D  ; %10001101    ( Işık 12/16 )
DISP_ISIK_13_16 CON $8E  ; %10001110    ( Işık 13/16 )
DISP_ISIK_14_16 CON $8F  ; %10001111    ( Işık 14/16 )

''''  Segmentlere ait bit ler. 
'  seg_x CON %ngfedcba  
SEG_A CON %00000001
SEG_B CON %00000010
SEG_C CON %00000100
SEG_D CON %00001000
SEG_E CON %00010000
SEG_F CON %00100000
SEG_G CON %01000000
SEG_N CON %10000000

'''' değişik karakterler için segment atamaları
'  CHAR_ As %ngfedcba 
CHAR_B_A CON %01110111  ''' Karakter büyük A 
CHAR_K_A CON %01011111  ''' Karakter kücük a 
CHAR_K_B CON %01111100  ''' Karakter kücük b 
CHAR_B_C CON %00111001  ''' Karakter büyük C
'  CHAR_ CON %ngfedcba  
CHAR_K_C CON %01011000  ''' Karakter kücük c 
CHAR_K_D CON %01011110  ''' Karakter kücük d 
CHAR_B_E CON %01111001  ''' Karakter büyük E 
CHAR_K_E CON %01111011  ''' Karakter kücük e  
CHAR_B_F CON %01110001  ''' Karakter büyük F
'  CHAR_ CON %ngfedcba 
CHAR_B_H CON %01110110  ''' Karakter büyük H
CHAR_B_I CON %00000110  ''' Karakter büyük I
CHAR_B_J CON %00001110  ''' Karakter büyük J
CHAR_B_L CON %00111000  ''' Karakter büyük L
CHAR_K_N CON %01010100  ''' Karakter kücük n
CHAR_U_O CON %01100011  ''' Karakter ustte o 
CHAR_A_O CON %01011100  ''' Karakter altta o 
CHAR_B_P CON %01110011  ''' Karakter büyük P  
'  CHAR_ CON %ngfedcba 
CHAR_K_R CON %01010000  ''' Karakter kücük r
CHAR_K_T CON %01111000  ''' Karakter kücük t
CHAR_B_U CON %00111110  ''' Karakter büyük U 
CHAR_K_U CON %00011100  ''' Karakter kücük u
CHAR_B_Y CON %01101110  ''' Karakter büyük Y

symbol CLK=PORTB.0
symbol DIO=PORTB.1
PAUSE 500

clearwdt 

    GoSub aydinlik_ayari  
    ''' isis de "ışık" olarak farkedilmeyebilir. 
    ''' display Pinlerini skop ile gözlemek fikir verebilir.    
    
    GoSub oto_ilerlemeyi_kur
'-------------------------------BAŞLANGIÇ------------------------------------------------    
BASLA:
    clearwdt    
    ''' segment test yapalım
    GoSub segment_test
  
    ''' rakam ekranlayalım, ekranlayacağımız değer
    For ekran_degeri = 0 To 4000
'        ekran_degeri = 4000
        GoSub gonderim_x_hane        
 
            PAUSE 1
    
        CLEARWDT
    Next
    

    
GoTo basla
''''''''''    

'''''''''''
SEGMENT_GONDER:
    surulen_bitler = segment
    
BITLERI_ITELE:            ''' surulen_bitler değerini gönderen dongu    

    SHIFTOUT DIO,CLK,0,[SURULEN_BITLER]
    
    Low CLK          ;  
    While DIO =1
      CLEARWDT
    Wend
    High CLK
    Low CLK
Return

''''''''''''
''' data gönderimi başlıyor
START_VER:
    CLEARWDT
    High CLK
    High DIO
    Low DIO

Return

'' data gönderimi bitti.    
STOP_VER:
    CLEARWDT
    Low CLK
    Low DIO
    High CLK
    High DIO
    
Return


''''''''
SEGMENT_DEGERI_AL:
    CLEARWDT
    LookUp digit_deger, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$00],segment ; 0-9 ve Blank (10 degeri)
    
    ''' digitin noktası yakılacak ise 
    If nokta_yak = 1 Then
        segment.7 = 1          ''' ilgili biti setle
        nokta_yak = 0
    EndIf
        
Return

''''''''''''''''
GONDERIM_X_HANE:
    ''' Gönderim başlıyor bildirgesi START pulse i
    GoSub start_ver
    
    ''' Gösterime Hangi haneden başlayacağız  
    GoSub ilk_hane_ne

    ''' Kaç hane sürecek isek digitleri almak gerek.
    ''' 4 hane
    For index = 3 To 0 Step -1
        ''' ekran_degeri değişkeninin digitlerini sırayla al 5, 2, 3, 4 gibi
        digit_deger =ekran_degeri DIG index
        
        '''' gereksiz segmentler sönsün denirse
        GoSub gereksizse_sondur
        
        
        ''' alınan digite göre segment bitleri nedir, oradan dönen deger degişkeni "segment" dir
        GoSub segment_degeri_al      ''' segment bitleri oluşturuldu                
        GoSub segment_gonder        ''' mcu pininden TM1637 'ye sür.
    Next
    
    ''' Gönderim bitti STOP pulse i
    GoSub stop_ver
Return    
''''''''''

GEREKSIZSE_SONDUR: 
    If ekran_degeri < 10 Then                  ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 0 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 100 Then                  ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 1 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 1000 Then                  ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 2 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
Return 
'''''''''''''


SEGMENT_TEST:

    segment = %00000001 ''' seg_a
    
SEGMENT_TEST_2:
  
    ''' Gönderim başlıyor bildirgesi START pulse i
    GoSub start_ver
    
    ''' Gösterime Hangi haneden başlayacağız  
    GoSub ilk_hane_ne

    ''' Kaç hane sürecek isek digitleri almak gerek.
    ''' 4 hane
    For index = 3 To 0 Step -1
        GoSub segment_gonder        ''' mcu pininden TM1637 'ye sür.
    Next

    ''' Gönderim bitti STOP pulse i
    GoSub stop_ver
  PAUSE 300
    CLEARWDT
    
    segment = segment << 1
    If segment > 0 Then segment_test_2

Return


;;;;;;;;;;;;;;;
''''''''''' KURULUM KOMUTLARI
ILK_HANE_NE:
    '''' Hangi haneden başlıyacağız gösterime, onu bildirelim    
    ''' Haneleri Peşisıra süreceğimiz için ilk haneyi hangisinden versin
    ''' oto ilerlemeli gösterim için ilk hane hangisi olsun
    surulen_bitler = GRID_0        ''' soldan 1.      
'    surulen_bitler = GRID_3      ''' soldan 3. gibi.
    ''' GRID_x 'lerin sayı değerleri en üstte, sabitlerin atamalarında 
    GoSub bitleri_itele            ''' hane bildirimi komutunu TM1637 ye sür
Return


''' bakınız 1- Data command setting bölümünde 
''' Address adding mode setting sekmesi 2 deger içerir
    ''' Automatic address adding. Değeri %01000000 = $40
    ''' Fix address              Değeri %01000100 = $44
OTO_ILERLEMEYI_KUR:
    GoSub START_VER    ''' data gönderimi başlıyor
    ''' Automatic address adding. Otomatik adres ekleme için değer %01000000 = $40
    surulen_bitler = %01000000        ''%01000000 adresi oto arttırma,  bakınız 1- Data command setting 
    GoSub bitleri_itele    '' datayı gönder, Command datası olarak 1 byte gönderir
    GoSub stop_ver        '' data gönderimi bitti.
Return

'''
AYDINLIK_AYARI:
    ''' Display ışık seviyesi ayarı
    GoSub start_ver
    surulen_bitler = DISP_ISIK_MAX    ''' max ışık
'    surulen_bitler = DISP_ISIK_off  ''' ışık kapalı
'    surulen_bitler = DISP_ISIK_12_16  ''' 12/16
    GoSub BITLERI_ITELE
    GoSub stop_ver
Return    
    

ete

Bilgisayar hızları, işlemcilerine bağlı olarak çok farklı olduğundan simulasyondaki süreler direk ekrana bakarsanız fark ediyor. Ama simulasyon ekranında sol en altta sistem saati de yer almaktadır. Gerçek zamanı ancak oradan takip edebilirsiniz. Ekrandaki gösterge belki 30 sn de ilerlemiş olsada sistem saati 4 sn ilerlemiş olacaktır (muhtemelen). Tabiiki programda bir sorun yok ise.

Ete

aRci

Merhaba,
Mutafak saat olarak başladım ama termometre saat olarak devam ettim. projede son değişikliklerimi yaptım. Tm1637 parlaklık ayarı saat ayarı saat ve sıcaklık değerlerinin ekranda görüntülenme süresi, sıcaklık değerine göre transistör çıkışı kontrolü ve sıcaklık değerinin esp01 ile thinkspeak'a 1 dakika ara ile yüklenmesi. Hafızada boşluk var daha belki esp ile uzaktan ayar vs de yapabilirim. esp program hafızası düşük olsade sade bir program olduğu için şimdilik OTA ile ESP yi güncelleye biliyorum.

Timer ile saman kayması problemim var karalı bir çözüme ulaşamadım sürekli dene test et ve tekrar dene yöntemi de yoruyor o sebeple bıraktım belki bir gün gene bakarım.


Bu eki görüntüleyemezsiniz.

mehmet

Ntp server üzerinden eşitleme yapabilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

aRci

Merhaba,
saat konusunda bir problemim yok ds3231 çok güzel çalışıyor benim sorunum zaman sayacı tarafında burada timer ile zamanı saydırmaya çalışıyorum ama zamanda uzun yada kısa vadede kayma var. bu kısımda ds3231 den saat okuyarak çözebilirim ama yapmak istemiyorum bunun yerine timer ile çözmeye çalışıyorum.

mehmet

DS nin INT/SQW bacağını kullanın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

xc10

Sayın aRci ve ete hocam 1 numaralı dosyayı uyguladım..Fakat ekranda hiç görüntü alamıyorum...Pici 3 kere yükledim tüm bağlantılarımı kontrol ettim ...Ds3231 modül kullanıyorum...Tm 1637 modül üzerinde bulunan c3 ve c4 kondansatörlerini söktüm..Krisatlim 20mhz...Picin mclr bacağını 10k ile hıgh e çektim şemada yoktu..Ayar butonlarını 10k ile hıgh e çektim...Dikkat etmem gereken başaka bir şey varmı?Yada sonradan düzeltilmiş bir hex dosyası mevcutmu elinizde?

aRci

Merhaba ilk paylaşımdaki devre ve kod 16f648A  için ve harici 4mhz kristale göre yapılmış. Bu çalışmada daha sonra 20mhz göre yapmışım ondada sadece timer değişkeni ayarı gerekiyor bağlantılar doğru ise devrenin çalışması gerekiyor. Hangi denetleyiciyi kullandınız. Denetleyiciniz 20mhz yi karşılıyormu. hatırladığım butonlar programlama girişinde olduğu için pickit3 ü sökmezsem sanki butona basılıymış gibi işlem yapıyordu siz ne ile program atıyorsunuz

xc10

Merhaba pıc brenner 8 kullanıyorum programlayıcı olarak..İşlemci 16f648a..Dediğiniz gibi mevcut yüklü dosyada 4mhz kristalde denedim şimdi sonuç aynı...Son düzenleme yaptığınız şema ve hex dosyasını yüklemeniz eğer mümkünse ben kontrollerimi yapıp sonucu uygun bir zamanda yazayım size...

aRci

Merhaba son dosyam bu şekilde devre çiziminde değişiklik yok son olarak porta.4 de ledi bağladınız mı

xc10

Bu konun başında paylaştığınız dosyadaki semaya göre bütün bağlantılar yapılmış durumda...Şu an dışarıda olduğum için  son paylastiginiz dosyayı incelemedim...Gerekli çalışmayı yapıp yazacağım size tekrar...ilginize teşekkür ederim...

xc10

#26
Bu verdiğiniz  son hex dosyasını sayfanın başında yaptığınız ilk proje simülasyonunda çalışmıyor gerçektede.. Sizden ricam şemayla birlikte uygun hex dosaysını birlikte paylaşmanız...Ortada bir karışıklık var anlamaya çalışıyorum hala!!!Ds3231 den şüpheleniyorum yenisini sipariş edip deneyeceğim ve sonucu size yazarım.. Şunu ekleyeyim unuttum..Ds3231 ardunio için kullanılan hazır PCB modül...

xc10

#27
Sayın aRci akşam kısa bir süre devreye tekrar baktım...Ds3231 modül kullanıyorum.Elimde harici 3231 entegre yok maalesef..Displayda başlangıç simülasyonunu gördüm saat 04.04 olarak çalışmaya başladı fakat olduğu gibi 04.04 sabit kalıyor..Sıcaklığı modülden okumaya çalışıyor o da 0.4 derece olarak sabit...İlk hex dosyası yüklü pic de..Ve ilk paylaşım yaptığınız devre için konuşuyorum..İkinci devreyi kurup test edemiyorum çünkü paylaştığıınız şema eksik..Onuda açık paylaşma imkanınız varsa test edeceğim..

aRci

İkinci devre dediğiniz kırmızı bitmiş olan pcb galiba onun için ilk paylaşımdakinden farklı bir pin bağlantı şeması yok malum pcb oldukca küçük pinleri değiştirmek zorunda kaldım pcb çizim dosyasından ekran görüntüsü atabilirim sim kullanmadım. programa gelirsek ilk program zaten paylaştım onun üzerine eklenti yaparak gittim. son olarakta boş kısıma esp yi ekledim.

Proteusda problem var o sebeple ds3231 ekleyemedim aslında kütüphane problemi yaşıyorum.
Ds3231 portb.5 ve 4 de bağlı tm1637 ise porta.3 ile 2 ye bağlı

Birde Tm1637 için kütüphane yapmaya çalıştım biraz dağınık ama çalışıyor üstüne giderek kendi programına ekleye bilirsiniz.

    include "16f648.bas"  
    
    SDA VAR PORTB.5
    SCL VAR PORTB.4
    include "Ds3231.bas"
    
    DIO VAR PORTA.3
    CLK VAR PORTA.2 
    include "Tm1637.bas"
    TmDuty  = 2   'display parlaklık
    TmDp    = 0   '2 nokta üstüste
    TmOn    = 1   'Panel aktif
    
    symbol Ld       = porta.4    'LOW Ld = led yanar
    symbol Bz       = porta.0    'LOW Bz = Buzzer çalar
    Symbol Tr       = Portb.3    'High Tr= Transistör çalışır.
        
    Bt1  var Portb.0
    Bt2  var Portb.6
    Bt3  var Portb.7

xc10

Bu ikinci devreyide uygun zamanda düzenleyip test edeceğim...İlk projeye ait ekranda saatin ilerlememsine ait yorumunuz nedir peki?

Powered by EzPortal