Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

RB0 kesmesi

Başlatan ertsen, 01 Haziran 2012, 00:11:17

ertsen

Merhaba arkadaşlar,

şu an bir proje üzerine çalışıyorum. amacım dahili eproma, enerji kesildiğinde ve geldiğinde tarih ve saatini kaydetmek. Enerji kontrolünü RB0 kesmesi kullanarak yapmayı düşündüm. Normalde ya düşen kenar ya da yükselen kenarda kullanılıyor bu kesme işlemi ancak her iki kenar tetiklemesinde de kesmeye gitmesini istiyorum. Bu işlemi nasıl yapabilirim?

pic :16f877  , derleyici CCS-C


yasinkir55

Bence bios pili kullan. Hafızanın sıfırlanmaması için hazıfaya kaydedip o bilgiyi tekrardan çekmen örneğin saat 12:00 kaydettin. Saat 15:00 tekrar çalıştırdın zaman yine 12:00 olarak devam eder. Onun için bios pili kullanman daha mantıklı olur diye düşünüyorum. Hatta pilin uzun gitmesini istiyorsan PIC normal zamanlar içeresinde saat saymaya devem etsin pil uzun gitsin dersen pause olarak uyutmayı dene.
Üniversite'de Benden Yardımını Esirgemeyen Sn. Serdar ÇİÇEK Hocama Çok Teşekkür Ederim. Bu Seviyeye Gelmemde Yardımları Kişisel Olarak Gelişmemde Hocama Tekrardan Çok Teşekkürlerimi Sunarım :)

Erol YILMAZ

ds1307 gibi RTCC lerin içinde kullanıcı için ayrılmış

56-Byte, Battery-Backed, General-Purpose RAM with Unlimited Writes

var.

Elektrik kesildiğinde buraya yazabilmen çok daha hızlı olur EEprom a göre...

taso

//basit olarak giriş sinyali 3.6 voltun altına düşerse değerlerin Kaydedilir.

int starter=1;

#int_lvd
stop_func(){
starter=0;

}







main(){
setup_low_volt_detect(lvd_36);

enable_interrupts(int_lvd);  //chipine göre değiştiriyorlar ismini 16f877 den kontrol etmelisin

startAgain: ;

while(starter){

program();


}

eprom_save();

starter=1;
 
goto startAgain;


}

ertsen

Arkadaşlar teşekkür ediyorum. Devrede bios pili kullanacağım. kodlara gömüldüm çıkmaya çalışıyorum :)

taso

ben o sorunu aştım yardımcı olabilirim

JOKERAS

Selam,
Düşen veya yükselen kenar interrupt'ı için PORT change kesmesini kullanabilirsiniz.
Ama daha farklı varyasyonlardada modellenebilir.

ertsen

 taso hocam, örnek kod  varsa memnun olurum. Ayrıca port change kesmeside mantıklı bir çözüm olabilir.
Teşekkürler

ertsen

Arkadaşlar Rb4-Rb7 kesmesi kullanmaya karar verdim. birkaçtane daha kontrol oluşacak gibi görünüyor.  hem yükselen hemde düşen kenar için birde örnek buldum. belki başka arkadaşlarında ihtiyacı olur.

#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
byte previous_b; // global variable (byte=unsigned int8)
#INT_RB
rb_isr() {
byte changes, port_b; // local variables
port_b=input_b(); // read portB (input or output)
changes = previous_b ^ port_b; // locate pins changed level (old xor new)
previous_b = port_b; // take a current reading and save it for next RB int
if (bit_test(changes,4)&& !bit_test(previous_b,4)){  output_low(pin_b0);} //b4 went low
if (bit_test(changes,5)&& bit_test (previous_b,5)){ output_high(pin_b1);} //b5 went high
if (bit_test(changes,6)&& bit_test(previous_b,6)){ output_high(pin_b0);} //b4 went high
if (bit_test(changes,7)&& !bit_test (previous_b,7)){ output_low(pin_b1);} //b5 went low
delay_ms (20); //debounce
}
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_b(0xF0);   // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış

   enable_interrupts(INT_RB);  // INT_EXT kesmesini aktif yapar
   enable_interrupts(GLOBAL);  // Aktif edilen kesmelere izin ver
      while(1); // Sonsuz döngü

   }


Bu arada ben bios pillerinin şarj olduğunu sanıyordum fakat lityum pillermiş. bu durumda DS1302 için bios pilimi  (CR2032) kullanmalı? yoksa şarjlı pil çeşitlerimi kullanmalı.


Tagli

Kesme icindeyken kenar ayarini degistirebilirsin bence. Bu sekilde isini gorur mu bilmiyorum.
Gökçe Tağlıoğlu

ertsen

Arkadaşlar sonunda projeyi bitirdim. Aşağıdaki linkten indirebilirsiniz. belki ihtiyacı olan arkadaşlara faydası olur. Projeji inceleyip önerisi olan arkadaşlarında tavsiyelerini bekliyorum.
https://rapidshare.com/files/2379426391/saat_kayit.rar

Eren Eraslan

ben bu iş için ds1307 RTC entegresi kullanmanı tavsiye ederim senin kodla yazıcağın işi donanımsal yapıyor. Ve gayet kullanışlı..
ccs c kullanıyorsan kütüphaneside var ,

http://datasheets.maxim-ic.com/en/ds/DS1302.pdf
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

ertsen

Alıntı yapılan: taso - 01 Haziran 2012, 10:49:04
//basit olarak giriş sinyali 3.6 voltun altına düşerse değerlerin Kaydedilir.

int starter=1;

#int_lvd
stop_func(){
starter=0;

}







main(){
setup_low_volt_detect(lvd_36);

enable_interrupts(int_lvd);  //chipine göre değiştiriyorlar ismini 16f877 den kontrol etmelisin

startAgain: ;

while(starter){

program();


}

eprom_save();

starter=1;
 
goto startAgain;


}

Arkadaşlar daha önce kodunu ve şemasınıda paylaştığım devreyi kurdum. Rb4 kesmesi kullanarak enerji kontrolünü yaptım ancak enerji geldiğinde kesme işlemi 2-3 defa tekrar ediyor. Delay komutları vs kullandım ama tekrarlama devam ediyor. acaba bir çözüm varmıdır yoksa Taso hocamın dediği gibi low_voltage_detect mi kullanmalıyım?

JOKERAS

Selam,"ertsen"...
Kesme rutinine girip Bayrak ve Enable sorgusu yaptıktan sonra
ilgili kesmenin Enable bitini kapat(False interrupt oluşmaması için) ve sonra kenar değiştir,
yükselen yada düşen kenar her ne ise tam tersine set et.
Kesme'deki işlemlerini yap ama,orada fazla takılma ne yapacaksan yapacağın işle ilgili  değişkenlerini update et,gerisini main içinde yaparsın.
Kesme rutininden çıkarken Enable bitini tekrar set et,
Şimdi yükselen kenar yada elektriğin gelmesini bekliyorsun.
Sanırım bu şekilde sorununuz çözülür.