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 ?
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
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 .
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
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
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
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
@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
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.
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
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ı ?
Çö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
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
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:
İ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
ETE KARDEŞ sana ve senin gibi düşünen tüm iyi niyetli yardım sever arkadaşlarada çok teşekkür ederim burda her verilen bilgi inanıyorum ki sizler göremesen nizde bir yerde mutlaka bir ışık yakıyor ve etraflarınıda aydınlatıyordur buna adım gibi eminim ve sizlerede çok teşekür ederim çalışmalarınızın, başarılarınızın devamınıda çanı gönülden dilerim
Kardeş ben servo da step te kulanmıcam DC motor 12 volt silecek motoru kulanıcam ama burada programa nerden nasıl başlıcamı bile miyorum yanılmıyorsam program iki bölümden meydana gelecek. Ama nasıl ?
Elle cevirdimiz potansiyo metre degeri motor sürücüsünü kontroledecek sürücüye giden degerde motordaki baglı olan potansiyo metre dogrulucak dogrulandı zaman da görev yerine getirilmiş olacak..
Yada sisin bildiniz kısa bir yol varsa onu söyleyin onu uygulayalım şimdiden her keşe kolay ğelsin yardım larınızı ben ve benim durumum da olanlar sanırım dört 8O bekliyor olacağız? saygılar .
Bir defa sistem olarak;
- 1 adet pic hemde analog Digital ceviricisi olacak. Bu durumda 2 adet analog digital cevirici girisi olur ise pot komutunu kullanmadan direkt adc yi kullanıp daha doğru bir kontrol yapabilirsiniz.
- 1 adet DC motor ve bu motorun miline bağlı (motorla birlikte dönen) bir potansiyometre (genelde çok turlu potlar daha uygun olabilir)
-1 adet H tipi köprü motor sürücüsü
olması gerekiyor.
Şİmdi olayın işleyiş şekline bakalım;
1. El kumadalı potu çevirdin. Belli bir konuma kadar, diyelimki orta konuma getirdin. Pic pot üzerinden bir ADC değeri okuyacak, 10 bit ADC kullanacaksınız ve okunan değer 0-1023 arasında bir değer olacaktır. Potun orta konumunda bu değer 512 olacaktır.
2. Şimdi okunan bu değere karşılık gelen motor konumunu aldırmak için pic motora komut verecektir. Önce moto mili hangi konumda onu anlamak için mile bağlı pot değerini okuyacak. diyelimki okunan değer (bir önceki komuttan kalan) 120 olsun. Bu durumda gelmesi gereken yer 512 olacağı için ileri (saat yönünde ancak devrenizde bu terside olabilir) motor dönmeye başlayacak ve pic saniyede belki 50-100 defa potun konumunu kontrol edecek. Değer 512 olunca motoru durduracak.
3. İşte böylece motor mili elle çevirdiğiniz pot konumuna paralel bir hareket alarak istenilen noktaya gelmiş oldu.
4. Şimdi potu tersine yani tekrar sıfır noktasına alalım.
5. Demek ki gelinecek nokta sıfır noktası; pic motordaki pot'u okudu baktı 512 değerinde duruyor. Ohalde ters yöne bir hareket verilecek. Bu sefer H-köprü (H-Bridge) devresi motoru geri döndürmeye başlayacak ve arada pot değeri okunup sıfır bulununca motor durdurulacak.
Bu arada uç noktalarda motoru otomatik durdurmak içinde bir tedbir düşünmelisiniz. Yani motor sıfır konumuna gelince hem programla hemde bir limit swich ile durabilmelidir. Aksi halde program sıfır noktasını bulamaz ise (olabilir) motor çalışmaya devam edecek ve potu veya bir başka yeri kıracaktır. Aynı husus maksimum açık noktası içinde geçerlidir. Potlar 270 derece çalışabildiğine göre 270 derecede şayet durdurulmaz ise motor potu zorlayacak ve bir şeyleri kıracaktır. Bu işin iki yolu var. Birincisi bu uç noktalara birer mikro switch bağlamak veya motor sürücüsünde akım kontrolü yapmak. Akım kontrolünde motor normal çalışmada diyelimki 1 amper çekiyor uç noktalara dayanınca çekilen akım hemen 2 veya üzeri ampere çıkar. Bunu sezecek bir opamp devresi yaparsanız motor bu konumlarda otomatik durdurulabilir.
Hepsi bu kadar. Bu anlattıklarımı yapabilmeniz için;
1. Pic lerde ADC değeri okuma,
2. H-Bridge devreleri ve hareket mantıkları
3. Pic ADC pinlerine pot bağlama teknikleri ve pot değeri okuma teknikleri
4. Gerekirse 12V-24V 2-4 Amper güç kaynakları (motor sürmek için)
5. Motor korumak için akım kontrollü otomatik stop sistemleri
konularını araştırmanız gerekiyor. Takıldığını noktada size yine yardımcı olurum. Ancak sakın programın tamamını istemeyin. Zaten programdan önce bir devre şemasına ihtiyacınız olacak. Tabiiki yukarıda bahsini ettiklerimi önce araştırdıktan sonra devre şemasını çizebileek hale geleceksiniz.
Hadi bakalım çalışmaya başlayın.
Bu arada motor miline nasıl potansiyometre bağlayacaksınız merak ediyorum. Mekanik bir problem ve bu işler için aslında özel pot lar var. Adına shaft potansiyometre deniyor sanırım. Ortası delik siz mili oradan geçirip bir şekilde mili pota sabitliyorsunuz oluyor. Bir araştırın piyasada bulunabilir. Her neyse biraz kafa yorun bakalım. Sonucu burada açıklarsanız sevinirim.
Ete
Sevgili Ete kardeş güzel bir açıklama yapmışsın teşekkür ederim .
benim mekanik olarak hiç bir teretütüm yok gözü yumuk donen bir nesne üzerine 877 entgereyi dahi rahatlıkla kurabilirim buna emin ol
asıl sorun bende benim programı nasıl ne şekilde nerden başlayacagım konusu proteusta ve isisite de baskı devresi dahil olmakla hemen hemen çogunu yapabileceme inanıyorum. Tabi elektronikte eksiğim olabilir bu yüzdende siszlerden yardım istememin sebebi de buydu yani kolay bir devre şemsı varsa elinizde benim işimi kolaylaştırması açısından ihtiyaç duymuştum ama siz meşgul seniz sadece elinizde hazır olabilecek bir şema varsa onu bana veya burada yayınlaya bilir seni bana ve diyer arkadaşlarada çok yardım cı olaca kanatindeyim saygılar
NOT. Çalşmalarım da zayıf kaldım konular .
1 pic programlamaya aşa yukarı senesi olacak ama . kendi cabamla zorda olsa bu aşamaya kadar gele bildim .
2. elektroniktede 17 sene ara verdim şu andada şerit testere kaynak ve bileme atölyesi işlet mekteyim malüm işlerin duru mu beni takrar bu mesleye geri yöneltiyor ama benim bıraktım zamanlarda kulandımız malzemelerin işleyişleri ve çogu devrelerde isimler de degişmiş bunları da bir şekilde az da olsa başarmaya çalışıyorum .
3. ORHAN ALTINBAŞAK'ın kitabından çalışıyorum dedim gibi komutların islevini tek başıma olunca anlayamıyorum tam olarak neyi nereye yazacamıda bile miyor ve şaşırıyorum.
sevgili ete bu konu ile bende ilgileniyorum.10 k lık pot ile denedim ama direnc değeri devamlı değiştiği için motor da devamlı konum değiştiriyor ve mekankte bir titreme,kararsızlık oluyor.filtreledik ama yine pek işe yaramadı .çözünürlüğü daha da arttırmak istiyorum ama adcin komutunun kullanımı ile ilgili olarak kafamda soru işaretleri var çünki pot komutunun değeri atadığı değişken 8 bit adc 10 bit bu konu ile ilgili olarak ufak bir örnek yazabilirsen bizim için çok faydalı olacaktır.teşekkürler iyi çalışmalar
ADCin komutunu kullansanız bile ardışık okumalarda farklı sonuçlar gelebilir. Bu nedenle yapılacak en akıllıca iş ADC okumasını 20 kez üst üste yapıp okunan değerleri toplamak ve sonunda toplam değeri 20'ye bölerek 20 okumanın ortalamasını almaktır. Böylece iniş çıkışlardan birazda olsa kurtulmuş olursunuz.
ADCIN komutunun kullanımı için benim ders notlarıma bakın;
http://www.hemenpaylas.com/download/689336/BASIC-DERS.rar.html
ete
ÖRNEK: AŞAGIDAKİ PROGRAMDA NASIL BİR EKSİŞKLİK VARA,DA BU İŞ HALOLMUYOR?
BASLA:
TRISB=%00000000
TRISA=%00000000
PORTB=0
X var byte
X1 VAR BYTE
POT PORTB.0,255,X
LCDOUT $FE,1,"POT=",#X
PAUSE 100
IF X=2 THEN
X=X1
ENDIF
IF X=4 THEN
X2=X
ENDIF
IF X1=2 THEN
PORTB=%00000010
pause 500
ENDIF
IF X2=4 THEN
PORTB=%00000100
PAUSE 500
ENDIF
GOTO BASLA
END
ARKADAŞLAR pot komutunu kulanarak (PORTB.0),da potansiyo metrenin degerini
lcdout komutu kulanarak x atıyor (LCD,)dede göre biliyorum fakat
x ten x1,e bu degeri nasıl atıcam da x1 den de degerleri alp kullanabilirim
NOT.isiste yaptım simalsyon devresinide göndermek isterdim ama onu da bir türlü başaramadım bunada yarım ederseni iyi olur ;)