Bildirimler
Tümünü temizle

RTC modül ile milis() fonksiyonu oluşturulabilir mi?

2 Yazılar
2 Üyeler
0 Likes
33 Görüntüleme
(@karavela_1538)
Aktif Üye
Katılım : 3 ay önce
Gönderiler: 14
Konu başlatıcı  

RTC modülden okuduğum verilerle bir milis fonksiyonu gibi fonksiyon oluşturabilir miyim? Birkaç şey denedim ama yapamadım? 


Alıntı
devreyakan
(@devreyakan)
Yönetici Admin
Katılım : 3 sene önce
Gönderiler: 55
 

Merhaba, oluşturabilirsiniz bir kaç örnek paylaşayım:

uint32_t rtc_millis() { return (RTCtimeinsec() * 1000) + (millis() % 1000); }

Saniyeleri RTC'den alıp mod olarak milise ekleyebilirsiniz, bu sayede yüksek doğruluk sağlanabilir ama ne kadar yararlı olur test etmek gerekiyor.


Bu kodda ise aslında milis yerine rtc'den gelen verilerle işlem yapılabiliyor, örnek olarak kullanılabilir:

int dakika = 0;
int onceki_dakika = -9999; // negatif büyük kısım
int dakika_fark;
void setup() {}
void loop() {

  dakika = rtc.min(); // 0-59 aralığında
  dakika_fark = dakika - onceki_dakika;
  if (dakika_fark < 0) {  // yeni bir saate başlarsak bu olacak
    dakika_fark += 60;  // bu eksik saati düzeltir
  }
  if (dakika_fark >= 10) { // her 10 dakika arayla burayı yap

    //ornek islemler

    onceki_dakika = dakika;
  }
  delay(123);
}

DS3231 veri sayfası, saniye altı çıktıların beş olası frekansı olduğunu ortaya koymaktadır,

  1. 32 KHz
  2. 1 KHz
  3. 1.024 KHz
  4. 4.096 KHz
  5. 8.192 KHz

Bu son dört seçenek, RS1 ve RS2 kontrol bitlerinin çeşitli kombinasyonları ile elde edilir.

Örneğin, tam milisaniye elde etmek için seçenek 2, 1KHz'i hedeflersiniz. RS1 = 0 ve RS2 = 0 ve INTCN = 0 olarak ayarlarız. Ardından, cihazın !INT/SQW pininden Arduino'nuzdaki bir dijital giriş pinine kadar olan kesintileri yakalamak için bir ISR'ye ihtiyacımız olacaktır.

volatile uint16_t milliseconds;  // volatile burada önemli çünkü bu değişkeni bir kesme hizmeti rutini içinde değiştiriyoruz:
ISR(INT0_vect) // ya da hangi pin-interruptu seçerseniz
{
    if (milliseconds == 999)  // sıfıra döndür
        milliseconds = 0;
    else
        ++milliseconds;
}

ya da

const int RTCpin = 3; // ya da farklı bir dijital pin
void setup()
{
    pinmode(RTCpin, INPUT);
    // INT0 interrupt aktifleştirme
    GICR |= ( 1 < < INT0);
    // sinyal değişikliği kesintiyi tetikler
    MCUCR |= ( 1 << ISC00);
    MCUCR |= ( 0 << ISC01);
}

Bu kodları çalıştırdıktan ve DS3231'in pin3'ünü seçtiğiniz bir dijital giriş pinine bağladığınızda, bu pin 1KHz'de veya her milisaniyede etkinleştirilecektir.


CevapAlıntı
Paylaş: