Sayac, elektrik kesintisi ve eeprom

Başlatan ehliseyf, 21 Nisan 2015, 00:49:40

mehmet

Kesilmeyi algılayacak bir pini programda takip edin. Devrenize
böyle bir eklenti yapın. Algılama pininde değişim olunca
hemen ilgili değişkenleri e2proma yazdırın...

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"

ehliseyf

Alıntı yapılan: mehmet - 21 Nisan 2015, 11:50:13
Kesilmeyi algılayacak bir pini programda takip edin. Devrenize
böyle bir eklenti yapın. Algılama pininde değişim olunca
hemen ilgili değişkenleri e2proma yazdırın...


Hocam çözüm hoşuma gitti bu bana ortalama ne kadar zaman kazandırır ? 4 değişkenim var kayıt etmem gereken.Saat1, Saat2, dakika1, dakika2 şeklinde. Birde bu kesilmeyi algılamak için interrupt kullanmak mı gerekir,yoksa sabit bir pini sürekli mi kontrol etmeliyiz.
Code'm mu oturturum !

MrDarK

#17
ehliseyf, süre kısmını 5V regülatör çıkışına koyduğun kondanstor ile ayarlayabilirsin. Tabi regulator girişindeki kondanstor de etkiler.

Burada mehmet hocam güzel bi taktik paylaşmış fakat olurda bi şekilde o zener bozulursa mcunun pinini yüksek voltajdan kaybedersin. Çok sağlıklı durmuyor gibi geldi :)

mesaj birleştirme:: 21 Nisan 2015, 12:06:33

Alıntı yapılan: Karamel - 21 Nisan 2015, 11:15:54

mesaj birleştirme:: 21 Nisan, 2015, 11:25:39

Tamam :) simdi dusundumde buluruz.

Microcontroller 2.8uA cekiyorsa i = e/r den 1.178.571 ohm yani yaklasik 1 mohm.

Simdi equation da sadece t yi bilmiyoruz ki bizde bunu ariyoruz. equationdan t yi cekersek. ne kadar surede bosalacagini bulabiliriz.

Tamamen bosalmasi isimize yaramaz. bu yuzden rtc nin min. calisma voltage ini bulup. voltage i yerine koyup. t yi cekmemiz gerekir. bu equationdada o voltage a dusene kadar gececek olan sureyi bulmusnoluruz ki buda dayanma suresi olur?

Karamel sen bu işi çözdün :) Bu arada rtc'yi ayıramazsın mcu'dan :) Yani mcu'nun datasheet değerlerine göre değişebilir. Örnek verdiğim chip için min çalışma 1.65V. Fakat şöyle bir uyarı yapayım sana. Voltaj düştükçe RTC'nin kalibrasyonunu değiştirmemiz gerekecek ki saniye gereksiz yere kaymasın :) Kristalin çalışmasını etkiliyor voltaj vb bilimum şeyler
Picproje Eğitim Gönüllüleri ~ MrDarK

mehmet

#18
Mcu çok fazla akım çektirmiyorsa (bağlı displaylar, vb.) kesilir kesilmez
verileriniz yazılmış olur. Zamanlama kısmını hesaplamak lazım.
877 için yazma/silme tamamlanması süresi 8ms görünüyor.
4 değişken için 32ms. Büyük tolerans ile 100ms. Mcu dan çekilen
akıma göre bu süre değişecektir. Bir kaç deneme ile uygun kapasite
bulunabilir...

İnt. veya pin değişimi kullanmak programınızın durumuna göre
değişebilir. Buna siz karar verebilirsiniz...

Patates zenerlerden de uzak durmak gerekli...

Ek:
Her ne kadar hassas rtc yapmaya çalışsanız da bu pek mümkün
olamıyor. Mesla +/-20ppm hata yapan bir rtc(32768Hz) kristal ile
6 ayda 10 dakika oynama oluyor. Bu nedenle; ya hassasiyetten
ödün vereceğiz ya da internet bağlantısıyla saati güncelleyeceğiz.
Ortam sıcaklığının değişmesi de cabası...
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"

ehliseyf

#19
//#include <18f4550.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
 
// Denetleyici konfigürasyon ayarları
//#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#include <18F4550.h>

#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz FOR PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode) 
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
 
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(d)
#use fast_io(a)
#include <math.h>

#define   display_1   pin_A2
#define   display_2   pin_A3
#define   display_3   pin_A4
#define   display_4   pin_A5
#define   buton       pin_A1

int  onlar = 0, yuzler = 0, binler = 0, birler=0, sayac=0;

const int digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};
int i=0; // Tamsayı tipinde değişken tanımlanıyor
 
