Sharp Sensör değer çıkış voltajını okuyup, Mesafeye çevirip, LCD'ye yazdırmak

Başlatan lamneth48, 02 Ocak 2013, 21:27:00

lamneth48

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.

                #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
        }
}

emregenc

voltaj 1
voltaj 2
değişkenlerinide float tanımlayarak tekrar dene kodunu

olmadı
proteus ve yazılım dosyalarını paylaşırsan düzenlemeye çalışırım

lamneth48

merhaba emre kardeşim. onları da denedim ama olmadı. proje dosyası burada. http://www.4shared.com/rar/6sGPrpae/hi-tech.html ilgilendiğin çok teşekkür ederim. inşallah yapabilirsin. tekrar Allah razı olsun.

Eren Eraslan

kardeşim para karşılığında yaptığım bir projeyi senin için paylaşıyorum , ccs de yazdım fakat farketmez kod çalışıyor gerekli bağlantıları yapıp gereksiz yerleri silersen işini görür

https://github.com/reeraslan/Projelerim/tree/master/Elektronik%20Projeler/ADC%20Converter%20Proje%20release
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan