DS3231 Saniye sorunu ?

Başlatan mustafa_cmbz, 09 Şubat 2020, 00:07:08

mustafa_cmbz

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

ete

#1
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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

OG

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.

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mucit23

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.

mustafa_cmbz

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.

mustafa_cmbz

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