16f628 in girişinden 3.6v ile 3.3v pic e farklı veriler olarak okutulabilir mi??

Başlatan hosiminh, 19 Nisan 2011, 17:03:05

hosiminh

arkadaşlar benim elimde 3.6 volt nickel cadmium bir pil var. Ben bu pilin bir ayağına direnç ve ardından led sürdüm, diğer ayağı da toprakta. Bu pilin + ucunun hemen çıkışından bir kablo uzatıp, pic in giriş ayaklarından bir tanesine girsem ve b portundan birtanesini de çıkış yapıp önüne led koysam; batarya voltajı 3.6 volt iken b çıkışımdaki led yanmasa, 3.3 volt olduğunda yavaş yavaş yanıp sönmeye başlasa ve 3.0v olduğunda hızlı hızlı yanıp sönse bunu yapmanın bir yolu var mı???? Varsa nedir yani pic 3.6 volt u 3.3 volt ve 3.0 volt u hep lojik 1 olarak mı alacak bunu pic e farklı veriler olarak okutmanın bir yolu var mı yardımcı olursanız çok sevinirim hepinize iyi çalışmalar.

yamak

Pic yaklaşık 2.5 voltun üzerini lojik 1 oara algılar.Söylediğin sadece 2 durum için yani 3.3 v de yavaş yavaş yanıp sönecek 3.6v de hızlı hızlı.bunun için bir opapm ı smith trigger olarak kullanarak 3.6 v u 5 v 3.3 v 0 volt yaparsın opamp ın çıkışını da pic e bağlarsın lojik 1 gelirse hızlı hızlı yanar lojik 0 gelirse yavaş yavaş yanar. Ama dediğin gibi 3 durum için de farklı şeyler yapacaksa ADC kullanman gerekir. Fakat 16f628de de ADC birimi yok.16F877 ile bunu rahatlıkla yapabilirsin.

hosiminh

peki nasıl yapabileceğim konusunda bir bilgin var mı varsa paylaşabilir misin ben hep pic i lojik 1 ve lojik 0 olarak kullandım. Biliyorsan yardımcı olursan çok sevinirim.

yamak

ADC kullanarak adc pinlerine bağlı bir gerilim kaynağında gelen gerilimin kaç volt olduğunu ölçebilirsin.Ölçtüğün gerilime göre de işlem yaptırabilirsin.Forumda adc ile ilgili bir çok şey bulabilirsin.

LukeSkywalker

12F675 kullanarak yapabilirsiniz. ADC kullanmanız şart bunun için. MikroC'yi araştırın ne kadar kolay olduğunugöreceksiniz.

bayelektronik

pic in comparaotrunu kullanabilirsin.comparatorun bir ucunu donanımsal vref ile 3.3 volta ayarlarsın ve diğer ucuna 3.6 voltu bağlarsın.gerekli yazılımı yazdığında olacağını düşünüyorum uygulama fırsatım olmadı.fikir vermesi açısından yazdım

subram

16f628 ile aynı kılıfta bulunan 16f88 var. içinde ADC modül var. bununla pildeki voltajın her kademesini(yazılımını iyi yazmak şartı ile) kontrol edebilirsiniz. 3,6V 3,5V .... 3,1V 3,0V gibi.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

hosiminh

