Tekrarlayan zamanlayıcı hakkında (millis fonksiyonu)

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Herkese Merhaba,

Bir zamanlayici tasarladim, girilen degerde kendini surekli tekrarliyor. zaman degerini degistirebiliyorum. Tek sorun Millis fonksiyonu. enerji off/on olduğunda millis haliyle sifirliyor ve sistem en basa donuyor. aradaki farki da eepromda tutamiyorum ayrica millis in de maks. bir degeri var sifirlanmadan once resetleme yapiyorum, bu da ayri bir handikap. Sistem kapanmadığı surece bir sorun yok. Suan cozum bulamadim muallakta bekliyor.

RTC yi bir millis gibi kullanayim dedim, benzer durumu burada da yasadim. RTC yi tekrarlanan bir alarm gibi( ayni gun icinde) nasil kullanabilirim, onerisi olan? ( tek bir deger girerek)

Tesekkurler
Ali,
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Belirli aralıklarla iş mi yaptırmak istiyorsun? Enerji niye kesiliyor?
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Evet belirli aralıklar ile iş yaptırıyorum. Bunu millis komutuyla yapıyorum. Enerji neden kesiliyor; Şebeke hattına bağlı sistemim :) o yüzden kesilme ihtimali var. Çözüm olarak mini bir DC - DC battery charger yapmayi dusunuyorum sisteme paralel giriş sağlayıp kesinti anında max 3-4 saat ( en azından elektrik tekrar gelene kadar) işlemciyi besleme devam eder.

Yazılımsal olarak çözülme ihtimali var mı? Ben bulamadım.

Teşekkürler
Ali,
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
selam



iki ürünü alıp pil ve şarj olayını çözersin

ama rtc zaten pilli tekrar elektrik geldiğinde saat şaşmayacaktır fakat elektrik yokken işlem yapman için mecburi pile gerek var
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
selam



iki ürünü alıp pil ve şarj olayını çözersin

ama rtc zaten pilli tekrar elektrik geldiğinde saat şaşmayacaktır fakat elektrik yokken işlem yapman için mecburi pile gerek var

Teşekkürler cevapladığınız için,

peki bu 3.7V luk pil ile ardunio çalışabilir mi? Minumum 5V gerekli olduğu datasheet inde yazıyor. Seri yaparsak maliyetimiz artacak. Amacım ardunio nun hiç kapanmaması.

Teşekkürler,
Ali
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
arduino nun 3.3v luk girişide mevcut pinlerine bakarsanız +5 veya +3.3 hem giriş hem çıkış olarak çalışabilir
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
3.3V sadece çıkış olarak kullanılabiliyor diye biliyorum. Eğer bu mümkünse, işimi görür.

Teşekkürler,
Ali
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Saat tutulmayacaksa, sadece periyodik işlem yapılacaksa rtc'ye gerek yok. Ancak süreyi millis() ile sürekli sorgulamak pili hızlıca bitirir. Biraz datasheet kurcalayıp timer ile yapmanı öneririm.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Saate gerek yoktu, ilkin Projemde rtc kullanmadım, ardunio off/on olduğunda millis sıfırladığı için problem oluştu. 7 farklı durumu farklı sürelerde kontrol ediyorum ( bizim atelyedeki ustaların akıl almaz istekleri ) timer yetersiz kalıyor. RTC alarm ile yapalım dedik her seferinde 7 farklı deger girmek durumda kaldım. Alarm değerin üzerine her donguden sonra alarmı degerini eklemeyi deniyorum. Ref saatleri ve Ref dak larını doğru yerlere koyabilirsem olacak gibi. ( tekrarlanan alarm gibi )

Teşekkürler,
Ali
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
rtc işini rahatlıkla görür günün istediğin saati işlemlerini yaparsın
yüzlerce binlerce farklı grup lar oluştrup işlemlerini çözersin
rtc bilgisayarlada anakart ın saati unutmaması için kullanılan sistemdir
ister saniye ister saat ister gün ay yıl kontrolü yaparsın

yani iş yerinde her gün 12:00 de yemek molası vermek istersen saat 12:00 da verebilirsin
3-5 yılda 1-2 saniye sapma olur borsa işlemleri yapmıyorsan sorun olmaz

void loop() {
kontrolet(); //1saniyede bir kontrol edersin işlemine göre delay ı kaldırabilir veya uzatabilirsn
delay(1000);
}
void kontrolet() {
if (saat==rtc) {
istediğiniyap();
}
if (saat2==rtc) {
istediğiniyap2();
}
if (saat3==rtc) {
istediğiniyap3();
}
}
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
rtc işini rahatlıkla görür günün istediğin saati işlemlerini yaparsın
yüzlerce binlerce farklı grup lar oluştrup işlemlerini çözersin
rtc bilgisayarlada anakart ın saati unutmaması için kullanılan sistemdir
ister saniye ister saat ister gün ay yıl kontrolü yaparsın

