A

Pulsin ve PWM okuma

Başlatan aytekin, 21 Ekim 2011, 22:05:16

Mastercodex

Tabiki bu husularda çok haklısınız ama şu anda bende Microcode Studio 3.0 ve PBP 2.46 kurulu.Pic 16 serilerini derlerken problem olmuyor ama 18 serilerinde MPASM istiyor.Acaba PBP 3.0 a geçsem bana bir artısı olurmu.Birde yaş zaten ilerledi bu sattten sonrada çok iyi bildiğim bir dilin yerine başka bir dil ile uğraşmak istemiyorum.Zamanında çok istedim C öğrenmeyi ama Visual basic daha kolay geldi ve şu ana kadar her projemi gerçekleştirdim bu dil ile.

Birde dediğiniz gibi PBP den vazgeçmeden bir üst versiyonlarını inleyeyim.PBP 3.0 versiyonunda daha iyi imkanlar sunulmuş olabilir.Yanıtınız için çok teşekkürler...
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

Mastercodex

Ete hocam size birşey sormak istiyorum.16f628a kodlu işlemcide tasarladığım kesme sizinde yardımlarınız ile mükemmel çalışıyor ama aynı kodları 16f877 kodlu işlemciye uyarladığımda kesme olayı sapıtıyor ve her bir periyodda bir kesem üretiyor.Önce yükselen kenarı tesbit edip b portunda çıkış veriyorum.Sonra kesmeyi düşen kenara ayarladım ama düşen kenarda yakalamayıp ikinci yükselen kenarda düşen kenarı yakalıyor.Acaba Option_reg ayarlarımı farklı yoksa sıfırlama bayrağımı farklı.

Aslında 16f628a da tasarladığım bu kesmeyi sizinde dediğiniz gibi 40mhz lik bir işlemcide çalıştırarak komut arası gecikmeleri azaltmayı planlıyorum ama microcode studio 18f serisini derlemiyor.Bu arada PBP 2.47 kullanıyorum ve 16 serisinde hiçbir sorun yaşamıyorum.Kullanmakta olduğum microcode studio bu iş için yetrsizmi geliyor.Kod yazımı için ne kullanmamı önerirsiniz.Aslında çokta alıştım bu editöre.
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

ete

Kesme olayı işlemciye göre davranmaz. Mutlaka bir hata vardır. Pause falan kullandın ise onlar sapıttırıyordur.

Bayraklarda değişmez. Ama işlemciler arasında donanım farklılıkları vardır. Dolayısıyla birinden diğerine geçerken bu donanım değişikliklerini dikkate almak gerekir. Mesela 16F628 de ADC portu yoktur. Ama 18F877 de vardır. 628 de Komparatör vardır ama 877 de yoktur ama 877A da vardır. 628 dahili OSC ile çalışır ama 877 çalışmaz.
Bunlara dikkat etmek gerekiyor.

MCS 18F serisini derler. Ancak 18F serisi için MPASM kullanılması zorunludur. PBP nun kendi assembler'i 18F serisini derleyemiyor.
Bu nedenle MPASM kullanılması gerekiyor. Onu kullanıncada sigorta ayarlarında bazı değişiklikler gerekiyor. Bu olayı forumda daha önce açıklamıştım. Aynı sorun 64 bit makinalar içinde geçerlidir. PBP 64 bit makinalarda derleme yapamamaktadır. Ama MPASM kullanılarak derleme rahatlıkla yapılmaktadır.
Yapman gerekenler şunlar;
-MCS içinde View menüsünde Compile & Program options seçeneğinde Assembleri seç ve MPASM kutusunu işaretle.
AYnı yerde find manually seçeneğini seçerek Labcenter (Proteus) klasörü içinde Tools alt klasöründe yer alan MPASM klasörünün yerini göster ve çık.
- PBP klasörü içinde yer alan 18Fxxx.INC dosyasını bir editör ile aç ve altta yer alan _Config şeklinde başlayan satırların önüne ; işareti koyarak onları kapat ve geriye kayıt et.
- Kapatılan her satırı program içinde sigorta ayarı olarak kullanabilirsin. Ama en başa ASM en sona da ENDASM satırlarını ilave etmen yada her bir config satırı başına ASM işareti olan @ işaretini koyman gerekiyor.
Bu konuda diğer bilgilere aşağıdaki linkteki açıklamalara bakarak ulaşabilirsin.

http://etepic.com/index.php?topic=300.0

Ete

Mastercodex

