avatar_ete

Alarm Saat (picbasic pro, pic16f877, pcf8583)

Başlatan ete, 28 Ağustos 2011, 14:02:42

mehmet

Yıl için ram alanından(örneğin:20H) bir adrese temel yıl kaydedilecek.
05H adresindeki yıl bitleri sadece dört yılı tutuyor. Buna göre temel yıl ile 05H deki yıl toplanacak.

Siz temel yıla 2024 yazdınız diyelim. 05H deki yıl bitleri 1 olacak. Böylece 2024 + 1 = 2025 okuyacağız. Dört yıl sonra günceleme yapacak şekilde kodu değiştirmemiz gerekecek.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Belkide dünyanın en geri zekalı RTC si bu PCF8583 dür. Çünki bir YIL registeri bile kullanmamışlar.
Yalnızca Ayın günü ne ait olan 5 nolu registerin 6 ve 7 ci bitlerini yıl için ayırmışlar. İki bit den okunabilecek en büyük değer %11 şeklinde 3 rakamı olur. Sıfır ile birlikte 0-1-2-3 şeklinde 4 değer okunabilir. BU nedenle programda TAMYIL isminde bir YIL değişkeni kullanmış idim.
Öncelikle yıl registerine doğru bilgi yazıldıktan sonra her yıl değişiminde bu register değeri bir artırılacaktır. BU nedenle Saat okuma kısmında, Okumaya başlamdan önce EskiYıl=YIL eşitliğini yazarak önceki yıl değerini saklıyoruz. Sonra yeni okuma yapıp Yıl yeni değerini buluyoruz. Sonunda bir karşılaştırma yaparak;
IF ESKIYIL=3 and YIL=0 ise demekki 4 yıl geçmiş deyip TAM_YIL'a 4 ekleyip kayıt ediyoruz.

Şimdi bütün bunlara bakıp söylediklerin ile karşılaştırıyorum ve sorunnedir anlayamıyorum. Zira aynı program bende de simulasyonda çalışıyor ve yıl değeri 05 iken onu 25 yapıp kayıt ettim normal kayıt aldı ve ayar yapıldı. Sendeki sorunu anlamak için epromun sıfır nolu adresindeki kayıt değerini okuyup burada söylemen gerek. Veya sorunu kökden çözmek istersen ;
Programın başlarında ve BASLA satırından bir kaç satır evvel yer alan;
READ 0,TAMYIL
	IF TAMYIL=255 THEN
	   TAMYIL=4
	   WRITE 0,TAMYIL
	ENDIF   
satırlarının bir öncesine
DATA @0,255 yaz ve derleyip işlemciye kayıt et. Sonra programı çalıştır.
Ardında sistemi kapat işlemciyi yerinden sök ve DATA satırını silip yeniden derleme yap ve yeniden işlemciye yazdır.
Daha sonra yeniden çalıştırıp yıl ayarını yap bakalım bu sefer doğru yapacakmıdır.

Ete
 Diyelimki şu anda 2025 yılındayız. Tamyı=5 alırsak ve YIL bitlerine %00 değerini verirsek Yıl hesabı sistemini doğru olarak başlatabilirz. Örnekle devam edelim.

mehmet

PCF8583 yerine PCF8563 daha iyi olacaktır. Hatta DS3232(3231)...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

transistor

#78
Günaydın,

Hocam simülasyonda bende de çalışıyor. Sonra yılı 2025 olarak kaydettiğim zaman eeprom 0 adresten 24 rakamını okudum ama 65 gördüm.



Dediğiniz gibi programın ilk satırlarına,

DATA @0,255

kodlarını ekledim. derledim yükledim. sonra kod satırını sildim tekrar yükledim. Ama aynı problem devam ediyor..

@mehmet, masa saati yapıcam değerlendireyim dedim, elimde ds1302 ile pcf8583 var. Bir daha ki sefere ds3231 almayı düşünüyorum.



mehmet

