Sharp Sensörden Okunan Voltajı Mesafeye Çevirip LCD'ye Yazdırmak... YARDIM?

lamneth

Üye
Katılım
8 Şub 2010
Mesajlar
40
Puanları
1
Yaş
36
Merhaba arkadaşlar,


dünden beri kafayı yemek üzereyim uyku bile uyumadım 2 saat uyudum hala daha uğraşıyorum lütfen yardımcı olabilir misiniz?


pic'e yeni başladım ve Fırat Deveci'nin kitabındaki analog voltaj okuma örneğini Sharp Sensör (10-80 cm)'den aldığım çıkış voltajını mesafeye çevirip, LCD'ye yazdırmak için biraz değiştirdim. değiştirdiğim kısımda yaptığım sadece sensörden okunan voltaj değerini voltaj_1=(float)((26,78)*mesafe^(-1,15)); fonksiyonunda yerine koyarak mesafe değerini hesaplamak. fakat ne yaparsam yapayım, okunan bu değer LCD'de mantıklı bir değer olarak görünmüyor. garip simgeler çıkıyor. +-.## 2+.-1 falan gibi değerler çıkıyor. Sorunun fonksiyondaki virgüllü ve üstel ifadelerden olduğunu düşünüyorum. nitekim fırat devecinin foknsiyonunda aldığı voltaj değerini ADRESH ve ADRESL registerlerinden integer a çeviriyor ve başka bir fonksiyonla çarpmadan direk LCD'ye yazdırıyor. Ama ben bu fonksiyonla çarpmak istersem saçmalıyor.


Lütfen yardımcı olabilir misiniz? Kod aşağıdadır. İlgilenen herkese şimdiden çok teşekkürler. PIC 16F877 kullanıyorum bu arada.


#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi tanımlanıyor
#include "lcd.h" // LCD kütüphanesi tanımlanıyor


int voltaj_1;
int voltaj_2;
char i=1;
int mesafe;

void main(void) // Ana fonksiyon alanı
{
TRISA=0x03; // Analog giriş için
TRISB=0x00; // LCD için çıkış
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;

PCFG3=0; // AN0 ve AN1 analog
PCFG2=1;
PCFG1=0;
PCFG0=0;

ADFM=1; // Sağa dayalı yazılıyor
ADON=1; // ADC açılıyor

ADIF=0; // ADC bayrağı temizleniyor
ADIE=1; // ADC kesmesi izni veriliyor
PEIE=1; // Genel ve yardımcı kesme izinleri veriliyor
GIE=1;

lcd_init(); // LCD ilk ayarları yapılıyor


lcd_yaz("1.Voltaj=");
lcd_gotoxy(2,1);
lcd_yaz("2.Voltaj=");
for(;;)
{
CHS2=0; // AN0 seçiliyor
CHS1=0;
CHS0=0;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
mesafe=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(1,10); // Okunan değer LCD'ye yazılıyor
voltaj_1=(float)((26,78)*mesafe^(-1,15));
veri_yolla(voltaj_1/1000+48);
veri_yolla((voltaj_1%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_1%100)/10+48);
veri_yolla(voltaj_1%10+48);
veri_yolla('V');
CHS2=0; // AN1 seçiliyor
CHS1=0;
CHS0=1;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
voltaj_2=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(2,10); // Okunan değer LCD'ye yazılıyor
veri_yolla(voltaj_2/1000+48);
veri_yolla((voltaj_2%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_2%100)/10+48);
veri_yolla(voltaj_2%10+48);
veri_yolla('V');
}
}


static void interrupt
led_yaz_son(void)
{
if(ADIF) // Çevrim bitiş kesmesi bekleniyor
{
GIE=0; // Başka kesme gelmesi engelleniyor
i=!i; // Her kesme de değili alınıyor
RC5=i; // Değer RC5'e aktarılıyor
ADIF=0; // Kesme bayrağı sıfırlanıyor
GIE=1; // Genel kesme alımı açılıyor
}
}
 
int voltaj_1; demişsin bunun içinde virgullu çarptırma yapmıyor bildiğim gerçi sen parantez içinde float yazmişsin sorunu çözüyor mu , sanmam. voltaj_1=(float)((26,78)*mesafe^(-1,15)); (float) demişsin ama bunun yerine direk bir float tanımlasan daha mantıklı gibi.
float voltaj_1 desen mesala bir de ona göre denesen.

Sonra emin olmak için mesafeye sabit bir değer verip desene virgülden mi değilmi?


 
onu da denemiştim ama olmamıştı. sabit bir değer şu an veremiyorum ama, fonksiyonla çarpmadan, okunan voltaj değerini direk görebiliyorum zaten LCD'de. herhangi bir sorun olmuyor.
 
Sayın lamneth konunuza baktım fakat benim yardımcı olabileceğim pekbirşey yok çünkü ben sadece asm biliyorum, konunuzdada söylenenlere paralel olarak sadece şunları söyleyebilirim, işlemleri adım adım yaparak kontrol etmek lazım ki bunu yapıyorsunuz, 1 lcd de istediğim herhangibir değişkeni (bir işlem veya fonksiyona sokmadan) direk görebiliyormuyum, 2 lcd de tek tek fonksiyonlarımı deneyip değer görebiliyormuyum ki bunun sonucunda hangi fonksiyonun yanlış değer çıkardığını görebileyim bu aşamadan sonra yanlış değer veren fonksiyon niçin yanlış değer veriyor ona bakmak lazım asm den başka dil bilmediğim için sizin yazdığınız programda fonksiyonları kullanım şekliniz doğrumu bilemiyorum, float çarpma işlemini kendiniz değerler girerek yaptırın ( hatta sadece iki sayıyı floating işleme sokup sonucu lcd de gösteren basit bir program parçası yazın sensörü işin içine bulaştırmayın başarılı olursanız sensörüde katarsınız) doğru sonuca ulaşabiliyormusunuz gözlemleyin konunuzdada söylendiği gibi problem floating point işleminden kaynaklanıyor olabilir.
 

Forum istatistikleri

Konular
128,188
Mesajlar
915,702
Kullanıcılar
449,956
Son üye
CharmanDear

Yeni konular

Geri
Üst