yani iş yerinde her gün 12:00 de yemek molası vermek istersen saat 12:00 da verebilirsin
3-5 yılda 1-2 saniye sapma olur borsa işlemleri yapmıyorsan sorun olmaz

void loop() {
kontrolet(); //1saniyede bir kontrol edersin işlemine göre delay ı kaldırabilir veya uzatabilirsn
delay(1000);
}
void kontrolet() {
if (saat==rtc) {
istediğiniyap();
}
if (saat2==rtc) {
istediğiniyap2();
}
if (saat3==rtc) {
istediğiniyap3();
}
}
Katılıyorum, bakalım umarım başarılı olurum. Takıldığım yerde sizlerin fikirlerini alırım.

Teşekkürler,
Ali
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Üstadlar,
Eprom kaydını aşağıdaki gibi deger değişmiş ise yazdırıyorum. Burada bir problem yok,

if( EEPROM.read(15) != save_aKalem/100 ){
EEPROM.write(15, save_aKalem/100 );
}

Fazladan boolean kaydı tutacağım 5 farklı ünite için. Bunların değişme sıklığı korkutucu, aynı adrese günlük belkide 70 defa yazma işlemi yapılacak. Bunun gibi 5 farklı durum var eder 350. diğer gruplardan da günlük 50 gelse toplam 400 civarı günlük yazım işlemi olacak. Not: tüm adresler farklı, günlük eprom kayıt toplam miktarını belirtmek için yazdım

Epromm ömrü 100.000 bu değer tüm adresler için ayrı ayrı mı yoksa ortak bir değer mi? Ortak değer ise yandık :) 250 günde eprom tökezler.

Sizden gelen cevaba göre boolean durumlarını gerilim kontrolü yaparak yazdırmayı planlıyorum. Besleme gerilimi belli bir değerin altına düştümü kaydını yapsın kenera çekilsin. ( bunun için analog girişimde kalmadı artık bulacağız bir çare )

Son olarak
Teşekkürler,
Ali
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
98
Tepkime puanı
18
Puanları
8
Konum
istanbul
veri depolamak için sd kart kullan sd kart usb bellek eeprom yazma okuma sayıları aslında benzer mantıklar

ama sd kart ı 2-3 ayda bir değiştirip sorun yaşamazsın

bu arada eeprom write ile yüzbin küsür

eeprom put ile kullanırsan daha uzun birde eeprom kütüphanesine bakarsan tekrar son güncelleme ile daha da uzun kullanabilirsin eepromu
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
EEPROM.update() o yazdığın işlemi yapıyor zaten, yani kontrollü yazmayı. 100.000 ömür hücre başına. Belli bir yazımdan sonra eeprom adresini değiştirip devam edebilirsin. Bu şekilde mesela 10 byte veri yazıyorsan yazma ömrü 100 kat uzar.

Bir de çok fazla yazım gerektiren işlemler için şöyle bir ürün var. aliexpress.com/item/33010313163.html

Ferroelectric ram, çok güzel bir icat. Normal ram kadar hızlı yazıyor. Veri ömrü oda sıcaklığında 200 yıl. Yazma sayısı 1 trilyon.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
amenofis çok güzel bilgiler vermişsin teşekkürler. "Belli bir yazımdan sonra eeprom adresini değiştirip devam edebilirsin." Mantıklı bunu deneyeceğim.

Yazılım resetleme ile ilgili önerileriniz var mı? Millis değeri sıfırlanmadan önce reset yapmaya karar verdim. unsigned long tipi sıfırlamadan sonra normal işleyişine dönse de, sistemde sıfırlama esnasında yapı bozukluğu oluyor. 40 günde bir reset süresi ekledim. Resetten öncede kayıt alıyorum.

LCD menude dolaşırken işleyişin tamamen durması. menuden ne zaman çıkılırsa o zaman devam ediyor. Belli başlı parametreleri fazladan menu içerisine yazmam mantıklı olur mu? siz nasıl çözüyorsunuz?

void software_Reset() //
{
EEPROM.write(22, x);
delay(1);
EEPROM.write(23, y);
delay(1);
EEPROM.write(28, x1 );
delay(1);
EEPROM.write(29, y1 );
delay(1);
EEPROM.write(30, x11 );
delay(1);
EEPROM.write(31, y11 );
delay(1);
asm volatile (" jmp 0");
}
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Uygulamanın ayrıntılarını bilmediğim için net cevap veremem ama resetlemeye falan gerek olmaması lazım. Okunan millis değeri önceki okunandan küçükse başa sarmıştır ama bunun önemi yok. O anki millis değerini bir öncekinden çıkardığın zaman geçen süreyi bulmuş olursun. Başa sarmış olsa dahi durum değişmez, yani ekstra işleme gerek yok.

Zaten o yaptığın yazılımsal reset'in millisi sıfırlayacağını sanmıyorum. Sıfırlasa bile diğer libraryler bundan hiç hoşlanmaz. Program kesin hata verir. Avr'lerde watchdog kurarak hard reset atılabiliyor.