PCF8583 için, tam yıl kısmını bu entegrenin RAM alanında tutun.
08H yıl bitleri ile 0 tam yılı, 1,2,3 artık yılları gösterecek.
3'den 0'a düşünce; hem rtc RAM alanındaki yıl bilgisini hem de mcudaki yıl bilgisini güncelleyip eeprom alanına kaydedin. Bence daha rahat edersiniz.
Daha iyisi, yıl bilgisini tamamen mcu eeprom alanında tutun. Yılda bir kere yazılacak.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Şimdi biraz sesli düşünelim.
Sen baş tarafa DATA @ 0,255  satırını ekleyip, derleyip tekrar çalıştırdığında;
	READ 0,TAMYIL
	IF TAMYIL=255 THEN
	   TAMYIL=4
	   WRITE 0,TAMYIL
	ENDIF 
satırları devreye giriyor ve okunan tamyıl değeri 255 olduğu için TAMYIL=4 yapılıp kayıt alınıyor.

SET tuşu ile AYAR menüsüne girip saati ve yılı 23/06/25 şeklinde ayarladığın zaman program ;
	KAYIT:    
	      LCDOUT $FE,$0C     'REG_2  'SANIYE <0:5>
	      TEMP=Y_YIL+TAMYIL  'REG_3  'DAKİKA <0:5>
	      TAMYIL=4*(TEMP/4 ) 'REG_4  'SAAT   <0:5>
	      Y_YIL=TEMP-TAMYIL  'REG_5  'GUN    <0:5> ; YIL  <6:7>  
	      WRITE 0,TAMYIL     'REG_6  'AY     <0:4> ; HAFTANIN GUNU <5:7>       
satırlarına geliyor. Burada;
TEMP=25  (Y_YIL=21 ve TAMYIL=4 oluyor otomatikman);
TAMYIL=4 *(25/4)=24 olarak yeniden hesaplanıyor,
Y_YIL=TEMP-TAMYIL=25-24=1 olarak hesaplanıyor,
Tamyıl değeri yeniden sıfır nolu eprom adresine 24 olarak kayıt ediliyor.
Bu kadar işlemi neden yapıyoruz diyebilirsin. Burada yer alan Y_YIL değeri en fazla 3 olabiliyor. Dolayısıyla bunu 0-3 arası bir rakama hesap ederek denk getirip kalanı ise bizim kontrolümüzde olan TAMYIL değişkeninde tutabilmek amacı ile bunu yapıyoruz.
Bendeki program bu işi mükemmel yapıyor. Sendeki neden veya nerede sorun çıkartıyor pek anlamadım.
Ya elindeki program daha farklı veya bazı satırları değiştirilmiş yada sen farklı bir iş yapıyorsun.
Ben elimdekini buraya koyayım birde onunla dene istersen.

Ete

transistor

çok teşekkür ederim belki benden kaynaklanıyor ama simülasyonda çalışmasına rağmen verdiğiniz kodlarda da aynı problemi yaşıyorum. Ama üst üste 3-5 program atınca arada şöyle çalışıyor. O da eğer program atınca ilk çalışmada yıl 2005'den başlayınca kod mükemmel çalışıyor. (proteus da simüle ettiğimde ilk ekran geliyor ya 24.06.05 gibi)Donanımsal olarak defalarca, yazılımsal olarak verdiğiniz kodları satır satır kontrol ettim. Sadece CMCON=7 yazmamışım. Onu da ekledim ama entegre olamadım günlerdir uğraştım. Ben elimdeki ds1302 ile uğraşmayı düşünüyorum.

transistor

#82
Hocam ds1302 ile kodları toparladım ancak proteus da çalışmasına rağmen gerçek devrede saat ayarından sonra kayıt yapamıyorum. Kodlarıma göz gezdirme şansınız var mı?

#CONFIG
cfg = _XT_OSC
cfg&= _WDT_ON
cfg&= _PWRTE_ON
cfg&= _BODEN_OFF
cfg&= _LVP_OFF
cfg&= _CPD_OFF
cfg&= _WRT_OFF
cfg&= _DEBUG_OFF
cfg&= _CP_OFF
  __CONFIG cfg
