POT KOMUTUNUN KULANIŞI NASIL ?

Başlatan yusuftr80, 26 Mayıs 2006, 03:47:37

yusuftr80

Selam arkadaşlar sizden ricam denemekte oldum bir devre var fakat  bir türlü neden se( POT )komutunu nasıl  programa dahil edecemi  bulamadım ORHAN ALTIN BAŞAK ın  kitebıyla çalışma yapıyorum  ama  çözemedim.  bir pine baglı potansiyo metrenin degerini lcd
görmek ve aldım degeleride  diyer pinlere bagladım letlere   vererek  let lerin  sıra ile yanmasını istiyorum   potnsiyo metrenn degerine göre sıray la yanması gerek ama nasıl yapıcam ? bu konuyla beni aydınlatacak olan arkadaşlara teşekür eder  işlern de başarılarının devem etmesini dilerim  . kolay gelsin  yusuf_dogangunes@hotmail.com
yusuftr80@hotmail.com bana ulaşmanız diegiyle salıcakla kalın  ;)
NOT. LETLERİN KONTROLU POTANSİYOMETREYE BAGLI OLCAK
potarsiyo metreyi cevir meye başladım da  letler sırayla ilerleyecek . potansiyo merteryi kıstımda ise aynişekilde giti gibi geriye dogru gelecak ve sönecek ?

ete

Pot komutu şöyle kullanılır;
POT Pin,Scale,Değişken
Pin denilen potun bağlı olduğu pin dir PortA.0 veya PortB.5 gibi,
Scale ise ayar faktörüdür. 0-255 arasında bir sayıdır. Bu Scale öyle ayarlanmalıdırki pot'un sıfıra yakın kısmında pot okuma değeri sıfır, potun maksimum değerinde ise pot okuma değeri 255 vermelidir. Bu yüzden önce scale olarak 255 alınır ve pot da denemeler yapılır uugun ise bırakılır değil ise değer düşürülerek denemeye devam edilir.
Şimdi gelelim senin Led işine. Kaç adet led bağlayacağını söylememişsin. 8 adet olduğunu kabul edelim. Bu durumda pot değeri 255 olduğunda 8 led yanacak 127-128 olduğunda ise 4 adet led ve sıfır olduğunda ise hiç yanmayacak demektir. Kısaca 0-255 arası değeri 8'e bölmeliyiz.
255/8=31,8 gibi bir değer çıkıyor. Halbuki 256/8=32 olarak tam sayı çıkıyor. Bizim pot 0-255 arası çalıştığından aslında 256 adet konum üretecektir. Bu nedenle biz 32 değerini esas alacağız. O halde yapacağın iş şöyle olacak.

Led=(Potdegeri+1)/32


diyelimki pot değeri 255 olsun. Bu durumda ;
LED=(255+1)/32 = 8 çıkacaktır. Bu bize kaç adet led in yanacağını gösteriyor. Şimdi ledleri yakalım.
8 bitlik bir portun pin çıkılarının sayısal değerleri şöyledir;
Bit0=1
Bit1=2
Bit2=4
Bit3=8
Bit4=16
Bit5=32
Bit6=64
Bit7=128

Gördüğün gibi her sayı bir öncekinin 2 katıdır. Direkt üs alma komutu olas idi işimiz kolaydı. YAN=(2 ^ LED)-1 derdik olur biter idi. Ancak hatırladığım kadarı ile Pic Basic te üs alma komutu yok. O halde led sayısı kadar sayıyı 2 ile çarpmamız gerekecek.

O halde bir döngü kurar isek;
Yan=1   'önce sayımızı bire eşitleyelim.
FOR I=1 to LED
YAN=yan*2
next
Yan=yan-1  
sonuç 256 çıkacağı için başta eklediğimiz biri sonunda tekrar çıkartıyoruz.
EN sonda da PORTB=YAN  dediğimiz zaman kaç tane led yanacak ise yanar.

Şimdi diyelimki POT değerimiz 147 olsun . Bakalım kaç adet led yanacak ve portB değeri ne olacak;
LED=(147+1)/32 =4
Yan=1
For I = 1 to LED
YAN=YAN*2
NEXT
YAN=YAN-1
PORTB=YAN
Sonuç olarak 4 adet led yanacak,
Yan değeri önce 16 bulunacak sonra bir çıkartılıp 15 bulunacak.
PortB=15 denildiği zaman ise 4 adet led yanmış olacaktır.

Sanırım anlamışsındır.
Hadi yap bakalım ve sonucu buraya yaz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

yusuftr80

ETE.KARDEŞ   İlk önce ilğilendin için sana çok teşekür ederim .
Yapmak istedim  aslında ufak bir devre ama kendi ufak şeri büyük çıktı
evet güzel de açıklamışın ama benim kafam baya karışıtı sana zahmet  anlatın programın   bana  ufak bir örnek (TRIS)ten başlayıp (end) KADAR Olan  bölüme karadrını  16 F 84 De  uyarlanmış halini yazarsan umarım dahada iyi olacak .