İşleyişin durmaması için kesme kullanacaksın. 2 yöntem var. Kötüsü, belli aralıklarla kesmeye gidip millis okumak. İyisi, bir sonraki işlem zamanına timer kurup millisi devre dışı bırakmak.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Uygulamanın ayrıntılarını bilmediğim için net cevap veremem ama resetlemeye falan gerek olmaması lazım. Okunan millis değeri önceki okunandan küçükse başa sarmıştır ama bunun önemi yok. O anki millis değerini bir öncekinden çıkardığın zaman geçen süreyi bulmuş olursun. Başa sarmış olsa dahi durum değişmez, yani ekstra işleme gerek yok.

Zaten o yaptığın yazılımsal reset'in millisi sıfırlayacağını sanmıyorum. Sıfırlasa bile diğer libraryler bundan hiç hoşlanmaz. Program kesin hata verir. Avr'lerde watchdog kurarak hard reset atılabiliyor.

İşleyişin durmaması için kesme kullanacaksın. 2 yöntem var. Kötüsü, belli aralıklarla kesmeye gidip millis okumak. İyisi, bir sonraki işlem zamanına timer kurup millisi devre dışı bırakmak.
Millis başa sarmışsa eğer, döngüye ulaştığı anda aktif eder. Nedeni kullandığımız işaretsiz veri tipinden kaynaklı. Kontrolsüz döngünün aktifliği sistemime zarar verecek. Bu nedenle reset atmak zorundayım.
örnek;
count =millis();

if((unsigned long) (count -lastcount >= time))
{
digitalWrite(10,LOW);
lastcount=count;
}

if (count>=250)
{
count=0;
}
Yazılımsal resette millis değerini sıfırlıyor. Bunuda test etmek kolay. Ama dediğiniz gibi diğer kütüphaneler bundan nasıl etkilenir güzel bir tespit. Zaten software reseti hakkında önerilmeyen bir durum olarak ortak bir görüş var. Ama neden olumsuz pek bilgi edinemedim.
watchdog mak 8sn çok az. onun yerine millis ile 49 gün sonra hard reset atarım. Mecburen bir pini bunun için feda edeceğim.

Son yazdığınız kesme ile ilgili 1.çözüm basit ama kötü dediniz. 2. çözüm için; Menuye giriş için kullanılan tus kontrol döngüsünden sonra ki tüm işlemler için ayrı timer mı kurmalıyım? Pek anlayamadım. Biraz daha açıklama yapabilir misiniz?

Menu içinde 60 sn lik bir koşul var, herhangi bir tuşa basılmassa eğer otomatik loop a dönüyor.

Teşekkürler,
Ali
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
36
Tepkime puanı
7
Puanları
8
Konum
Bursa
Şimdi burada millis() kullanma amacı "aradan şu kadar zaman geçtiyse şu işlemi yap" değil mi? Diyelim 45 dakika sonra bir işlem yapılacak. Bunun için millis() ile "45 dakika doldu mu?" diye sürekli sorgulamaya gerek yok. Zamanı gelince işlemi otomatik olarak yaptırmak mümkün. Eğer bunu millis ile yaparsan o sırada başka işlem yapamazsın.

Anladığım kadarıyla sen reset noktasını baz alıyorsun. Bu yüzden millisin sıfırlanması problem oluyor. Bence bu yanlış bir mantık. Onun yerine bir önceki işlem noktasını baz alırsan işler çok kolaylaşır.

Mesela şu şekilde değil de;
RESET
Resetten 1 saat sonra şu işlem
Resetten 2 saat sonra şu işlem
Resetten 3,5 saat sonra şu işlem

Bu şekilde;
1 saat sonra şu işlem
Son işlemden 1 saat sonra şu işlem
Son işlemden 1,5 saat sonra şu işlem

2. örnekteki gibi olursa millis'in sıfırlanması hiçbir problem teşkil etmez. Ayrıca millis'i komple devre dışı bırakıp donanımsal olarak çözmek te mümkün hale gelir.

watchdog olayını yanlış anlamışsın. Sisteme donanımsal reset atmak için kullanılabilir dedim. Yani harici bir pin kullanmaya gerek kalmadan.
 

alio1984

Üye
Katılım
9 Ağu 2019
Mesajlar
43
Tepkime puanı
1
Puanları
8
Konum
istanbul
Üstadım çok güzel yazmışsın gerçekten ama açıkcası millis olmadan nasıl yapılacağını kafamda canlandıramıyorum. işlem süreleri değişken değerler, kullanıcı ihtiyaca göre menuden girebiliyor, en buyuk handikap bu. Yani Belirli bir süre sonunda yapılan işlem sırası değişiyor.

Aşağıdaki durumu millis olmadan nasıl yapacağız? Gerçekten kafamda canlandıramadım.

1 saat sonra şu işlem
Son işlemden 1 saat sonra şu işlem
Son işlemden 1,5 saat sonra şu işlem

Teşekkürler,
Ali
 
Üst