#ENDCONFIG 
'Include "MODEDEFS.BAS"
ADCON1=7           'ADC GİRİŞLERİ DİGİTAL 
CMCON=7
OPTION_REG.7=1    'Dahili pull-up lar iptal edildi
TrisA=%00111111
PORTA=0
TrisB=%00000010
PORTB=0
TRISC=0
PORTC=0
TRISD=0
PORTD=0
'***************************************
SYMBOL   UP=PORTA.0
SYMBOL   DOWN=PORTA.1
SYMBOL   MODE=PORTA.2
RTC_DTA  var     PORTB.0
RTC_CLK  var     PORTB.1
RTC_RST  var     PORTC.0
'***********LCD Tanımlamaları***********
DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı? 
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor? 
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı? 
DEFINE LCD_EBIT 3          'LCD Enable Bacağı Hangi bite bağlı ? 
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ? 
DEFINE LCD_RSBIT 2         'LCD RS bacağı Hangi Bite bağlı ? 
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı? 
DEFINE LCD_LINES 4         'LCD Kaç sıra yazabiliyor 
DEFINE LCD_COMMANDUS 2500  'Command delay time in us 
DEFINE LCD_DATAUS 250      'Data delay time in us
'***********RTC DS1302 DEĞİŞKENLERİ***********
SURE    VAR BYTE : SURE=220
SN      VAR BYTE
DAK     VAR BYTE
SAAT    VAR BYTE
GUN     VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE
MEM     var byte
SAYI    VAR BYTE
DAY     var byte
ONLAR   VAR BYTE
BIRLER  VAR BYTE
'***********Değişken Tanımlamaları***********
CLR    VAR BIT
ARA    var byte
'***********LCD yi Kullanıma Hazır Hale Getir***********
lcdout $FE,1 : PAUSE SURE
'***********Program Başlangıcı***********        
Basla:

    gosub Zaman_Oku
    GOSUB EKRAN
    PAUSE 10

    if MODE=0 then
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO AYAR
    ENDIF  
       
Goto Basla
'***********Ekran***************
EKRAN:

    lcdout $FE,$80,dec2(Saat),":",dec2(Dak),":",dec2(Sn)
    lcdout $FE,$C0,dec2(Gun),"/",dec2(Ay),"/",dec2(YIL)
  
DORT: 
      select case ARA
       case 0
         lcdout $fe,$90,"PTS"
       case 1
         lcdout $fe,$90,"SAL"
       case 2
         lcdout $fe,$90,"CAR"
       case 3
         lcdout $fe,$90,"PER"
       case 4
         lcdout $fe,$90,"CUM"
       case 5
         lcdout $fe,$90,"CTS"
       case 6
         lcdout $fe,$90,"PZR"
        end select      
       RETURN 

EKRAN1:
    
    lcdout $FE,$80,dec2(Saat),":",dec2(Dak),":",dec2(Sn)
    lcdout $FE,$C0,dec2(Gun),"/",dec2(Ay),"/",dec2(YIL),$FE,$0E
    ARA=DAY

GOTO DORT
'***********AYAR***********
AYAR:

    GOSUB ZAMAN_OKU
    GOSUB EKRAN1 
    
HOUR:

    if UP=0 then
    saat=saat+1
    IF SAAT=24 THEN SAAT=0
    ENDIF
    
    IF DOWN=0 THEN
    SAAT=SAAT-1
    IF SAAT=255 THEN SAAT=23
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO MINUTE
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$81
    PAUSE SURE    

GOTO HOUR
            
MINUTE:

    if UP=0 then
    DAK=DAK+1
    IF DAK=60 THEN DAK=0
    ENDIF
    
    IF DOWN=0 THEN
    DAK=DAK-1
    IF DAK=255 THEN DAK=59
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO SECOND
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$84
    PAUSE SURE 
        
GOTO MINUTE

SECOND: 

    if UP=0 then
    SN=SN+1
    IF SN=60 THEN SN=0
    ENDIF
    
    IF DOWN=0 THEN
    SN=SN-1
    IF SN=255 THEN SN=59
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO DAYS
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$87
    PAUSE SURE     
    
GOTO SECOND            

DAYS:

    if UP=0 then
    GUN=GUN+1
    IF GUN=32 THEN GUN=1
    ENDIF
    
    IF DOWN=0 THEN
    GUN=GUN-1
    IF GUN=0 THEN GUN=31
    ENDIF

    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO MONTH
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$C1
    PAUSE SURE     
    
GOTO DAYS

