Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

darbe katarı

Başlatan igolcubasi, 03 Aralık 2004, 09:59:19

igolcubasi

16f876 ile dakikada 1 ila 600 darbe nasıl göderebilirim.

ete

@igolcubasi,

1 dakikada 600 darbe demek 10 Hz lik bir frekansa tekabül eder. Bunu ise Pic Basic Pro da aşağıdaki şekilde üretebilirsin.

Freqout  Pin,süre (ms) ,Frekans

Örnek vermek gerekirse, PortB.0 pininden 1 dakikada 600 darbe çıkarmak için;

Freqout Portb.0, 60000,10

şeklinde bir komut yeterli sanırım.

Yazınızda bir 1 koymuşsunuz. Bunun anlamı istediğiniz zaman 1 komut gönderecek iseniz yani 1 dakikada 1 darbe olacak ise bu komut işinizi görmez. Zira en düşük frekans olarak 1 Hz verseniz dakikada 60 darbe eder. Buda bu komut ile min. 60 darbe (pals) üretebilirsiniz demektir.
Kendiniz komut üreterek bu darbeleri üretebilirsiniz. Şöyle;
-----------------------------------------------
I         var  Byte
darbe  var  Byte
Sure    var  Byte

Darbe=600 'bu değeri siz belirleyeceksiniz
Sure = 60000/Darbe

For I=1 to Darbe
High PortB.0
pause Sure  
Low PortB.0
Next I      
-----------------------------------------
Darbe sayısı 600 olunca Sure=100 çıkar (100 ms)
600x100=60.000 ms eder oda 1 dakikaya tekabül eder.

Darbe sayısı 10 olsun diyelim, bu durumda;
Sure =60000/10 = 6000 ms. çıkar
6000 x 10 = yine 60.000 ettiğinden 1 dakikada 10 darbe üretirsiniz.

Açıklama bu kadar. Umarım yardımcı olmuşumdur.
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Erol YILMAZ

Bu cikan sinyallerin hizini ne ile ayarlamayi dusunuyorsun?

ete

@Erol,

Soruyu bana yani ETE'ye soruyorsan hız ayarlama gibi bir problem yok. Darbe sayısı sonuçta 1 dakika yani 60 sn. süre içine yerleştirildiği için hızı darbe sayısı otomatik olarak ayarlıyor.

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

Erol YILMAZ

Kusura bakma Ete kardes, sorum konuyu acan Igolcubasi naydi.
Ama ondan pek ses seda cikmiyor...

Veli B.

Değişken tiplerini byte değil de word yapmak daha mantıklı gibi geliyor...:)

ete

@ Katana,

Haklısın özellikle darbe değişkeni word cinsinden olmalı. Bilgileri örnek olması açısından verdiğim için değişken tiplerine dikkat etmemiştim.

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

igolcubasi

@ete
Yazılımla darbe katarını ürettim,darbe sayısını dışarıdan up-down olarak
belirlediğim tuşlarla yapıyorum.Esas olarak timer kullanarak nasıl yapabiliriz diye düşündüm.Donanım kesmeleriyle sorunu halledeyim dedim.Yazacağım programın arkasında darbe üretme çalışsın diye düşünmüştüm.Gerçi yazılımla da güzel oldu.
Pbp da word olarak tanımladığım bir yazmacı interrupt yordamında nasıl artırıp azaltabilirim.Asm olarak, basic kesmesi kullanmadan.
Yardımlarınız için çok sağolun.

ete

@igolcubasi,

Meseleyi hallettiğine sevindim.
Ben genelde PBP kullanıyorum. Zaman zaman ihtiyaç duydukça basic içinde assembly kullanıyorum. DOlayısıyla çok sık kullanmadığım için assembly konusunda çabuk düşünüp çözüm üretecek durumda görmüyorum kendimi. Bu konuyu ustalara bırakıyorum. Yinede geriden bir yol bulmaya çalışacağım. Halledersem buraya koyarım.
Mesajının son kısmını pek anlayamadım.

"Pbp da word olarak tanımladığım bir yazmacı interrupt yordamında nasıl artırıp azaltabilirim.Asm olarak, basic kesmesi kullanmadan. "

Yani PBP kullanacaksın ancak kesmeyi ASM de oluşturacaksın. Kesme bölümünde yazmacı artırıp azaltmayı istiyorsun. doğrudur umarım. Çünki buna göre düşüneceğim.

Diğer taraftan şöyle bir sesli düşündüm de, iki adet tuş koydun. Bunlar darbe sayısını azaltıp çoğaltacak ve belirli bir porttan belirlediğin darbeler dakika bazında çıkacak. Belirlenen darbelerin adedine göre hesaplanacak bekleme süresi ise TM0 veya TM1 sayaçları kullanarak geri planda saydırılarak elde edilecek ve süre bitiminde int çalışıp port toggle edilecek. Bence istediğin bu olmalı. Bu durumda sana lazım olan TMR0 veya TM1 sayaçları aktif hale getirilecek. Süre=65535-süre denilip TMR lara bu süre yerleştirilecek ve TMR sıfırlandığı anda int çalıştırılacak.
INT bölümünde hesaplanmış süre değeri yeniden TMR 'a verilecek port toggle yapılacak flag silinecek ve dönülecek.
Bütün bunları teyid edersen işe başlayabiliriz.

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

igolcubasi

@ete
Problemime ilgilendiğin için teşekkür ederim.
Kesme olarak asmbler kullandım.Ams de bir yazmacı inc veya dec komutları ile artırıp azaltabiliyorum.Örnek

inc _darbe,f gibi

burda darbe byte olarak pbp tanımlanırsa sorun yok.Ben darbeyi word olarak tanımladığım için asm olarak bunu nasıl artırıp azaltacağımı bilemedim.Yada word olarak tanımladığım darbe yazmacını asm olarak
nasıl kullanacağım?

ete

@igolcubasi,

Bildiğim kadarı ile ASM de 16 bit yazmaç kullanamzsın. Bunun için sen yine PBP da Darbe yi word olarak tanımla ve artırma işlemini aşağıdaki gibi yap;
önce değişken tanımlama detayını vereyim.

Darbe     var word
DarbeL    var Darbe.byte0
DarbeH    var Darbe.byte1

darbe nin artırılması;

L_Artır
        inc _darbeL.f
        btfsc Status,Z
        goto H_Artır
        goto cık
H-Artır
        inc_darbeH,f
        btfsc Status,Z
        Goto Overflow
        goto cık

Yani temel amaç, önce low baytı artırıyorsun. FF (255)'i bulduktan sonra tekrar sıfıra dönülmüş ise H_Baytın bir artırılması gerekir. Sonuç olarak Darbe (word) değeri hesaplanırken = H-Bayte x 256 + L_Bayt olduğuna göre bu mantık çalışır.
Tabiiki her iki baytta aşma noktalarında status Z bitinin 1 olup olmadığına bakacaksın. Bu arada artırılan yazmaçı tekrar kendine yazarsan status Z biti aşma halinde bir olurmu bilmiyorum. Belkide önce W yazmacına değeri vereceksin bu aşamada Z bitini kontrol edeceksin daha sonra DarbeL veya DarbeH yazmacına değerini geri koyacaksın. Bunları denemek lazım. Belki ustalar bu konuya bir yorum getirirler.

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