//****************** Timer0 Kesmesi *****************************
#int_timer0 // Timer0 kesmesi
void timer0_kesme () // Kesme fonksiyonu ismi
{
 set_timer0(60); // TMR0 değeri belirleniyor
 i++; // i değeri 1 arttırılıyor
 if (i==10) // i değeri 10'a eşitse RB0 çıkışı lojik-1 olsun
 output_high(pin_b0);
 if (i==20) // i değeri 20'ye eşitse RB0 çıkışı lojik-1 olsun ve i değeri sıfırlansın
 {
 output_low(pin_b0);
 sayac++;
 i=0;
 }
}
 
 void basla()
{
if(input(buton))
{ 
delay_ms(10);
while(input(buton))
{
onlar = 0;
yuzler = 0;
binler = 0;
birler=0;
i=0;
sayac=0;
}}


if(sayac==108)
{
sayac=0;
birler++;
if(birler==10)
      {
         onlar++;
         birler=0;
            if(onlar==6)
            {
            yuzler++;
            onlar=0;
               if(yuzler==10)
                  {
                     binler++;
                     yuzler=0;
                  }
              }
      }
      
}      

output_high(display_1);
output_d(digit[birler]);
delay_ms(1);

output_low(display_1);
output_high(display_2);
output_d(digit[onlar]);
delay_ms(1);

output_low(display_2);
output_high(display_3);
output_d(digit[yuzler]);
delay_ms(1);

output_low(display_3);
output_high(display_4);
output_d(digit[binler]);
delay_ms(1);
output_low(display_4);

 }

 
 
/********* ANA PROGRAM FONKSİYONU********/
 
void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı


 
 set_tris_a(0x02);
 set_tris_b(0x00); // B portu komple çıkış
 set_tris_d(0x00);
 output_a(0x00);
 output_d(0x00);
 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor
 
 setup_timer_0(RTCC_INTERNAL |RTCC_8_BIT | RTCC_DIV_256); // Timer0 ayarları yapılıyor
 set_timer0(60); // TMR0 değeri belirleniyor
 
 
 enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
 
 while(true) // Sonsuz döngü
 {

 birler=read_eeprom(0);
 onlar =read_eeprom(1);
 yuzler=read_eeprom(2);
 binler=read_eeprom(3);
 
 basla();
 
  write_eeprom(0,birler);
  
  
  
  
  write_eeprom(1,onlar);
  write_eeprom(2,yuzler);
  write_eeprom(3,binler);
  
 }
}


Deneme için 4550 kullandım.Normalde 16f628a ile yapılacak. Exm1 ile deneme yapıyorum.16f628a ya 7segment displayler bağlı değil.
Hatalarımı gördüm fakat düzeltmedim.İlk hali ile yükledim. 1 hata sürekli yazma işlemi yüzünden eeprom bitiyor. 2.hata yazma işleminin bitmesini beklemiyoruz.(8ms)
Code'm mu oturturum !

mehmet

#20
Ana döngü içerisinden e2prom yazma işlemini
çıkarınız. Belirli bir şart oluşunca yazma işlemi yaptırınız.
Yoksa bir kaç dakika içerisinde Çöpe giden bir işlemciniz
daha olacaktır.

Ana döngü içerisinde RAM değişkenleri kullanınız. Benim önerdiğim
gibi bir şart sağlayıcı yapnız. Bu pini takip ediniz. Bundan sonra
e2proma yazma işlemini yapnız. Okuma işlemini de
ana döngüden hemen önce RAM değişkenlerine alıp öyle başlatınız...
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"

Okan AKÇA

Düşük voltaj kesmesi  derdinize çare olur

Karamel

Alıntı yapılan: MrDarK - 21 Nisan 2015, 12:03:24
ehliseyf, süre kısmını 5V regülatör çıkışına koyduğun kondanstor ile ayarlayabilirsin. Tabi regulator girişindeki kondanstor de etkiler.

Burada mehmet hocam güzel bi taktik paylaşmış fakat olurda bi şekilde o zener bozulursa mcunun pinini yüksek voltajdan kaybedersin. Çok sağlıklı durmuyor gibi geldi :)

mesaj birleştirme:: 21 Nisan 2015, 12:06:33

Karamel sen bu işi çözdün :) Bu arada rtc'yi ayıramazsın mcu'dan :) Yani mcu'nun datasheet değerlerine göre değişebilir. Örnek verdiğim chip için min çalışma 1.65V. Fakat şöyle bir uyarı yapayım sana. Voltaj düştükçe RTC'nin kalibrasyonunu değiştirmemiz gerekecek ki saniye gereksiz yere kaymasın :) Kristalin çalışmasını etkiliyor voltaj vb bilimum şeyler

hocam aksam bilgisayarimin basina geceyim. 3.3v ile 1.65v arasinda 1.1mohm direnc uzerinden(2.8uA) discharge suresini hesaplayacagim ::)

ehliseyf

Alıntı yapılan: Okan AKÇA - 21 Nisan 2015, 15:37:53
Düşük voltaj kesmesi  derdinize çare olur
Hocam BOR'u mu kasdetmiştiniz ? Daha önce hiç kullanmadım biraz anlatabilir misiniz ? birde mümkünse kod parçası olarak örnek alsam çok iyi olur.

Alıntı yapılan: mehmet - 21 Nisan 2015, 15:12:49
Ana döngü içerisinden e2prom yazma işlemini
çıkarınız. Belirli bir şart oluşunca yazma işlemi yaptırınız.
Yoksa bir kaç dakika içerisinde Çöpe giden bir işlemciniz
daha olacaktır.

