Sayac, elektrik kesintisi ve eeprom

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

Karamel

hocam yanlisim yoksa 3.3v tan 1.65v a yukluyken discharge olan halini hesapladik.

simdi  aklimda soyle sorular olustu.

1. soru 8.5 gun iyi bir rakammi?
2. soru 3v luk su http://www.newark.com/productimages/standard/en_US/4933818.jpg piller ile ne kadar sure rtc mizi calistirabiliriz?

ehliseyf

Alıntı yapılan: Karamel - 21 Nisan 2015, 22:22:28
hocam yanlisim yoksa 3.3v tan 1.65v a yukluyken discharge olan halini hesapladik.
simdi  aklimda soyle sorular olustu.
1. soru 8.5 gun iyi bir rakammi?
2. soru 3v luk su http://www.newark.com/productimages/standard/en_US/4933818.jpg piller ile ne kadar sure rtc mizi calistirabiliriz?
Hocam extra pil kullanmak istemiyoruz. Şu devre işimizi görecek sanırım. Biz deşarj olduğu süreyi bulduk fakat sadece 2.8ua çektiğini düşünerek bulduk.
PVD ile araştırma yapıyorum ama henüz bir şey bulamadım.
Code'm mu oturturum !

MrDarK

Ehliseyf;

Pic16f serilerinde yoktu sanırım PVD.Hatta hangi serisinde var bilmiyorum fakat bi serisinde illa ki vardır. Dediğiniz gibi Bu değerler stm'ye göre hesaplandı. Böyle uzun süre bekleme yapılacaksa F'larla olacak iş değil bu :) F'ın amacı eeprom kaydı vb için olmalı bence
Picproje Eğitim Gönüllüleri ~ MrDarK

ehliseyf

Alıntı yapılan: MrDarK - 21 Nisan 2015, 23:19:52
Ehliseyf;

Pic16f serilerinde yoktu sanırım PVD.Hatta hangi serisinde var bilmiyorum fakat bi serisinde illa ki vardır. Dediğiniz gibi Bu değerler stm'ye göre hesaplandı. Böyle uzun süre bekleme yapılacaksa F'larla olacak iş değil bu :) F'ın amacı eeprom kaydı vb için olmalı bence
Hocam benim böyle uzun sürelere ihtiyacım yok ki. Ben sadece 4 değişken kayıt edeceğim. En kötü durumda 100ms yetiyor bana. Kesinti algılandıktan sonra 100 ms dayansa benim için yeterli.
Code'm mu oturturum !

Karamel

hocam. microcontrollerinizi size uyan en dusuk hizda calistirin.

bunlari soylemistim ama yine yazayim. microcontroller in vdd ucuna seri diyot baglayin. diyotun microcontroller ile arasina yani eksi ucuna buyukce bir kondansator baglayacagiz.

diyotun anot ucunu bir gpio ya goturun. hatta externat interrup bacagini kullansaniz daha iyi olur. dusen kenarda tetiklenip. interrupt icersinde eeprom kayitlarini yapin. zaten kisa cok kisa bir sure sonra capacitor uzerindeki voltage microcontroller a yetmeyecek vede sistem kendi kendini kapatmis olacaktir.


microcontrollerinizin cektigi akimi olcun. kac sn ye kac voltage gerekiyorsa bu bilgiler isiginda kullanmaniz gereken capacitorunuzun hesabini yapalim ::)

ehliseyf

İnternal osc kullansam yeterli hassasiyette çalışır mı ? 4mhz low power voltage 2 volt gözüküyor
Code'm mu oturturum !

ehliseyf

Zener diyot ve kondanatör ikilisi ile önerilen devreyi kullandım. Fakat kesmeler ve eeprom'a ilk açılıştaki yazma kısmında bir sorunum olduğunu düşünmekteyim. Kod ektedir.
#include <16F628a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
//#device high_ints=true
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                   //Master Clear pin used for I/O                
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)

#priority ext, timer0 

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

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

const int digit[10] = {0x7F, 0x0C, 0xB6, 0x9F, 0xCC, 0xDA, 0xFA, 0x0F, 0xFF, 0xDF};

int i=0; // Tamsayı tipinde değişken tanımlanıyor
 
   void eeprom_yaz()
 
