Merhabalar..
Modül şeklinde DS3231 Aldım ve bazı paylaşımlardan derlediğim kodlar ile çalıştırdım.
Fakat modülün saniye kısmı biraz sıkıntılı gibi geldi bana.
Misal:
73sn den sonra 80sn atlıyor ve devam ediyor. bunun gibi birkaç aralıkta da böyle atlamalar oluyor.Ayrıca saniye kısmı niye 0-59sn aralığında değil onuda anlamış değilim.Dakika kısmını gözlemlemedim daha.
Forumda bir konuda okuma aralığını sık tutarsanız sorun yaşarsınız falan demişler 2sn de bir okuma yaptırıyorum.Belkide derlediğim kodlarda bir sıkıntım var bilemiyorum.
Device = 18F25K22
Declare Xtal=20
All_Digital=TRUE
Declare SCL_Pin = PORTC.3 'DS1337 SCL pin 6
Declare SDA_Pin = PORTC.4 'DS1337 SDA pin 5
'Declare BUS_SCL = 1 'Negates use of PullUp resistor on SDA
Declare LCD_Type 0
Declare LCD_DTPin PORTB.0
Declare LCD_ENPin PORTB.5
Declare LCD_RSPin PORTB.4
Declare LCD_Interface 4
Declare LCD_Lines 2
Symbol BUZZER = PORTB.7
Output BUZZER
'---------------[CONSTANTS]-------------------------------------
Symbol WriteCtrl = %11010000
Symbol ReadCtrl = %11010001
Symbol RegAddress = %00000000
'********************************************
Dim Seconds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Dim Date As Byte
Dim Year As Byte
Dim Month As Byte
Dim Day As Byte
Dim CNTRL As Byte
Seconds = 0
Minutes = 5
Hours = 10
Date = 9 ' HAFTA
Year = 20
Month = 2
Day = 7
CNTRL = 0
Cls : DelayMS 300
HBStart
HBusOut WriteCtrl ,0, [Seconds,Minutes,Hours,Day,Date,Month,Year,CNTRL]'read seven registries
HBStop
Cls : DelayMS 300
ANA:
DelayMS 2000
GoSub READ_DS3231
Print At 1,1,Dec2 Hours,":",Dec2 Minutes,":",Dec2 Seconds
Print At 2,1,Dec2 Day,".",Dec2 Month,".",Dec2 Year,"-",Dec4 Date
GoTo ANA
'---------------[SUBROUTINES]-----------------------------------
READ_DS3231:
HBStart ' Start
HBusIn ReadCtrl,0 ,[Seconds,Minutes,Hours,Day,Date,Month,Year,CNTRL]'read seven registries
HBStop ' Stop
Return
https://datasheets.maximintegrated.com/en/ds/DS3231.pdf
Teorik olarak bir RTC kendi osilatörünü kullanarak saat pulslarını üretir ve yine kendi registerlerine bunları kayıt eder.
Senin programın ise her 1 sn de bir bu registerleri okuyup saat değerlerini almak zorundadır. Okuma işlemini her 2 sn de bir yaparsan bir birini takip eden sn değerlerini göremezsin. Belkide göreceğin şey 2 şer atlayan sn değeri olur. Tam 2 sn ye senkron tutturamayacağına göre zaman zaman farklı artışlarda görmen mümkün. Bütün bunları neden anlattım. Programında ilk başlangıçta 2000 ms lik bir gecikme görüyorum. Bu gecikme Rtc yi en az 2 sn de bir okuduğun anlamına gelir. İşe tsm sn değişiminde başlamadığına göre sen sn değişimini bazen 1 bazen 2 sn farklarla yakalarsın.
Yapılacak iş şu program döngünü öyle oluşturacaksınki hiç bir zaman 1 sn limitini aşmayacak. Böylece saniye artışların doğru gider. Rtc yi sıklıkla okumakda nir çözüm ama bu seferde Rtc kendi içinde zorlanır ve register değişimi aksayabilir.
Saniye değerlerinin neden aralık dışı olduğu konusunda bir fikrim yok. İlk defa böyle bir şey gördüm. Bu konuda saat ayarlarında bir sorun bar diyebilirim ancak. Ancak Orogramın başında saat değerlerini direk yazdığını gördüm. Okurken de direk okuyup ekrana Veriyorsun. Buda yanlış.
Rtc Bcd formatı kullanır. Genelde rakamın (sn dak veya saat) birler hanesi , 4 bit olarak ilk 4 bit de yer alır onlar hanesi ise sonraki 4 bitde yer alır. Bu nedenle hem yazarken hemde okurken bu formata göre yazılan ve okunan sayıları çevirmen gerekir.
Ete
http://www.protonbasic.co.uk/showthread.php/75090-Oh-dear.-Strange-things-with-a-DS3231?highlight=DS3231
BCD dönüşümü örneğini buradan alabilirsin.
Alttaki uyarıyı da atlamamalısın
Alıntı YapOkuma işlemini her 2 sn de bir yaparsan bir birini takip eden sn değerlerini göremezsin.
"RTC'yi çok sık okumak iyi değil" denmesi sürekli arka arkaya okumak için doğru.
Okuduktan sonra en azından 5-10ms gecse iyidir.
En makbul olanı SQW çıkışını 1HZ olarak ayarladıktan bu çıkışı mcu'ya girip, sonra MCU tarafına ext int oluşturacak şekilde ayarlayıp kesme içerisinde güncel değerleri okumak. Bu şekilde hem gereksiz okuma yapılıp mcu meşgul edilmez hemde geç okuma yapılıp saniye atlanılmaz.
Alıntı yapılan: OG - 10 Şubat 2020, 00:20:35http://www.protonbasic.co.uk/showthread.php/75090-Oh-dear.-Strange-things-with-a-DS3231?highlight=DS3231
BCD dönüşümü örneğini buradan alabilirsin.
Alttaki uyarıyı da atlamamalısın
"RTC'yi çok sık okumak iyi değil" denmesi sürekli arka arkaya okumak için doğru.
Okuduktan sonra en azından 5-10ms gecse iyidir.
Verdiğin linkteki kodlar gayet güzel ve kısa realde denemedim ama Proteusta DS3232 ile deniyorum sorunsuz çalışıyor.
http://www.protonbasic.co.uk/showthread.php/78682-DS3231-Alarm-settings-anybody?highlight=sim800
Burada da çevrim olayına güzel örnekler var.sanırım komut haline getirilmiş.
'---------------------------------------------------------------
' Decimal to BCD converter
' Input : pBytein
' Output :
' Notes : ByteOut = ((Bytein / 10) << 4) + (ByteIn // 10)
'
Proc BinToBCD(pDecIn As Byte), Byte
Result = ((pDecIn / 10) << 4) + (pDecIn // 10)
EndProc
'---------------------------------------------------------------
' BCD to Decimal converter
' Input : WREG
' Output : WREG
' Notes : Work with the two nibbles. Multiply the high nibble by 10, then add the low nibble to it
' : ByteOut = ((ByteIn >> 4) * 10) + (ByteIn & $0F)
'
Proc BCDToBin(pBCDin As Byte), Byte
Result = ((pBCDin >> 4) * 10) + (pBCDin & $0F)
EndProc