Pot Uygulamaları

Başlatan freelife, 18 Şubat 2011, 16:17:46

freelife

16f819 pic ile kayan yazı yazcam burdaki hız ayarını pot ile vermek istiyorum. bunun için yardımcı olabilcek varmı?

eseneren

adc var mcu da zaten, oraya bır pot baglarsın gelen degere gore hızı belırlersın ,
aslında kayma hızını dıger degısle ekranda bekleme suresını onunla gırersın.
Basladıgın kod varmı??
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

freelife

Yok Bana örnek bir kod yazabilirmisin

freelife

while(true)
   {
      output_high(pin_B0); //1
      delay_ms(3000);
      output_low(pin_B0);
      delay_ms(1000);
}
Şimdi burda led 3 sn yanıyor 1 saniye sönüyor.  Ben burdaki delay_ms() içindeki değirei pot ile belirlemek istiyorum.
Not : Pot dıştaki uclarına 0 ve 5 volt verdim ortak ucunuda pic bağlıyacağım.

picmanya

ADC pininden daha önce hiç okuma yaptınızmı?
Bununla ilgilide kodlarınız varmı elinizde?
Bu durumda çözüm daha kolay olurdu.
Potun başını 0,son konumunu 3 saniyeye almak istiyorsunuz anladığım kadarı ile.

freelife

ADC pininden daha önce hiç okuma yaptınızmı?
Yok Yapmadım.
Bununla ilgilide kodlarınız varmı elinizde?
Yok

Ben potansiyometre ile ledin yanma sönme süresini değiştirmek istiyorum.

picmanya

adc için de örnek kod yazımınız olsaydı sonuca ulaşmamız daha kolay olurdu.
zira aynı dili kullanıyoruz ama derleyici ve işlemci farklı gibi.
size hemencecik yardım edebilirdim.sıfırdan kod yazıp vermeyi pek sevmiyorum.
verdiğiniz kod belki basit amaçlı led yak - söndür olarak kullanılabilir.
ama ciddi bir işler bütünü yapan programda sorun yaşayabilirsiniz.

öncelikle ledinizin yanıp sönme zamanını birbirinden ayrı ayrı ayarlamak istiyorsanız.
iki adc girişi ve tek timer kesmesi kullanılabilir.

yada ledin yanma sönme zamanı toplamına ledin periyodu diyelim
periyod sabit kalmak şartıyla yanma sönme zamanı düzenli ve lineer bir şekilde değiştirilmek isteniyorsa
tek bir adc ve tek bir timer2 veya 3 kullanılarak bir OCx modül ile de işi kotarabilirsiniz burda ne timer nede OCx kesmesi kullanılmadan iş görülebileceği gibi yerine göre timer kesmeside kullanılabilir.


eseneren

init icin
void initialize()
{
TRISA=0x03; // Analog giriG için
PORTA=0x00;
TRISB=0x00; // LCD için çıkıG
PORTB=0x00;
TRISC=0x00;
PORTC=0x00;
TRISD=0b00001100;
PORTD=0x00;

PCFG3=1; 
PCFG2=1;
PCFG1=1;
PCFG0=0;
ADFM=1; 
ADON=1; 
}

cevrım fonksıyonu
unsigned int adc(void)
{
CHS2=0; // AN0 seçiliyor
CHS1=0;
CHS0=0;
DelayUs(200);
ADGO=1; // Çevrim baGlatılıyor
while(ADGO);
DelayUs(200);
number=(int)((ADRESH*256+ADRESL));
return(number);
}

kodu kullanmak ıcın

adc_v=(int)(adc()/14);

burdan buldugun degeri ledi ne ıle yakıp sonduruyorsan
misal
led=1;
bekle(adc_v);
del=0;
bekle(adc_v);
yaparsın yada kesme kullanacaksan tımer degerıne yuklersın vs vs
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

freelife

#include <16F819.h> 
#device ADC=8 
#fuses HS,NOWDT,NOPROTECT,NOLVP 
#use delay(clock=20000000) 
  
void main(void) 
{ 
   int8 adc_value; 
   /* adc modülü ayarlanıyor */
   setup_adc(ADC_CLOCK_INTERNAL); 
   setup_adc_ports(ALL_ANALOG); 
  
   while(TRUE) 
   { 
      /* 1. ADC kanalını seç  ve değeri oku*/
      set_adc_channel(0); 
      delay_us(200); 
      adc_value = read_adc();
      
      output_high(pin_B0); //1
      delay_ms(adc_value*4);
      output_low(pin_B0);
      
      output_high(pin_B1); //2
      delay_ms(adc_value*4);
      output_low(pin_B1);
       
      output_high(pin_B2); //3
      delay_ms(adc_value*4);
      output_low(pin_B2);
      
      output_high(pin_B3); //4
      delay_ms(adc_value*4);
      output_low(pin_B3);
      
      output_high(pin_B4); //5
      delay_ms(adc_value*4);
      output_low(pin_B4);
      
      
      

    } 

}

Bu kod ile calıştırabiliyorum. Ama bir kaç sorunum var. Bunu böle yapınca main de sadece bu işlem ile kalıyorum. Bunun haricinde bir kanalada filip flop yaptırmam gerekiyor o zamanda bu sekilde yapamıyorum. Timer da yapmamı sölediler ama anlamadım nasıl yapcam yardımcı olabilcek varmı?

eseneren

#9
main()                            //Burası ana fonksıyon
{
fifo();                            // program ilk basta bu komutu ısleyecek burası asagıda fifo yazan fonk. gıdıp oradakı ısı halledıp gerı gelecek
read_adc();                  // sonra buraya gelip asagıda read_adc yazan fonk gıdecek ne yapılması gerekıyorsa onları yapıp gerı gelecek ve basa donecek 
}                                  // şimdi bu fonksıyonlar ne yapacak onları tek tek asagıda yazacaksın

fifo()
{
if(rb7==0)                   // portb nın 7. biti 0 ise 
      rb7=1;                  // 1 yap 
else                            //degil ise
      rb7=0;                  // 0 yap
}

read_adc() 
{
// senın kendı programında adc okumak ıcın yazdıgın kodları yukarda main ıcınde buraya yaz
// program buraya geldıgınde adc bılgısını okup gerı yukarı donsun
}


Demek istediğim alt fonksıyonlar olustur sonra gerektıgınde aynı ısı yapmak ıcın aynı kodu kopyala yapıstır yapma
tekrar tekrar cagırırsın ıstedıgın kadar yukarda aynı kodlara acıklama yazdım Hitech ile PICC aynımı bılmıyorum
programlama mantıgı olarak benım demek ıstedıgım ( C C dir)
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

freelife

#10
teşekkürler @eseneren kodları daha açıklayıcı yazabilirseniz  sevinirim  karşınızda hiç bilmeyen birisi var  :)

eseneren

alıntı yerıne degıstıre basmısım yukarıdakı msj degıstırılmıstır...
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk