pic ile basit matematiksel işlem

Başlatan Emre MERMİ, 16 Aralık 2013, 16:24:31

Emre MERMİ

iyigünler arkadaşlar pic ile desibelmetre yapmaya çalışıyorum proje olarak takıldığım basit bi yer var bu konuda yardımınızı isteyecem.
pic16f877a kullanıyorum mikrofondan gelen sesi ölçüp desibel cinsinden lcd ye yazdırcam devrede entegrede ve genel olarak kodlarda sıkıntı yok. 8 bit ADC kullanıyorum.

float desibel,voltaj,c,adc,a,b; 

tüm değişkenleri tanımladıktan sonra

a=0.01960784314;
   b=0.000000158113883;


adc=read_adc();
voltaj=a*adc;
   c=voltaj/b;
   desibel=log10(c);
printf(lcd_putc, "\f %f desibel ",desibel);

math.h kütüphanesini eklememe rağmen proğram sürekli  desibel=log10(c); komutunda takılıyor. derlerken bir sorun çıkmıyor ama lcd de yazı görünmüyor. log hesaplamasını çıkarınca lcd ye yazı gidiyor.  desibel=log(c) olarak da denedim yine çalışmadı.

Tagli

Alıntı yapılan: lethaldream - 16 Aralık 2013, 16:24:31log hesaplamasını çıkarınca lcd ye yazı gidiyor.
Bu giden sayı doğru mu peki?
Gökçe Tağlıoğlu

Kabil ATICI

sabit=a/b değerleri sabitse işlemini yapıp sabit sayı olarak kullansak;

bu şekilde sadece
c=sabit*adc olacak. Bu biraz hızlanma sağlayacaktır.
ambar7

Maxim

birşey söyleyebilirmiyim. (emin değilim ama)

proton+ da "log10" komutu var fakat 16 serisi piclerde çalışmıyor
ve işlemcinin yeteneksizliğindenmiş, 18 serisinde sorun yok.

bu da öyle birşey olmasın ?

Kabil ATICI

Derlemeden sonra genel kullanılan (bank0) flash bellek aşılıyor olabilir. (bank olayı)
Üretilen hex kodu adreslemeleri incelenebilir.

18f serisinde bank olayı yok.
ambar7

z

#5
Alıntı Yapa=0.01960784314;
b=0.000000158113883;

adc=read_adc();
voltaj=a*adc;
c=voltaj/b;
desibel=log10(c);

Bu işlemi  böyle uzun uzun yapmak yerine

desibel= 5.093+log(ADC) işlemini yap.

log komutu düzgün çalışmıyorsa 8 bit ADC sonuçları için log tablosu yap.

1 ..... 0
2 ......0.301
3.......0.477
4.......0.602
...
...
255....2.406

Tablo işlemciye sığmayacak olursa daha küçük tablo ile de yol buluruz. 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Emre MERMİ

#6
Alıntı yapılan: Tagli - 16 Aralık 2013, 16:53:40
Bu giden sayı doğru mu peki?
ilk başta tüm değişkenleri sıfırlıyorum ana fonksiyonda o  yüzden hepsi sıfır veya atadığım değer görüünüyor

mesaj birleştirme:: 16 Aralık 2013, 22:54:14

Alıntı yapılan: Maxim - 16 Aralık 2013, 17:44:47
birşey söyleyebilirmiyim. (emin değilim ama)

proton+ da "log10" komutu var fakat 16 serisi piclerde çalışmıyor
ve işlemcinin yeteneksizliğindenmiş, 18 serisinde sorun yok.

bu da öyle birşey olmasın ?

c ile yazıyorum proğramı ccs c ile derliyorum hocam, 18f mi alsam acaba o zaman kesin bilginiz varsa.

mesaj birleştirme:: 16 Aralık 2013, 23:01:47

Alıntı yapılan: ambar7 - 16 Aralık 2013, 17:41:55
sabit=a/b değerleri sabitse işlemini yapıp sabit sayı olarak kullansak;