evet şimdi zaten projemi 16f88 e aktardım adc modu varmış içinde sabahtan beri buna uğraşıyorum. Fakat bulduğum şeyler hep münferit yani mesela
while(1)
{
set_adc_channel(5); // yani burada kanal 5 i anologtan dijitale dönüştür muhabbetine sok eee peki soktum.
delay_us(20); // bu da işin rajonuymuş tamam o da oldu diyelim
bilgi=read_adc()// ne yaptı burada da adc dönüşümünün sonucunu okudu
voltaj=0.0048 *bilgi; // (0.0048 olayı voltaj artım adım sayısı yani 4.8mV olarak artıyor) neyse baba tamam voltajı da geldi 10 luk düzende tanımladı ee peki güzel de ben bunu gidip lcd ye yazdırmak istemiyorum ki bu değeri alsın mesela karşılaştırsın 5V-3.5V arasında ise diyelim ki b0 ucundaki led sönük olsun. 3.5-3.3V arasında iken mesela ledim yavaş yavaş yanıp sönsün. 3.2V-0V arasında ise hızlı hızlı yanıp sönsün derken sanki kafamda programı oluşturdum beyler fikirlere açığım sonsuz yardımlarınız için ayrıca teşekkürler. Ben şunu denerken sizden de fikirler bekliyorum :)

subram

burda okuduğun değeri voltaja dönüştürmene gerek yok. örnek olarak 3V ve 4V değerlerini ele alalım. Adc girişine 3V yada 4V geldiğinde "bilgi" kaydedicisinin alacağı değeri hesaplayıp iki ayrı kaydediciye yükle. 3V için;
3/0,0048=625
bu değeri bir kaydediciye. 4V için;
4/0,0048=833
bu değeri ikinci kaydediciye yükle. sonra ADC yi okuduktan sonra" bilgi" ile bu kaydedicileri karşılaştırırsan istediğini yapabilirsin

NOT: 10 bitlik ADC kullanmış olduğun için
5/1024=0,0048828125
olması gerekirken 0,0048 alındığından ölçtüğün değerlerde ufak sapmalar olabilir. Kararlı bir çalışma için değeri tam olarak almanı öneririm.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

hosiminh

dostum programımı yazayım konu açacaktım ama sen adc mevzusuna yakınsın sanırım serdar çiçek in ccs c ile pic programlama kitabından bulduğum bilgiler ve datasheet ler sayesinde birşeyler yazdım. kodları sana yazıyorum. Proteus da yaptığım devre de çok basit zaten onu da yollayım an0 ayağına bir pot yardımı ile 5v dc voltaj veriyorum aşşağı yukarı oynattıkça gerilim değerini b0 dan da led in gerilim değerine göre sönük olması yavaş yavaş yanıp sönmesi ve hızlı hızlı yanması gibi taleplerde bulunmak istiyorum yazdığım kodla. Şimdi aşağıda kodu da devreyi de vereceğim ama temel sorunumu söyleyim önce. Yazılım oluyor derliyorum yani fakat proteus aynen şöyle bir hata veriyor programı çalıştırmasına rağmen. Uyarı gibi bir not düşüyor. yani ne smülasyonda ne de gerçekte bu devreyi gerçekleyemedim.

HATA: [PIC16 ADC ] PC=0x0158. ADC conversion clock period [5e-7] is less than min TAd=1.6us and is possibily invalid for device clock frequency

mirim bu hata bu verilen gecikmeden falan oluyormuş da ben onu zaten 20us falan yaptım. Şimdi sana kodları ve proteus desing ı yolluyorum bana bir yol gösterebilirsen çok sevinirin

KOD:
#include <16f819.h>
#device ADC=8
#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)

#INT_AD
void ADC_Kesmesi()
{
output_high(pin_b0);
delay_ms(200);
output_low(pin_b0);
}
unsigned long int bilgi;
float adc_value;

void main ()
{
  
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(ccp_off);
   
   
   set_tris_b(0x00);
   set_tris_a(0x0F);
   output_b(0x00);
  
   setup_adc_ports(AN0);
   setup_adc_ports(ADC_CLOCK_INTERNAL);
   
   enable_interrupts(INT_AD);
   enable_interrupts(GLOBAL);
   
    while(TRUE)
    {
     set_adc_channel(0);
     delay_us(20);
     bilgi=read_adc();
     adc_value=0.01953125*bilgi;
     
     if((adc_value>=156))
      {
       output_bit(pin_b0,0);
      }
     
        
        if((adc_value<5)&&(adc_value>=3))
         {
          output_bit(pin_b0,1);
          delay_ms(500);
          output_bit(pin_b0,0);
          delay_ms(500);
         }
         
           
           if((adc_value<3)&&(adc_value>=2.5))
            {
             output_bit(pin_b0,1);
             delay_ms(250);
             output_bit(pin_b0,0);
             delay_ms(250);
            } 
            
        
             if((adc_value<2.5))
             {
             output_bit(pin_b0,1);
             }
            
    }
}


PROTEUS DESING:

yamak

Dostum ben Hi-tech biliyorum ama kodlarını yine anladım biraz bence delay hiç kullanma adgo biti 0 olana kadar bekleme koy.yani while(adgo); gibi bi komut kullan.

Okan AKÇA

Ünide doğru akım devre analizi vardı o zamanlar bu ders niye diye şimdi daha ii anlıyorum bu şekildeki voltajlari küçük hesaplarla rahatlıkla çözüm bulunuyor göz atmanızı tavsiye ederim

subram

setup_adc_ports(ADC_CLOCK_INTERNAL);

bu satır yanlış yazılmış doğrusu;
setup_adc(ADC_CLOCK_INTERNAL);
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

hosiminh

teşekkürler cevaplarınızdan yararladım, araştıra araştıra ve bir arkadaşımın da yardımıyla meseleyi çözdüm gibi. Uygulamada bir iki ufak tefek sorun olsa da halledilir gibi geliyor. ben de elektronik mühendisliği okudum ama işin hep matematiksel, fiziksel taraflarını gösterdiler bize şimdi de iş hayatında sıkıntılar çekiyoruz. hepinize kolay gelsin arkadaşlar çok sağolun.