{

 write_eeprom(0,birler);
 delay_ms(10);
 write_eeprom(1,onlar);
 delay_ms(10);
 write_eeprom(2,yuzler);
 delay_ms(10);
 write_eeprom(3,binler);
 delay_ms(10);
 
}
 
 //****************** INT Kesmesi *****************************
 #int_ext 
 void ext_kesmesi()
 {
 #use delay(clock=4000000)
   eeprom_yaz();
 }
 
 
//****************** 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_a6);
 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_a6);
 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==61)
{
sayac=0;
birler++;
if(birler==10)
      {
         onlar++;
         birler=0;
            if(onlar==6)
            {
            yuzler++;
            onlar=0;
               if(yuzler==10)
                  {
                     binler++;
                     yuzler=0;
                  }
              }
      }
      
}      

output_low(display_4);
output_low(display_3);
output_low(display_2);
output_high(display_1);
output_b(digit[birler]);
delay_ms(1);

output_low(display_4);
output_low(display_3);
output_low(display_1);
output_high(display_2);
output_b(digit[onlar]);
delay_ms(1);

output_low(display_4);
output_low(display_2);
output_low(display_1);
output_high(display_3);
output_b(digit[yuzler]);
delay_ms(1);

output_low(display_3);
output_low(display_2);
output_low(display_1);
output_high(display_4);
output_b(digit[binler]);
delay_ms(1);

 }


 
/********* ANA PROGRAM FONKSİYONU********/  
void main ( )
{
    
    
   setup_timer_0(RTCC_INTERNAL |RTCC_8_BIT | RTCC_DIV_256); // Timer0 ayarları yapılıyor
   set_timer0(60); // TMR0 değeri belirleniyor
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   ext_int_edge(H_TO_L);
   
  set_tris_a(0b00100000);
  set_tris_b(0b00000001);
  output_a(0x00);
  output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor
 
 
  birler=read_eeprom(0);
  delay_ms(10);
  onlar=read_eeprom(1);
  delay_ms(10);
  yuzler=read_eeprom(2);
  delay_ms(10);
  binler=read_eeprom(3);
  delay_ms(10);
 
  enable_interrupts(INT_EXT);
  enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
  enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
 
  

 
 while(true) // Sonsuz döngü
 {
basla();
 }
}
Code'm mu oturturum !

haydarpasamikro

Ben böyle bir proje yapmıştım. PIC in comparator girişi ve bunun interrupt(kesmesi) ile. ADC dönüştüme zaman kaybı olur. Besleme gerilimi referans değerin altına düşünce comparatör kesmesi ile sayaçları eeproma yüklüyoruz. PIC beslemesini bu durumda supercap (5.5V 2.2F) den alıyor. 5.5 V olması ile seri schottky diyotta 0.5V gerilim düşümü sonrası geri beslemeye 5V kalıyor. Enerji varken supercap seri diyot ile şarjda.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

hgs

Mcuyu değiştirin gitsin. F0 kullanırsınız tonla donanımı 1$ civarında alırsınız.

ADC kanalından "giriş beslemesi" izlenir. Gerektiğinde eeproma yazarsınız..

ehliseyf

Alıntı yapılan: haydarpasamikro - 24 Nisan 2015, 17:53:25
Ben böyle bir proje yapmıştım. PIC in comparator girişi ve bunun interrupt(kesmesi) ile. ADC dönüştüme zaman kaybı olur. Besleme gerilimi referans değerin altına düşünce comparatör kesmesi ile sayaçları eeproma yüklüyoruz. PIC beslemesini bu durumda supercap (5.5V 2.2F) den alıyor. 5.5 V olması ile seri schottky diyotta 0.5V gerilim düşümü sonrası geri beslemeye 5V kalıyor. Enerji varken supercap seri diyot ile şarjda.
Hocam karşılaştırma için yeteri kadar boşta bacağım yok inceledim 4 pin kullanmayı gerektiriyor. B0'ı zor boşa çıkarttım. B0 kesmesi ile yapabilsem süper olacak. Girişteki Eeprom'dan okuma işlemini kaldırınca sistem ilk hali ile çalışıyor ( kayıt yapmayan halde). Eepromdan okuma işlemini koyunca sanki çakılı kalıyor sürekli eeprom okuma kesmesine gidiyor gibi davranıyor. Ana programdaki sonsuz döngüye hiç girmiyor gibi davranıyor.

Alıntı yapılan: hgs - 24 Nisan 2015, 19:24:41
Mcuyu değiştirin gitsin. F0 kullanırsınız tonla donanımı 1$ civarında alırsınız.

ADC kanalından "giriş beslemesi" izlenir. Gerektiğinde eeproma yazarsınız..

Hocam çok mantıklı söylüyorsunuz. Şu işi bitireyim ARM mimarisine merhaba diyeceğim. Bıktık usandım PIC'ten. Alışkanlıklar tek tutan şey. Yeni bir yapı öğrenmek zor geldiğinden. ilk boş vaktimde ARM ile haşır neşir olacağım. Şuan için şu problemi çözmem gerekiyor.
Code'm mu oturturum !

ehliseyf

Code'm mu oturturum !

Karamel

#41
Hocam problem solving strategy diye bir yazi okumustum. bilgisayar basina gecince unutmasam bulup buraya eklemeye calisirim. simdi sorunlari bir ordu oladak dusunursek. bunlari ayni anda cozmeye calismamaliyiz. eger boyle yaparsak sorunlar bizi acik ara farkla yenerler. ama kucuk kucuk gruplar halinde sorunlari halt edebiliriz. oncelikle eeproma normal kayit yapmayi deneyin. bunu astiktan sonra. external interrupt ile bi led yakip sondurun. yani external int icersinde boyle bir function yazin ve hatta elektrik gidince led in yanik kalma suresinden eeproma yapacaginiz kaydin suresini asagi yukari belirleyin. daha sonra acilista eepromu okumayi deneyin. bunuda astiktan sonra en son external interrupt icersine eeprom kayit function larini yazin ve butun sorunlari cozun ::)

ehliseyf

Alıntı yapılan: Karamel - 26 Nisan 2015, 18:52:28
Hocam problem solving strategy diye bir yazi okumustum. bilgisayar basina gecince unutmasam bulup buraya eklemeye calisirim. simdi sorunlari bir ordu oladak dusunursek. bunlari ayni anda cozmeye calismamaliyiz. eger boyle yaparsak sorunlar bizi acik ara farkla yenerler. ama kucuk kucuk gruplar halinde sorunlari halt edebiliriz. oncelikle eeproma normal kayit yapmayi deneyin. bunu astiktan sonra. external interrupt ile bi led yakip sondurun. yani external int icersinde boyle bir function yazin ve hatta elektrik gidince led in yanik kalma suresinden eeproma yapacaginiz kaydin suresini asagi yukari belirleyin. daha sonra acilista eepromu okumayi deneyin. bunuda astiktan sonra en son external interrupt icersine eeprom kayit function larini yazin ve butun sorunlari cozun ::)

Hocam şuan eeprom başlangıç yazma işini çözdüğümü düşünüyorum. int_ext ile kayıt yapabiliyorum lakin bazı şartlarda. Kondansatörler girişte ve çıkışta sırasıyla 100u ve 1000u olmak üzere konumlandırıldı. Konuda bahsi geçen elektrik kesintisi için gerekli zener donanımı kuruldu. Eğer ki elektriği adaptörü prizden çıkartarak yaparsam kayıt yapmıyor( Sanırım içindeki kondansatörlerden ötürü zaman kaybediyoruz elektrik kesintisini geç algılıyoruz). ikinci olarak aynı adaptöre yük bağlarsam (ki bağlamak zorundayım) prizden de çıakrsam adaptörün ucundan de kessem kayıt alamıyorum. Tek kayıt aldığım nokta adaptörü yüksüz iken jacktan sökerek yapabiliyorum. Biraz kafa patlattıracak ama sonuçta öğrenmek emek ister. Yardımlarınız için minnettarım.
Code'm mu oturturum !

mehmet

Besleme tarafındaki kondansatörün küçük (hatta olmamalı),
diyottan sonraki kondansatörün büyük olması düşünülebilir.
İki kondansatör aynı anda boşaldığı için kesme oluşturamadan
mcu gerilimi bitmiş oluyor.
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 - 27 Nisan 2015, 09:10:09
Besleme tarafındaki kondansatörün küçük (hatta olmamalı),
diyottan sonraki kondansatörün büyük olması düşünülebilir.
İki kondansatör aynı anda boşaldığı için kesme oluşturamadan
mcu gerilimi bitmiş oluyor.

Hocam önündekini de değiştirdim sonrakini de değiştirdim tüm kombinasyonları denedim. Fakat bu adaptörün içindeki kondansatör hepsinden büyük sanırım. Başka bir önerisi olan var mı ?
Code'm mu oturturum !