Evet hocam dün akşam size yazdıktan sonra gördüm o yazınızı ve sonuna kadar okudum.Hatta kendi kendime dedim önce bir araştırsana diye.Bilgilendirmelerininz için çok teşekkür ederim.Akşam aynen yazdığınız gibi ayarları yapıp denemelerini yapacağım.

Dediğim gibi 18F bir işlemciye 40mhz bir kristalk bağlayarak gecikme sorununu halletmeye çalışacağım.

Tekrar görüşmek üzere ..
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

Mastercodex

Merhaba ,

Benim şöyle bir devreye ihtiyacım var.Bu konuda bana yardımcı olabilirmisiniz.

Daha önceden ETE hocamızın yardımları ile Pİc'in PORTA.0 pininden giren 60Hz kare dalga sinyalin yükselen ve düşen kenarını RB0 / INT kesmesi ile yakalayıp PORTA.0 pininden sinyali girdiği gibi yakalıyorum ama ekte görülğü gibi bir delay işlemine ihtiyacım var.İleri doğru delay işlemlerini yapabiliyorum ama geriye doğru olan sinyal gecikmelerini yapamıyorum.Bu işlemin mantığı Extra bir sayıcı ile mümkün galiba.

Bu konuda yardımlarınızı bekliyorum.
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

Hattuşa

s.a.
ustam söylemiş olduğunuz pals gruplarını oluşturmak çok kolay yeterki ana sinyaliniz haricinde ki sinyalinizinde duty süresi sabit olsun. benim söyleyeceğim teknik gayet basit, bir kesme açıp kesme içerisinde bir sayaç çalıştırırsınız, sayacın belirli noktalarında ana palsinizi oluşturursunuz, sayacın kalan noktalarında da diğer (kaç tane pals üretecekseniz) onları ürettirirsiniz. vben protonda yazıyorum işlemcinizi söyleyin ben size protonda örnek bir kod dilerseniz yazabilirim.

Mastercodex

Teşekkür ederim Pro-TR arkadaşım.Aslında olay çok basit.Mesela 16f628a işlemcinin Portb.0 pininiden 60hz duty cycle %50 olan bir sinyal giriyor.Bu sinyali RB0/INT kesmesi ile yükselen ve düşen kenarını yakalayarak PORTa.0 pininden çıkış veriyorsun.Böylece girişteki sinyali birebir örneklemiş oluyorsun ama örneklediğin sinyali rising ve falling delay ayarını yapmak için sayıcıyı nasıl kullanacağımı bilemiyorum.Ben pic basic pro kullanıyorum ama Proton basicte aynı sistem.Aynen benim VB.nettte yazdığım kodlara benziyor.Senden ricam bana örnek olması açısından bir kod yazarsan çok memnun olurum.İşlemci olarak basit olan 16f628a picini kulanacağım.

Birde dikkat ettiğim nokta ileriye doğru delay vermek çok basit ama geriye doğru nasıl delay işleminin yapıldığı.Çünkü örnek olarak koyduğum reesmi indirirsen o resim hareketli bir animasyon aslında.Kırmızı sinyal ana giriş sinyalini mavi sinyal ise örneklenmiş sinyali ifade ediyor.Animasyonda iki farklı kanal varmış gibi duruyor ama biri rising delay işlemini diğeri ise falling delay işlemini gösteriyor.Giren sinyal 60 hz yani period süresi 1 durumunda 8.33ms 0 durumunda 8,33ms.Bu durumda gecikme değeri 50 kademe 2.50ms geriye ve 50 kademe 2.50ms ileriye doğru olabilir.Zaten işin mantığını kapsam gerisi tamamen hesap işi.

Dosyayı bana info@mastercodex.com adresinden gönderebilirsin.İlgin ve yardımların için şimdiden teşekkürler. 
Mastercodex® 3D Teknoloji
----------------------------------
http://www.mastercodex.com
info@mastercodex.com

. Kağan

#37
Alıntı yapılan: ete - 24 Ekim 2011, 12:34:01
Dediklerimi iyi anlamamışsın. Programda kesme kullanacaksın ama TMR1 taşma kesmesi kullanacaksın.
Senin puls süren çok geniş olduğu için ona ayrıca kesme kullanmaya gerek yok diyorum.

INTCON registeri daha önceden program başında ayarlı tutulur. (INTCON=%11000000)
BASLA:
While giris=0:wend
TMR1L=0:TMR1H=0:PIE1.0=1
WHILE giris=1:wend
Rakam.byte0=TMR1L
Rakam.byte1=TMR1H
SAYI=SAYI+RAKAM  'Bu komut yalnızca SAYAC var LONG şeklinde tanımlanmış ise kullanılabilir.
LCDOUT $fe,1,dec SAYI
FOR I=0 to 5000:next
GOTO BASLA

