12f629

svs

Üye
Katılım
9 Ocak 2007
Mesajlar
23
Puanları
1
Yaş
39
Arkadaşlar 12f629 ile her 45 dakikada bir 1. pin ve 2.pin den sırasıyla 30 sn sinyal almak istiyorum. Daha önce hiç 12f629 kullanmadım dahili osilatör kullanarak bunu nasıl yapabilirim bu pic ile ilgili örnek program verebilir misiniz.
 
Niye 12f kullanıyorsunki 16f84 , 16f628 istersen yapabilirim...Sıfırdan bişey yapacaksan böle zor bulunacak malzemeyi kullanmana gerek yok...Tanıdık malzemeleri kullanalım...
 
Elimde bir kaç tane 12f629 var zaten ve ban toplam 2-3 pin lazım onun için bu pici tercih ettim.
İlginiz için teşekkür ederim.
 
Elimde bir kaç tane 12f629 var zaten ve ban toplam 2-3 pin lazım onun için bu pici tercih ettim.
İlginiz için teşekkür ederim.


Az sayıda pin gerektiren uygulama için 12f629 doğru tercih olmuş,

Sorunun yanıtına gelince; dahili osilatörle zamanı tutturman biraz zor olabilir, aslında ds1302 ya da ds1307 gibi rtc entegrelerinden kullansan daha hassas zamanlama elde edebilirsin.

Hassasiyet çok önemli değilse aşağıdaki kod işini görecektir,

Kod:
#include <12F629.h>
#FUSES NOWDT, INTRC_IO, NOMCLR, PUT
#use delay(clock=4000000)
#define delay 1000


void main()
{
   set_tris_a(0b111100);
   int i;
   int sn=0;
   int dk=0;

   while(1)
   {
      delay_ms(delay);
      sn++;
      if(sn==60)
      {
         sn=0;dk++;
         if(dk==45)
         {
            dk=0;
            output_high(pin_a0);
            for(i=0;i<30;i++)
            {
               delay_ms(delay);
            }
            output_low(pin_a0);
            output_high(pin_a1);
            for(i=0;i<30;i++)
            {
               delay_ms(delay);
            }
            output_low(pin_a1);            
         }
      }
   } 
}


Başta tanımlı delay için 1000'in biraz üzerinde ya da altında rakamlar kullanarak istediğin zaman hassasiyetine yaklaşabilirsin.
 
Verdiğiniz bilgiler için teşekkür ederim .Elinize kolunuza sağlık.
 
#include <12F629.h>
#FUSES NOWDT, INTRC_IO, NOMCLR, PUT
#use delay(clock=4000000)
#define delay 10
int i;
int sn=0;
int dk=0;

void main()
{
set_tris_a(0b111100);

while(1)
{
delay_ms(delay);
sn++;
if(sn==60)
{ output_low(pin_a0);
output_low(pin_a1);
sn=0;dk++;
if(dk==60)
{
output_high(pin_a0);
for(i=0;i<30;i++)
{
delay_ms(delay);
}
output_low(pin_a0);
}
if(dk==120)
{
dk=0;
output_high(pin_a1);
for(i=0;i<30;i++)
{
delay_ms(delay);
}
output_low(pin_a1);
}
}
} }



Verdiğiniz kodlarda bir düzenleme yaptım.Hocam Fakat aklıma bir şey takıldı dahili osilatör ayar kodu (INTRC_IO) mu?
 
Verdiğiniz kodlarda bir düzenleme yaptım.Hocam Fakat aklıma bir şey takıldı dahili osilatör ayar kodu (INTRC_IO) mu?


Evet, intrc_io, dahili rc osilatörü devreye alıp (internal rc) kristal için ayrılmış bacakların giriş-çıkış (io) olarak kullanılmasını sağlar.

Diğer konfigürasyon bitlerinin neler olduğu bilgisini pic'in datasheet'inde, bunların nasıl yazılması gerektiğini de başlık dosyasında(12f629.h) bulabilirsiniz.
 
Teşekkür ederim.İyi günler iyi çalışmalar.
 
Sayın tyildizak' a ilave olarak;
32.768 Hz kristal kullanarak istediğiniz kararlılıkta zamanlamaları elde edebilirsiniz ve 1 input 3 outputu kullanabilirsiniz.

Niye 12f kullanıyorsunki 16f84 , 16f628 istersen yapabilirim...Sıfırdan bişey yapacaksan böle zor bulunacak malzemeyi kullanmana gerek yok...Tanıdık malzemeleri kullanalım...

12F serisi her yerde bulunan ve bu proje için en ideal(fiyat/performans) MCU. Tanıdık malzeme kullanmak da doğru bir yaklaşım değil. Bu mantıkla benim halen 6502 veya Z80 kullanmam gerekli idi. MCU ya göre proje seçmek yanlıştır. Projeye göre MCU seçmelisiniz. Bu ise bilmediğiniz MCU ları inceleyip, onları bilinir kılmakla mümkün olur.
 
Arkadaşlar çok basit bir önerim var.Kimse bunu ciddiye almıyor.En ucuz RTC masa saatleridir.Ucuzlukçudan 1 liraya bi masa saati al,içindeki osilatörü sök,osilatöre 1.5 volt ver(senelerce yeter o pil ona) ve osilatör çıkışını iki transistör ile işlemciye 5v'a yükseltilmiş olarak ver.İşlemci de her gelen palste kesme atsın ve ucuza rtc elde etmiş ol.Osilatör çıkışı 1Hz olduğundan hem daha kolay kod yazarsın karmaşık zamanlama hesaplarına girmezsin,hem işlemciyi yormazsın(yani işlemci bu sırada başka işler yaparken bu iş için sadece kesme ile ilgilenir),hem de RTC okumak yazmak için kodlarla cebelleşmez işlemci hafızasını doldurmaz kod tasarrufu yapmış olursun,ayrıca bu işi tek pin ile halletmiş olursun.Hem alarm kullanmak istersen işlemci ile ses üretip işlemci hafızasını doldurmaz ve işlemciyi meşgul etmezsin,aynı osilatörün alarmı ve buzzeri da var,onu kullanırsın.İstersen kendi tasarımım bir saatten bir örnek vereyim.
Kod:
DISABLE
KESME:          
          SN=SN+1
          toggle LED'SANİYEYİ 1 ARTIR,LAMBAYI YAK SÖNDÜR
          IF ALR=1 THEN LED=1'ALARM AYARLANIRKEN LEDİ SÖNDÜR
          IF mesgul=1 THEN LED=1'ALARM VEYA DERECE GÖSTERİRKEN LEDİ SÖNDÜR
          IF SN>59 THEN SN=0 : DK=DK+1  
          IF DK>59 THEN SA=SA+1 : DK=0 
          IF SA>23 THEN SA=0  
          SAAT_SURESI=SAAT_SURESI+1
          DERECE_SURESI=DERECE_SURESI+1
          INTCON.1=0'KESME BAYRAĞINI SIFIRLA
          RESUME'GELDİĞİN YERE DÖN
          ENABLE'KESMELER YENİDEN AKTİF
Tasarladığım saati de burada satıyorum zaten:
..............

Bu saatte bu osilatörü kulanıyorum ve hiç sorun oluşturmuyor,hem kod ve hafıza tasarrufu hem alarm...
 
Moderatör tarafında düzenlendi:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…