Picproje Elektronik Sitesi

DERLEYİCİLER => Proton+ => Konuyu başlatan: mustafa_cmbz - 09 Şubat 2020, 00:07:08

Başlık: DS3231 Saniye sorunu ?
Gönderen: mustafa_cmbz - 09 Şubat 2020, 00:07:08
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
Başlık: Ynt: DS3231 Saniye sorunu ?
Gönderen: ete - 09 Şubat 2020, 08:39:52
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
Başlık: Ynt: DS3231 Saniye sorunu ?
Gönderen: OG - 10 Şubat 2020, 00:20:35
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.

Başlık: Ynt: DS3231 Saniye sorunu ?
Gönderen: Mucit23 - 10 Şubat 2020, 00:31:01
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.
Başlık: Ynt: DS3231 Saniye sorunu ?
Gönderen: mustafa_cmbz - 10 Şubat 2020, 04:06:23
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.
Başlık: Ynt: DS3231 Saniye sorunu ?
Gönderen: mustafa_cmbz - 10 Şubat 2020, 04:30:53
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