Arduino Timer1 Düzgün Çalışmıyor

Başlatan E-x8, 15 Temmuz 2017, 11:20:00

E-x8

Merhaba

Arduino Nano ile saat yapmaya çalışıyorum. Saati LCD ekrana yazdırıyorum. Olayımın 80%'i bu şekilde, kalan kısmıda lcd üzerine bir şeyler yazdırma.
Genel olarak ne yaptığımı anlattığıma göre soruna geçebilirim. Saat için Timer1'i kullanıyorum fakat yazılımsal saatim, 1 saat sonra(gerçek zamanda) 2sn geriye kayıyor.
Programı olabildiğince salt hale getirmeye çalıştım. Interrupt içinde hiç durmuyorum. Timer1 Arduino içinde Pwm'i ve servoları kontrol ediyormuş ben bunların hiç birini kullanmıyorum. Gecikmeye sebep olan ne olabilir?

Timer1 kurulumunu bu şekilde sağlıyorum.
void timer_kur() {
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 15624;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  sei();
}


İnterrupt içi şu şekilde, "zaman[2]" değişkeni saniyeyi tutan yer.
ISR(TIMER1_COMPA_vect) { //1Hz
  zaman[2]++;
}


Ana program kısmında sadece sorgu var, yani uzun uzun hiç bir fonksiyon yok. Saniye değişimi olduysa tüm işlemlerin yapılması 15-16 milisaniye tutuyor.
"seriport_fonk();" Seriporttan gelen bilgileri işlediğim yer içinde şöyle bir şey gelirse şunu yap kısmı var.
"tarih();" Saniye 60 olursa 0 yap, Saat 24 olursa 0 yap gibi klasik saati ayarlayan mekanizma var
"pencere(mod);" LCD ekrana neyin yazdırılacağını söyleyen fonksiyon
void loop()
{
  seriport_oku();
  if (zaman[2] != sn) { //sn değişimi
    seriport_fonk();
    tarih();
    pencere(mod);
    sn = zaman[2];
  }
}



void seriport_oku() {
  while (Serial.available()) {
    //delay(2);
    delayMicroseconds(80);
    c = Serial.read();
    veri += c;
  }
}



Tekrar belirteyim Loop içinde işlem varsa 15-16 milisaniye onun dışında 1milisaniye bile durmuyor. Interrupt içinde sadece değişken arttırılıyor, yoğun bir işlem hiç yok. Acaba neden 1 saatte 2sn geriye kayıyor? Timer1 ayarlamasında mı sıkıntı var?


Teşekkürler.

mehmet

Bu tip işler için, harici RTC elemanları
kullanılmaktadır. Örnegin;
DS3231
DS1307
DS1302
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

Kabil ATICI

Aynı işlemi başka timer için kullan. Kodun tamamını görmesek de verdiğiniz kod örneklerin de timer1 kullanılıyor. yinede bazı alt fonksiyonlarda kullanılıyor olabilir.


Timer istenilen zamanı karşılamıyorsa, onu ek sayıcı oluşturarak 1sn işlemini için kullanabilirsiniz.
ambar7

MrDarK

Arduino kütüphanesi dışında atmelin saf c kodları ile bir sayıcı yapıp incele. Ondan sonra sorunun arduino library'den mi yoksa donanımdan mı olduğuna karar verebilirsin. Kullandığın RC osilatörün frekansı düşündüğün frekans olmayabilir. Bunun için gelişmiş mcu'larda rtc kalibrasyonu var. Hatta mcu'nun iç osilatörünün frekansını ölçerek gerçek anlamda kaç Mhz'lik bir sinyal oluşturduğunu görebilirsin.

Bunları yapmakla yeter mi ? Eğer profesyonel birşey yapıyorsan yetmez çünkü bu osc frekans işleri sıcaklıkla da ilgili sapmalar yapabiliyor. Onun içinde mcu içindeki sıcaklığı ölçüp rtc kayma hesabına dahil etmen gerekiyor.

Kullandığın mcu'yu yapmak istediğin hassas bişey ise değiştirmeni öneririm. Yada bu işi profesyonelce yapan entegreleri donanımına eklemeni tavsiye ederim :)
Picproje Eğitim Gönüllüleri ~ MrDarK

Epsilon

#4
Alıntı yapılan: MrDarK - 16 Temmuz 2017, 11:34:07
Arduino kütüphanesi dışında atmelin saf c kodları ile bir sayıcı yapıp incele. Ondan sonra sorunun arduino library'den mi yoksa donanımdan mı olduğuna karar verebilirsin. Kullandığın RC osilatörün frekansı düşündüğün frekans olmayabilir. Bunun için gelişmiş mcu'larda rtc kalibrasyonu var. Hatta mcu'nun iç osilatörünün frekansını ölçerek gerçek anlamda kaç Mhz'lik bir sinyal oluşturduğunu görebilirsin.

Bunları yapmakla yeter mi ? Eğer profesyonel birşey yapıyorsan yetmez çünkü bu osc frekans işleri sıcaklıkla da ilgili sapmalar yapabiliyor. Onun içinde mcu içindeki sıcaklığı ölçüp rtc kayma hesabına dahil etmen gerekiyor.

Kullandığın mcu'yu yapmak istediğin hassas bişey ise değiştirmeni öneririm. Yada bu işi profesyonelce yapan entegreleri donanımına eklemeni tavsiye ederim :)

@MrDarK /veya bilen  arkadaşlar:

Aşağıdaki soruları bilmediğim için soruyorum

Sıcaklığın osilatör frekansına etkisi ne kadardır ?Örneğin 20 Mhz de de çalışan bir MCU sizin denemelerinizde kaç dereceye çıktı? ve bu sıcaklıklarda  frekansta ne kadarlık kaymaya sebeb oldu? Bu MCU nun yapmakta olduğu işte ne kadarlık hataya sebep oldu (RTC kullanılan bir uygulama için sormuyorum)

mehmet

Çok büyük etkisi var. Bu yüzden çok
hassas osilatör uygulamalarında
kristal, kontrollü olarak sabit sıcaklıkta
tutulur.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

E-x8

Cevaplar için teşekkür ederim. Ben hızlıca çözüm getirmek istemiştim fakat işler karışacaksa büyük oyuncaklarla(arm) yapmayı denemek daha güzel olabilir :)
Muhtemelen @MrDarK 'ın da dediği gibi bu gecikmeler Arduino Lib ile kaynaklı olabilir. Oturup C ile yazsam gecikmeler en aza inerdi.