MONTH:

    if UP=0 then
    AY=AY+1
    IF AY=13 THEN AY=1
    ENDIF
    
    IF DOWN=0 THEN
    AY=AY-1
    IF AY=0 THEN AY=12
    ENDIF

    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO YEAR
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$C4
    PAUSE SURE      
    
GOTO MONTH

YEAR:

    if UP=0 then
    YIL=YIL+1
    IF YIL=100 THEN YIL=25
    ENDIF
    
    IF DOWN=0 THEN
    YIL=YIL-1
    IF YIL=24 THEN YIL=99
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO HGUN
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$C7
    PAUSE SURE  
    
GOTO YEAR

HGUN:

    if UP=0 then
    DAY=DAY+1
    IF DAY=8 THEN DAY=1
    ENDIF
    
    IF DOWN=0 THEN
    DAY=DAY-1
    IF DAY=0 THEN DAY=7
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOSUB ZAMAN_YAZ
    GOTO BASLA
    ENDIF
    
    GOSUB EKRAN1
    LCDOUT $FE,$90
    PAUSE SURE      
    
GOTO HGUN
     
GOTO AYAR
'***********Zaman Oku***********
ZAMAN_OKU:

    high RTC_RST
    shiftout RTC_DTA, RTC_CLK, 0, [$BF]
    SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, day, YIL, MEM] 
    MEM=SN:GOSUB CEVIR:SN=SAYI  
    MEM=DAK:GOSUB CEVIR:DAK=SAYI
    MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
    MEM=GUN:GOSUB CEVIR:GUN=SAYI
    MEM=AY:GOSUB CEVIR:AY=SAYI
    MEM=YIL:GOSUB CEVIR:YIL=SAYI
    MEM=day:GOSUB CEVIR:day=SAYI
    low RTC_RST
    
return
'***********Zaman Yaz***********
ZAMAN_YAZ:
    MEM=SN:GOSUB TERSCEVIR:SN=SAYI
    MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
    MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
    MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
    MEM=AY:GOSUB TERSCEVIR:AY=SAYI
    MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI
  
    high  RTC_RST 
    SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]
    low RTC_RST : PAUSE 1 
    high RTC_RST          
    SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, day, YIL, 0] 
    low RTC_RST : PAUSE 1
return
'***********Çevir***********               
CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
RETURN  
'***********Ters Çevir***********
TERSCEVIR:                
    ONLAR=MEM DIG 1
    ONLAR=ONLAR<<4
    BIRLER=MEM DIG 0
    SAYI=ONLAR+BIRLER
RETURN    
'**********LCD TEMIZLE**********
LCDCLR:
      IF CLR=1 THEN
      CLR=0
      LCDOUT $FE,1
      PAUSE 50
      ENDIF
RETURN
'*****************************
end

mehmet

#83
Ben BASIC konusunda kötüyüm. Ancak, bir kaç "gosub" ile gidilen yerlerde "return" ile dönüş yok. Tabi bu benim cehaletim ile ilgili olabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Mehmet,
Bütün gosub lara baktım ama dönüşü olmayanı bulamadım. Acaba satır numarası veya başka bir işaretle yer belirtebilirmisin.

Ete


ete

#85
Transistör,
,Progranda fazla kusur bulamadım. Bir kaç eksik şey vardı onları tamamladım.
Birincisi ZAMAN_OKU etiketi altında. Aşağıdaki şekilde olmalı.

        high RTC_RST
        shiftout RTC_DTA, RTC_CLK, 0, [$BF]
        SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, day, YIL, MEM] 
        MEM=SN:GOSUB CEVIR:SN=SAYI  
        MEM=DAK:GOSUB CEVIR:DAK=SAYI
        MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
        MEM=GUN:GOSUB CEVIR:GUN=SAYI
        MEM=AY:GOSUB CEVIR:AY=SAYI
        MEM=YIL:GOSUB CEVIR:YIL=SAYI
        MEM=day:DAY=mem & %00000111
        low RTC_RST        
    RETURN