DISABLE
KESME:
SAYI=SAYI+1
PIR1.0=0
RESUME
ENABLE


Bana yine yazdırdın programı. Aslında bir şey değil ama senin yazmanı beklerdim.
Yalnızca 18F serisinden bir işlemci kullanman gerekiyor. SAYI değişkeni LONG cinsinden olmalı.
Derleme PBPL kullanılarak MPASM ile yapılmalıdır.

Sana yalnızca değişken tanımlamaları ve LCD tanımlamaları ve bazı tris ayarlamaları kalıyor. Onlarıda yap artık.
Gerçi ısrarla 12F675 kullanmak istiyorsun ama o işlemci ile LCD kullanamazsın.Okunan değeri ekranda göstermeyecek isen ne yapacaksın? Yani diyelimki peryodu buldun okudun ne yapacaksın onu?
Ekranda göstermeyecek isen 12F serisi kullanılabilir elbette. O zaman elindeki iki değişkeni (SAYI ve RAKAM ) ayrı ayrı kullanman gerekecek. Dediğim gibi toplam HIGH süresi SAYI*65536+RAKAM şeklinde hesaplanıyor.
Sana topşlam peryot lazım ise aynı işlemin bir kerede LOW süresi için yaparsın. Yukarıdaki satırları aynen kullanabilirsin bir iki ufak değişiklikle. While--wend satırlarının beklediği konumları değiştireceksin o kadar.
Tabiiki okunan değerleri başka değişkenlere aktarman da gerekecek.

Ete

Yazınızda
Alıntı YapSAYI=SAYI+RAKAM  'Bu komut yalnızca SAYAC var LONG şeklinde tanımlanmış ise kullanılabilir.
demişsiniz. Bu komut 12F675 de çalışmıyor. Bende bu projede 12F675 kullanarak LCD olmadan belirleyeceğim devirlerde bellirleyeceğim portları on-off yapmasını isteyeceğim. Bu durumda ne yapmalıyım.

Böyle bir iş için 18F2455 almam ve üzerinde çalışmam daha mı uygun olacaktır?

ete

Yine devir ölçme üzerine bir konderans vermem gerekiyor anlaşılan.
Devir nedir? önce bunun cevabını alalım. Devir, dönen bir cismin bir dakikada yaptığı tur sayısıdır. Bunu dev/Dak olarak belirtirsin. Aynı deviri dev/sn olarak da ifade etmek mümkün elbette.
İŞlemciler ile yapılan devir ölçme işlerinde genelde ele alınan zaman birimi ms seviyesindedir. Elde edilen birim zamandaki devir değerleri diğer zaman birimlerine kolaylıkla çevrilebilir.
Şimdi gelelim devir ölçmek için neler yapabiliriz.
En basit devir ölçme metodu dinen cismin her tur da bir puls üretmesidir. Puls üreteci tur başına 1 puls üretince düşük devirlerin hesabı zorlaşır. Bu nedenle birdeb fazla puls üretenler bu işte daha fazla tercih edilirler. Öncelikle Tur başına 1 puls veren sisteme göre biraz düşünce geliştirelim.
Pulsları kaçırmadan nasıl sayarım. Bunu düşünmek gerekir. En emniyetli yol elbette kesme kullanmaktır. Puls üretecini PORTB.0 (veya INT0 veya GPIO.x) kesmesine bağlarsak mükemmel şekilde gelen palsleri kaçırmadan sayabiliriz.
Tabiiki iş bu kadarda kolay değil. Dikkat edilmesi gereken konular var. Birincisi puls saymak için kullandığımız değişkenin boyutu çok önemlidir. ELimizdeki en iyi imkan bir WORD değişkeni kullanmaktır. İkincisi puls sayarken zaman da tutmamız gerekecek. Peki neye dikkat etmek gerek? Tabiiki tuttuğumuz zaman içinde gelen pulslerin toplam miktarı word değişken sınırını (65535) aşmaması gerekir. Aşarsa otomatik değer sıfırlanır ve sizde deviri düzgün hesaplayamazsınız.
Zaman neden tutuyoruz açıklamaya gerek yok sanırım. Birim zamanda gelen puls miktarını bulup orada 1 sn veya 1 dak içindeki puls miktarını hesaplayıp devir değerini vereceğiz.