Ana döngü içerisinde RAM değişkenleri kullanınız. Benim önerdiğim
gibi bir şart sağlayıcı yapnız. Bu pini takip ediniz. Bundan sonra
e2proma yazma işlemini yapnız. Okuma işlemini de
ana döngüden hemen önce RAM değişkenlerine alıp öyle başlatınız...
Hocam dediklerinizi gözden geçiyorum. Bazı hataların bende farkındayım. Bu eeprom konusunda tecrübesizim.Yardımlar için teşekkürler.
Code'm mu oturturum !

Okan AKÇA

#24
Kesme ayarladiginiz voltaja besleme düştüğü zaman kesme olusur.  Kesmenin icinde kayıt yaparsınız birde Beslemeye  1000uf gibi kondansatör takmaniz yeterli olur

MrDarK

* PVD (Power Voltage Down) = Belli range değerleri seçilebiliyor diye biliyorum. Örneğin besleme 3.3V 3V'a ayarlanmış PVD sayesinde 1.6 ya düşene kadar süremiz olur.

* BOR (Brown Out Reset) diye geçer. MCU gibi dijital yapılar belli bir voltajın altına düşerse hafızalarında tuttuğu 1 ve 0'lara güven olmayacağından sistemi resetlemek gerekir.
Picproje Eğitim Gönüllüleri ~ MrDarK

mehmet

18?FX550 için BOR en az 2.V., RAM Data Retention en az 1.5V.
görülmekte. En alt BOR seviyesinden önce işlemlerimizin bitmesi
gerekli.
Bu arada 2V. besmele için en fazla 4MHz. çalışma hızımız
bulunmaktadır.

Kaynak: 18F4550 (39632c.pdf) kataloğu 28.0 bölüm...
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"

MrDarK

Alıntı yapılan: MrDarK - 21 Nisan 2015, 16:22:18
* PVD (Power Voltage Down) = Belli range değerleri seçilebiliyor diye biliyorum. Örneğin besleme 3.3V 3V'a ayarlanmış PVD sayesinde 1.6 ya düşene kadar süremiz olur.

* BOR (Brown Out Reset) diye geçer. MCU gibi dijital yapılar belli bir voltajın altına düşerse hafızalarında tuttuğu 1 ve 0'lara güven olmayacağından sistemi resetlemek gerekir.

Benim verdiğim değerler STM32L 'den hocam.
Picproje Eğitim Gönüllüleri ~ MrDarK

Karamel

#28
Alıntı yapılan: Karamel - 21 Nisan 2015, 15:47:54
hocam aksam bilgisayarimin basina geceyim. 3.3v ile 1.65v arasinda 1.1mohm direnc uzerinden(2.8uA) discharge suresini hesaplayacagim ::)


simdi pc basina gecebildim.

general formulumuz

V(t) = V(e^-t/RC) seklinde. bkz http://en.wikipedia.org/wiki/RC_time_constant

V = 3.3v

V(t) = 1.65v

R = 1.1mohm

C = 1 farad

t yi bilmiyoruz.


yerine koydugumuzda equation suna donusuyor.


1.65 = 3.3(e^-t/(1.1 x 10^6 x 1))

buradan t yi cekmeye calculus bilgim yetmedi........  :-\


mesaj birleştirme:: 21 Nisan 2015, 22:07:58

tamam buldum!!!



3.3 u 1.65 in altina bolu olarak attim. sol taraf 0.5 oldu.  ( 0.5 = e^-t/(1.1 x 10^6 x 1) )

sonra exponential dan kurtulmak icin her iki tafain ln ini aldim. ( -0.673 = -t/(1.1 x 10^6 x 1) ) oldu

eksiler birbirlerini goturdu. 0.673 x 1.1 x 10^6 x 1 den 740300 sn

buda 12338 dk

205.63 saat

8.56 gun e tekabul eder. islemlerde sorun yoksa dogru olmasi gerekir ::)

ehliseyf

#29
Hocam bundan sonrasında 1.65/3.3 yapsak 0.5 gelir. Sonrasında her iki tarafın ln'ni alsak devam etsek olmaz mı ? ben yaptım ama büyük sayı çıkınca devam etmek istemedim :) Aynı anda yapmış ve bulmuşuz işlemler doğru sanırım. Ama bu yüksüz olduğu zaman sanırım :S

mesaj birleştirme:: 21 Nisan 2015, 22:20:21

Alıntı yapılan: MrDarK - 21 Nisan 2015, 16:22:18
* PVD (Power Voltage Down) = Belli range değerleri seçilebiliyor diye biliyorum. Örneğin besleme 3.3V 3V'a ayarlanmış PVD sayesinde 1.6 ya düşene kadar süremiz olur.
Hocam pic16f628a için PVD değerine nereden bakacağız. Datasheet içinde PVD ve power voltage down kelimelerini aradım ama bulamadım.
Code'm mu oturturum !