İkincisi ZAMAN_YAZ etiketi altında ve oda aşağıdaki şekilde olmalı.
    ZAMAN_YAZ:
        MEM=SN:GOSUB TERSCEVIR:SN=SAYI
        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
        MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
        MEM=AY:GOSUB TERSCEVIR:AY=SAYI
        MEM=DAY:DAY=MEM&%00000111
        MEM=YIL:GOSUB TERSCEVIR:YIL=MEM                                                                                                                                                                                                                                        TERSCEVIR:YIL=SAYI
      
        high  RTC_RST 
        SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]
        low RTC_RST : PAUSE 1 
        high RTC_RST          
        SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, day, YIL, 0] 
        low RTC_RST : PAUSE 1
    RETURN 

Programın başında PORT tanımlamalarında TRISB=%00000010 şeklinde bir ifade mevcut. Buda yanlış. Tamamı sıfır olmalı o bitlerin. 1 yapılmış olan PORTB.1 pini aslında DS1302 nin CLK pini olup kesinlikle giriş pini olamaz.

Ayar yaptıktan sonra underline cursor açık kalıyor. Bu nedenle SET tuşuna basılıp ayarlar kayıt edildikten sonra underline cursor off yapılıp ondan sonra başa dönülmeli.

ete

transistor

#86
Teşekkür ederim Hocam. Düzenledim, güzelde çalıştı.

Alıntı yapılan: ete - 24 Haziran 2025, 21:31:29Ayar yaptıktan sonra underline cursor açık kalıyor. Bu nedenle SET tuşuna basılıp ayarlar kayıt edildikten sonra underline cursor off yapılıp ondan sonra başa dönülmeli.

ete

Alıntı YapPICBASIC'te kullanılan LCD komutları

$FE,1 Ekranı siler.
$FE,2 Satir basına dön
$FE,$0C İmleç(Kursör) görüntüsünü yok eder
$FE,$0E İmleci alt çizgi biçimine getirir
$FE,$0F İmleci yanıp/Soner yapar
$FE,$10 İmleci 1 pozisyon sola getirir
$FE,$14 İmleci 1 pozisyon saga getirir
$FE,$C0 İmleci ikinci satirin başına getirir
$FE,$94 İmleci üçüncü satirin başına getirir
$FE,$D4 İmleci dördüncü satirin başına getirir

hocam, underline cursor dediğiniz lcd çıktısında ki ,$0e mi? Zaten, aşağıdaki kod satırından dönüş yapıldığında lcdout $fe,1 komutunu versem bile ana programda kürsör hızlı yanıp sönüyor. Yani demek istediğiniz lcdout $fe,0c komutunu vermem gerekiyor. Doğru mu anlamışım.

Hocam basic'de komutların kullanımları ile ilgili kısayollar yada kullanım şekilleri hakkında makale var mıdır?

Kodlar,


#CONFIG
cfg = _XT_OSC
cfg&= _WDT_ON
cfg&= _PWRTE_ON
cfg&= _BODEN_OFF
cfg&= _LVP_OFF
cfg&= _CPD_OFF
cfg&= _WRT_OFF
cfg&= _DEBUG_OFF
cfg&= _CP_OFF
  __CONFIG cfg