ete

Al bakalım programı. Bu programı denedim güzel çalışıyor.

'****************************************************************
'*  Name    : POT-LED.BAS                                       *
'*  Author  : [E.T.E]                                           *
'*  Notice  : Copyright (c) 2006 [Ete]                          *
'*          : All Rights Reserved                               *
'*  Date    : 26.05.2006                                        *
'*  Version : 1.0                                               *
'*  Notes   :10K lık potun orta ucu PortA.0 da alt ucu 150nf ile*
'*          :GND ye bağlı  ve potun üst ucu boşta olacak.       *
'****************************************************************
TrisA=1
TrisB=0
@ DEVICE pic16F84
@ DEVICE pic16F84, WDT_ON
@ DEVICE pic16F84, PWRT_ON
@ DEVICE pic16F84, PROTECT_OFF
@ DEVICE pic16F84, XT_OSC
DEGER var byte
SAYI  VAR BYTE
YAN   VAR BYTE
I     VAR BYTE


BASLA:

pot portA.0,130,deger
SAYI=(DEGER+1)/32
YAN=1
FOR I=1 to SAYI
YAN=YAN*2
NEXT
YAN=YAN-1
PORTB=YAN
PAUSE 500
goto basla

end


Kolay gelsin

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

yusuftr80

Kradeş eline saglık  sanada zahmet oldu  .
programı denedini ve çalıştını da söylüyorsun  dogrudur
Ama ben bu programın devresini  proteusta denedim fakat potansiyometreyi   saga sola çeviriyorum  let ler sırayla yanmıyor  ya hepsi bir yanıyor yada hepsi bir sönüyor acaba ben yinemi yanlışlık yaptım   programdan anladım kadarıyla (PORTA.0)  potansiyo metreyi bagladım ( PORTB. 8 LET leri )   bagladım  ama yine olmadı sana zahmet bir daha tarif edermisinnasıl olacak bu  alet . :oops:
burda bir başka komut yine var ama  bu komut  dedim şekilde  bir ilşem yapar mı ne dersin ( ORHAN ALTINBAŞAK )kitabından alıntı örnek olsun diye tam metni yazıyorum.
POT ve PWM  komutlarının kullanılmasına örnek bir uygulama programıdır.
ve 2 LED,li basit bir vu metre,ye benzetile bilir.program,PORTB.0 baglı potansiyo metrenin degeri degiştirildinde 2 LED,li bargraph,ta son yanan  LED,in  parlaklını degiştirir.LED,ler RB,4 ve RB,5 e baglanmıştır.

potval var byte
i var byte
position var byte
bright var byte
loop:
pot portb.0,127,potval
position=potval/127
bright=(potval//127)*2
for i= 0 to 1
ıf  < position then
highi+4
else
low i+4
endıf
next i
pwm position +4 ,bright,5
goto loop
end

ete

Hazırladığın isis dosyasını section olarak kayıt et ve Hemenpayals.com 'a yükle ve burada linkini ver bir bakayım.
Söylediğim gibi 10Klık bir pot alacaksın 3 adet ucu vardır. Alt üst ve orta.
Üst uç boşta kalacak. Orta u. PortA.0'a bağlanacak. Alt ucuna bir 150nf kondansatör bağlayacaksın. Kondansatörün diğer ucunu ise GND ye bağlayacaksın. Hepsi bu.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

marmarabil

yeni basladigim icin zorlanmaktayim pot komutunun kullanimi ile ilgili tam bir baslik bulamadim buraya yaziyorum.asagidaki programi bi turlu simule edemiyoruz.isiste pot_lin elemani sabit bir direnc gibi davraniyor.
teşekkürler iyi calismalar.
TRISB=%00000000        
    PortB=0                 
    TRISA=%11111111  
    PortA=0  
    X VAR BYTE
    I VAR BYTE
    DURUM CON 128
    
    BASLA:
          OKUMA:
                PAUSE 500
                POT PORTA.0,255,X
                IF X>DURUM THEN HIGH PORTB.0 
              
                IF X<DURUM THEN HIGH PORTB.1
      GOTO OKUMA
            END

ete

@Marmarabil,

Pot komutunun önemli bir parametresi var scale. Bu parametre devrenize göre size uygun kontrol imkanı sağlar. Baktımda komutda scale parametresini 255 olarak kullanmışsınız. Ayrıca devreniz konusunda bir bilgi vermemişsiniz.
Benim denemelerimde pot komutu aşağıdaki parametreler ile düzgün çalışmaktadır. Sizde deneyin neticenin güzel olduğunu göreceksiniz.

1. Öncelikle pot'un alt ucunu 150 nf kondansatör ile GND ye bağlayın. Üst ucu boşta kalsın bir şey bağlamayın.
2. Pot un orta ucunu pic'in bir pinine bağlayın (PortA.0) ve POT komutunu bu pini kullanarak verin.
3. Pot direnç değişimini çok hassas bir şekilde görmek istiyorsanız komutu  şu şekilde kullanın   POT PortA.0,127,X  şeklinde kullanın.

4. Daha iyi bir izleme sağlamak için programıda aşağıdaki şekilde değiştirin;

Ete
TRISB=%00000000       
    PortB=0                 
    TRISA=%11111111 
    PortA=0 
    X VAR BYTE
    I VAR BYTE
    DURUM CON 128
   
    BASLA:
          OKUMA:
                PAUSE 100
                POT PORTA.0,127,X
                IF X>DURUM THEN PORTB=%01
             
                IF X<DURUM THEN PORTB=%10
      GOTO OKUMA
            END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

marmarabil

sevgili ete yazdıgın satırda x degiskeni 127 den daha buyuk bi deger alamaz değil mi? yani potansiyometrenin en kucuk degerinde 0 en buyuk degerinde 127 alacak.

ete

Hayır, X değeri yine 0-255 arasında değişecektir. Potun maksimum değerinde X=255 olacak, min. değerinde ise X=0 olacaktır.
Scale değeri potun hangi konumunda 255 olacağını belirler. Örneğin Scale=255 yaptığınız zaman pot değeri orta konumu geçergeçmez X=255 olur. Hatta orta konuma gelirken X=255 olur. Bu nedenle, Scale değerini kullanılan pot değerine bağlı olarak potun kullanım aralığını ayarlıyan parametre olarak düşünün.
Sizin konunuzda potu un değerini linear olarak görmek önemli. Zira orta nokta 127-128 dir ve siz bu noktanın aşılıp aşılmadığını belirlemek istiyorsunuz. Bu durumda size uyan en ideal scale değeri 127 olmaktadır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

marmarabil

sevgili ete yardımların için cok teşekkürler.devredeki potansiyometrenin 10 k yada 1 k olması arasında bir fark olurmu.ayrıca 150nf yerine 100n yada 200n bağlamak arasında nasıl bi fark olabilir.

edit ; birkac saat sonra.
pot komutundan 4 bitlik bir bilgi elde ettik 0 dan 15 e rakamları ledlerden okuduk.çözünürlüğü arttırmanın bi yöntemi varmı ?

ete

Çözünürl,k 8 bit dir ve bunu da almanız lazım.

Pot değeri ve kondansatör değeri bit sayısında etkin ayrıca potun pozisyonuna bağlı olarak verdiği değer değişiyor.
Örneğin 100 nf kondansatör kullanırsanız yukarıdaki değerler ile 8 bitlik bir sonuç alamazsınız.
Çünki sistem kondansatörün şarj edilip deşarj olma süresinin ölçülmesi mantığıyla çalışmaktadır. Bu yüzden verdiğim değerler üzerinden çalışın.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

marmarabil

teşekkürler.gece vakti elimde 150nf olmadigindan 100 nf ve 200 nf ile denedim.tam bir sonuc alamadim.buyuk salinimlar yapiyor.mesela potansiyomertre sabitken 8 bitlik veride 5-10 yukari ve asagi salinim yapiyor.bunu sabit veriye donusturmek icin bi yontem ariyorum.iyi calismalar

yusuftr80

Arkadaşlar öncelikle bana daha önceki konuda da yardımcı oldunuz teşekkür ederim.
Pot komutunda aslında tam olrak başara bildğime emin değilim ama pot komutunu kullanarak 10 adet doğal sayılarda değerleri ayrı ayrı göre biliyorum bu aldığım değerleri ise ıf   x=25 then  yani git portb nin birini 1yap diyerek 5 adet ledi kontrolü bi şekilde hallede biliyorum ama şimdi diyorumki?
Aynı pot komutuyla hepimizin de bildiği gibi dc 12woltluk silecek motoru kontrol edecek olursak .ozaman  nasıl bir yol takip ede biliriz .
Motorun şu şekilde çalışmasını isterim potansiyometreyi  ortaya aldığımızı düşünelim sağa veya sola çevirdiğimizde  motorda aynı hareketi takip etmesi gerek  potansiyo metreyi bıraktığımız  konumda motorunda aynı konumda  durmasını nasıl yapa biliriz hepinize kolay gelsin  iyi çalışmalar
:roll:

ete

İstediğin motor servo oluyor. Bu işi ancak motor milinin veya silecek motor milinin pozisyonunu bildirecek bir pot ile mümkün. Kısaca motor miline bir pot veya bir encoder bağlayabilirsen ve mil ile birlikte onuda paralel olarak döndürebilirsen istediğin olur.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com