Zaman mümkün olduğunca 1000 ms ye ye yakın sürelerde olmalı. AKsi halde ufak tefek hata payları devreye girecektir.
diyelimki 1000ms lik bir zaman tutup puls sayısını hesaplayacağız. B0 kesmemiz aktif ve sürekli sayıyor.  O halde yöntem,
SAYAC=0
Pause 1000
Devir=SAYAC şeklinde hemen  SAYAC değerini bir yere aktarmak şeklinde olmalıdır. Aksi halde sayac değeri sürekli artacaktır.
Yada diğer bir yöntem. Genel Kesmeler açık bekler ancak B0 kesmesini lazım olunca açarız.
SAYAC=0:Kesme=1
Pause 1000
Kesme=0 şeklinde yaparsak sayac değeri net olarak alınmış olur.
Elde edilen devir dev/sn şeklindedir. Bunu 60 ile çarparsanız Dev/dak olarak bulursunuz. Sürekli devir değerinin 65535 i aşmamasına dikkat etmek gerekir.
Birazda rakamları kullanalım isterseniz. WORD değişkeninin alacağı maksimum değer 65535 olacağına göre tur başına tek puls veren sistem ile biz maksimum 65000 Dev/dak lık devirleri bu sistemle ölçebiliriz demektir.
Diyelimki elimizde bir motor var ve maksimum devri 10.000 dev/dak.
Bu motorun devrini Tur başına 1 puls veren sistem ile ölçmeye kalkarsak ne olur.  Dev/Sn=166 gibi bir rakam çıkar. Bunu 60 ile çarparak yaklaşık 10.000 dev/dak değerini bulabiliriz.

Peki tur başına 10 puls veren bir sistemle ölçme yaparsak ne olur. Yine word değişkeni üzerinden yürürsek, 65000 puls/dak lık maksimum hız (65000/10=6500 dev/dak)  için saniyede 1083 puls/sn lik değeri (yaklaşık 108 dev/sn) elde ederiz. Gördüğünüz gibi çözünürlük anında düşmektedir. Bu nedenle ya bölücü kullanmak yada daha büyük rakamlarla çalışmak gerekir.

Şİmdi sıra geldi ikinci yönteme. İkinci yöntemde TMR0 veya daha iyisi TMR sayaçlarının hariçten giriş pinlerini kullanarak onları sayac olarak kullanmak da bir yöntemdir. TMR0 sayacı 8 bitliktir ancak 1/256 bölme oranı ile toplamda 65535 puls sayabilir.
TMR1 ise 16 bitlik bir sayaçtır ancak bölücüsü maksimum 1/8 olabiliyor. Böylece 8*65536=524.288 puls'a kadar sayma yapabilir.
Bu yöntemi kullanmanın en önemli avantajı her iki sayaç için aynı zamanda kesme de kullanbilmemiz dir.. Böylece daha büyük tur sayılarını kesme oluştuğunda başka bir değişkeni artırarak elde edebiliriz.

Bu yöntemi kullanabilmek için;
Sayac hariçten puls alacak şekilde ayarlanmalıdır. TMR0 için Option registeri , TMR1 için ise T1CON registeri bu iş için kullanılır.
Detaylar için data sheetlere bakın lütfen. Kesme gerekiyor ise birinde TMR0 kesmesi aktif edilir diğerinde ise TMR1 kesmesi aktif edilir. Gerekirse bölme oranı da verilerek sayılacak miktara uygun bir ayarlama yapılır. Her kesme oluştuğunda ikinci bir değişken sayılarak net puls miktarı saydırılır. Şayet kesme kullanmazsanız komut kullanımı kolaydır.
birinci metodaki benzer şekil ile ; TMRx=0:Pause 1000:SAYI=TMRx şeklinde sayılan değer alınır.
Ancak kesme kullanırsanız zamanı farklı bir yöntemle tutmak gerekir. Birinci yöntem döngüsel gecikme sağlamaktır.
For I=0 to 50000
  pauseus 5
  pauseus 5
  pauseus 5
  pauseus 5
next
şeklindeki bir komut dizisi size yaklaşık 1000 ms lik bir gecikme sağlar. Ancak gerçekte bu süre 1000ms den fazla olacaktır.
Fazlalık komut gecikmelerinden gelir. Bu nedenle belkide 4 adet pauseus yerine 3 adet kullanmak yada döngü miktarını daha aşağılara  çekmek gerekebilir.
SOnuç olarak yöntem ne olursa olsun elinizde birim zaman içinde sayılmış puls miktarı olacaktır. Bunu dev/sn yada dev/dak değerine çevirerek gerçek devir miktarını hesaplamanız gerekir.

Hala anlaşılmayan bir şey var ise sorarsınız.

Ete

Powered by EzPortal