#ENDCONFIG 
'Include "MODEDEFS.BAS"
ADCON1=7          'ADC GİRİŞLERİ DİGİTAL 
CMCON=7
OPTION_REG.7=1    'Dahili pull-up lar iptal edildi
TrisA=%00111111
PORTA=0
TrisB=%00000000
PORTB=0
TRISC=0
PORTC=0
TRISD=0
PORTD=0
'***************************************
SYMBOL  UP=PORTA.0
SYMBOL  DOWN=PORTA.1
SYMBOL  MODE=PORTA.2
RTC_DTA  var  PORTD.0
RTC_CLK  var  PORTD.1
RTC_RST  var  PORTD.2
'***********LCD Tanımlamaları***********
DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı? 
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor? 
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı? 
DEFINE LCD_EBIT 3          'LCD Enable Bacağı Hangi bite bağlı ? 
DEFINE LCD_RSREG PORTB    'LCD RS Bacağı Hangi Porta bağlı ? 
DEFINE LCD_RSBIT 2        'LCD RS bacağı Hangi Bite bağlı ? 
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı? 
DEFINE LCD_LINES 4        'LCD Kaç sıra yazabiliyor 
DEFINE LCD_COMMANDUS 2500  'Command delay time in us 
DEFINE LCD_DATAUS 250      'Data delay time in us
'***********RTC DS1302 DEĞİŞKENLERİ***********
SURE    VAR BYTE : SURE=220
SN      VAR BYTE
DAK    VAR BYTE
SAAT    VAR BYTE
GUN    VAR BYTE
AY      VAR BYTE
YIL    VAR BYTE
MEM    var byte
SAYI    VAR BYTE
DAY    var byte
ONLAR  VAR BYTE
BIRLER  VAR BYTE
'***********Değişken Tanımlamaları***********
CLR    VAR BIT
ARA    var byte
'***********LCD yi Kullanıma Hazır Hale Getir***********
lcdout $FE,1 : GOSUB ZAMAN_OKU : PAUSE SURE
'***********Program Başlangıcı***********        
Basla:

    if MODE=0 then
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO AYAR
    ENDIF 
    
    gosub ZAMAN_OKU
    GOSUB GUN_YAZ

    lcdout $FE,$80,dec2(Saat),":",dec2(Dak),":",dec2(Sn)
    lcdout $FE,$C0,dec2(Gun),"/",dec2(Ay),"/",dec2(YIL)

    PAUSE 100
      
Goto Basla 
'***********AYAR***********
AYAR:

    GOSUB ZAMAN_OKU
    GOSUB GUN_YAZ
    GOSUB EKRAN1 
    
HOUR:

    if UP=0 then
    saat=saat+1
    IF SAAT=24 THEN SAAT=0
    ENDIF
    
    IF DOWN=0 THEN
    SAAT=SAAT-1
    IF SAAT=255 THEN SAAT=23
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO MINUTE
    ENDIF
    
    GOSUB GUN_YAZ    
    GOSUB EKRAN1
    LCDOUT $FE,$81
    PAUSE SURE    

GOTO HOUR
            
MINUTE:

    if UP=0 then
    DAK=DAK+1
    IF DAK=60 THEN DAK=0
    ENDIF
    
    IF DOWN=0 THEN
    DAK=DAK-1
    IF DAK=255 THEN DAK=59
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO SECOND
    ENDIF
    
    GOSUB GUN_YAZ    
    GOSUB EKRAN1
    LCDOUT $FE,$84
    PAUSE SURE 
        
GOTO MINUTE

SECOND: 

    if UP=0 then
    SN=SN+1
    IF SN=60 THEN SN=0
    ENDIF
    
    IF DOWN=0 THEN
    SN=SN-1
    IF SN=255 THEN SN=59
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO DAYS
    ENDIF
    
    GOSUB GUN_YAZ
    GOSUB EKRAN1
    LCDOUT $FE,$87
    PAUSE SURE    
    
GOTO SECOND            

DAYS:

    if UP=0 then
    GUN=GUN+1
    IF GUN=32 THEN GUN=1
    ENDIF
    
    IF DOWN=0 THEN
    GUN=GUN-1
    IF GUN=0 THEN GUN=31
    ENDIF

    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO MONTH
    ENDIF

    GOSUB GUN_YAZ    
    GOSUB EKRAN1
    LCDOUT $FE,$C1
    PAUSE SURE    
    
GOTO DAYS

MONTH:

    if UP=0 then
    AY=AY+1
    IF AY=13 THEN AY=1
    ENDIF
    
    IF DOWN=0 THEN
    AY=AY-1
    IF AY=0 THEN AY=12
    ENDIF

    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO YEAR
    ENDIF

    GOSUB GUN_YAZ    
    GOSUB EKRAN1
    LCDOUT $FE,$C4
    PAUSE SURE      
    
GOTO MONTH

YEAR:

    if UP=0 then
    YIL=YIL+1
    IF YIL=100 THEN YIL=25
    ENDIF
    
    IF DOWN=0 THEN
    YIL=YIL-1
    IF YIL=24 THEN YIL=99
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOTO HGUN
    ENDIF

    GOSUB GUN_YAZ    
    GOSUB EKRAN1
    LCDOUT $FE,$C7
    PAUSE SURE  
    
GOTO YEAR