bu şekilde sadece
c=sabit*adc olacak. Bu biraz hızlanma sağlayacaktır.

haklısınız hocam olabilir a=5V/255 adc dönüşümden geliyor ve b degeri de desibel hesabından kendi yürüttüğüm mantığa göre bulduğum değer o da kesin doğru değil. onu da şöyle hesapladım

desibel=log(Vgiriş/Vreferans)

Vgiriş en fazla 5V olcak pic girişi. desibel olarak da 150 desibel ölçsem en fazla
150 db=log(5/Vgiriş) formülünden buldum bu da bi varsayım daha doğuluğunu kanıtlayamadım  ;D
eksiğini fazlasını da mikrofondan sonra bağlayacağım bi opAmpla ayarlıcam diye düşünüyorum. Bu konuda da fikirlerinizi alsam ?

mesaj birleştirme:: 16 Aralık 2013, 23:04:51

Alıntı yapılan: ambar7 - 16 Aralık 2013, 18:30:27
Derlemeden sonra genel kullanılan (bank0) flash bellek aşılıyor olabilir. (bank olayı)
Üretilen hex kodu adreslemeleri incelenebilir.

18f serisinde bank olayı yok.

blank olayı hakkında biraz daha bilgi verebilirmisiniz hocam ?

mesaj birleştirme:: 16 Aralık 2013, 23:10:04

Alıntı yapılan: z - 16 Aralık 2013, 18:48:33
Bu işlemi  böyle uzun uzun yapmak yerine

desibel= 5.093+log(ADC) işlemini yap.

log komutu düzgün çalışmıyorsa 8 bit ADC sonuçları için log tablosu yap.

1 ..... 0
2 ......0.301
3.......0.477
4.......0.602
...
...
255....2.406

Tablo işlemciye sığmayacak olursa daha küçük tablo ile de yol buluruz.

matematiksel işlemde dediğiniz gibi bir kısaltma yapılabilir hocam ayrıca  logaritma tablosu da kafama yattı başka bi hesaplama yöntemi bulamazsam logaritma tablosu yaparım hocam teşekkürler bilgilendirme için

Emre MERMİ

Alıntı yapılan: z - 16 Aralık 2013, 18:48:33
Bu işlemi  böyle uzun uzun yapmak yerine

desibel= 5.093+log(ADC) işlemini yap.

log komutu düzgün çalışmıyorsa 8 bit ADC sonuçları için log tablosu yap.

1 ..... 0
2 ......0.301
3.......0.477
4.......0.602
...
...
255....2.406

Tablo işlemciye sığmayacak olursa daha küçük tablo ile de yol buluruz.

hocam;
int x[256] şeklinde bir dizi tanımladım log0 ve log255değerlerini sırayla buraya atadım fakat dediğiniz gibi 90 dan fazla değişkken almıyor bunun için ne yapmam lazım ? başka bir şekilde tanımlama yapabilirmiyiz yoksa pic18f452 ye mi geçeyim ?

Kabil ATICI

işlemci değiştir! Bacak bağlantıları aynı.
ambar7

z

0..89 arasını bir isimdeki arayde
90...179 arasıı bir başka isimdeki arayda
180... şeklinde arraylerde tutmayı deneyebilirsin.

Öte yandan komple logaritma tablosu tutmak yerine güzel bir kod parçasıyla verileri çarpanlara ayırırsan

x=a*b gibi iki çarpanı olan bir sayının logaritmasını log(a)+log(b) den hesaplayabilirsin. Bu durumda

Sadece 1,2,3,5,7,11,13,17,19,23,29,37,... gibi asal sayıların logaritma tablosunu kullanarak istediğin sayının logaritmasını hesaplayabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Emre MERMİ

arkadaşlar ilgilendiğiniz için çok teşşekkür ederim 18f452 aldım sorun ortadan kalktı