HGUN:

    if UP=0 then
    DAY=DAY+1
    IF DAY=8 THEN DAY=1
    ENDIF
    
    IF DOWN=0 THEN
    DAY=DAY-1
    IF DAY=0 THEN DAY=7
    ENDIF
    
    IF MODE=0 THEN
    WHILE MODE=0 : WEND
    CLR=1 : GOSUB LCDCLR
    GOSUB ZAMAN_YAZ
    LCDOUT $FE,$0C
    GOTO BASLA
    ENDIF
    
    GOSUB GUN_YAZ
    GOSUB EKRAN1 
    LCDOUT $FE,$90
    PAUSE SURE      
    
GOTO HGUN
    
GOTO AYAR
'***********Ayar Ekranı***************
EKRAN1:

    lcdout $FE,$80,dec2(Saat),":",dec2(Dak),":",dec2(Sn)
    lcdout $FE,$C0,dec2(Gun),"/",dec2(Ay),"/",dec2(YIL),$FE,$0E
    
RETURN
'***********Gün Seçimi***************
GUN_YAZ:
    
    ARA=DAY
    
    select case ARA
    case 0
    lcdout $fe,$90,"PTS "
    case 1
    lcdout $fe,$90,"SAL "
    case 2
    lcdout $fe,$90,"CAR "
    case 3
    lcdout $fe,$90,"PER "
    case 4
    lcdout $fe,$90,"CUM "
    case 5
    lcdout $fe,$90,"CTS "
    case 6
    lcdout $fe,$90,"PZR "
    end select      

RETURN    
'***********Zaman Oku***********
ZAMAN_OKU:

    high RTC_RST
    shiftout RTC_DTA, RTC_CLK, 0, [$BF]
    SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, day, YIL, MEM] 
    MEM=SN:GOSUB CEVIR:SN=SAYI  
    MEM=DAK:GOSUB CEVIR:DAK=SAYI
    MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
    MEM=GUN:GOSUB CEVIR:GUN=SAYI
    MEM=AY:GOSUB CEVIR:AY=SAYI
    MEM=day:DAY=mem & %00000111    
    MEM=YIL:GOSUB CEVIR:YIL=SAYI
    low RTC_RST
    
return
'***********Zaman Yaz***********
ZAMAN_YAZ:
    MEM=SN:GOSUB TERSCEVIR:SN=SAYI
    MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
    MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
    MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
    MEM=AY:GOSUB TERSCEVIR:AY=SAYI
    MEM=DAY:DAY=MEM & %00000111
    MEM=YIL:gosub TERSCEVIR:YIL=SAYI
  
    high  RTC_RST 
    SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]
    low RTC_RST : PAUSE 1 
    high RTC_RST          
    SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, day, YIL, 0] 
    low RTC_RST : PAUSE 1
return
'***********Çevir***********              
CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
RETURN  
'***********Ters Çevir***********
TERSCEVIR:                
    ONLAR=MEM DIG 1
    ONLAR=ONLAR<<4
    BIRLER=MEM DIG 0
    SAYI=ONLAR+BIRLER
RETURN    
'**********LCD TEMIZLE**********
LCDCLR:
      IF CLR=1 THEN
      CLR=0
      LCDOUT $FE,1
      PAUSE 50
      ENDIF
RETURN
'*****************************
end

mehmet

#87
Mesela EKRAN1(Satır 100) den sonra GOTO DORT(Satır 106) var, bu stack taşmasına sebep olmaz mı? (82. mesajdaki)
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Mehmet,

Bahsini ettiğin şey stack taşması yaratmayacağı gibi taşmayı önler.
Şöyle düşün;
- EKRAN1 isimli etikete GOSUB ile geldin. Doğal olarak buradan RETURN ile dönmen gerekiyor. Ama EKRAN1 ve altında RETURN yok yerine GOTO DORT var. Burada program DORT isimli etikete giderek hem haftanın gününü ekrana yazdırır hemde o satırların sonunda yer alan RETURN komutu sayesinde geri dönüşü RETURN ile yapmış olur. Dolayısıyla orada bir kusur yok.

Ete

ete

DS1302 ile çalışan saat programında hoşuma gitmeyen bazı yerleri yeniden düzenledim.
Program ilişiktedir.
Ete

Powered by EzPortal
▲