MPLAB Float Değer Sorunu(Düzeldi)

Başlatan NaMcHo, 20 Eylül 2010, 11:11:51

NaMcHo

Merhabalar,

Isis,cof,hex dosyaları : http://hotfile.com/dl/70626378/9413cf9/ADC_deneme2.rar.html
#include <htc.h>
#include <stdio.h>
#include "delay.h"
#include "LCD216_benim.h"

void main(void)
{
     unsigned int voltaj,deger[17];
     TRISA=0x01;      
     float voltaj_son;
     TRISB=0;         PORTB=0;
     TRISC=0;         PORTC=0;   
     
     CHS0=0; 
     CHS1=0;
     CHS2=0;        //RA0 dan ADC okuması gerceklesiyor.
     DelayUs(50);

     ADCS0=1;    
     ADCS1=1;

     ADFM=1;

     PCFG0=0;         //RA0 Analog digerleri dijital.
     PCFG1=1;
     PCFG2=1;
     PCFG3=1;

     ADON=1;
     lcd_hazirla(); 
     for(;;)
     {      
           ADGO=1;
           while(ADGO);        //ADC işlemi bitene kadar bekliyor.
           voltaj=ADRESL;
           voltaj+=(unsigned int)ADRESH*256;        //ADC deger.
           voltaj_son=voltaj*(30/1023);                //ADC degerin volta dönüstürme işlemi.(0,03 hata ile) Okunacak Volt değer aralığı 1.25-30.
           sprintf(deger,"ADC : %d",voltaj);
           imlec(1,1);
           lcd_yaz(deger);

           sprintf(deger,"Voltaj : %lf",voltaj_son);
           imlec(2,1);
           lcd_yaz(deger);
           DelayMs(50);
     }
}

Düzeltme: Mplab ı kapatıp açtıktan sonra derleme hatası oluşmadı fakat Float değişken değerim 'voltaj_son' lcd de 0.00000 olarak gozukuyor.(ADC degerinde sorun yok.)

Mplab 8.53 kullanıyorum derleme sonunda ise aldıgım uyarılar:
Warning [1090] C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\lib\doprnt.c; 496. variable "_width" is not used
Warning [1090] C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\lib\doprnt.c; 510. variable "_d" is not used
Warning [1090] C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\lib\doprnt.c; 513. variable "_ival" is not used


Forumu inceledim float değişkenlerle ilgili açılan başlıkları fakat düzeltemedim bu sorunumu,birde arslan74'ün ders notlarında bulunan float değişkeninin lcd'ye yazdırmak için derleyiciden PICC Linker bölümünden yaptığı ayarın cok daha farklı bir hali var suan kullandıgım v8.53'de,bu versiyonda bu ayarı nasıl yapabilirim?

son bir not,
ADC den okunan 0-1023 arasındaki degeri lcd de görebiliyorum,30V == 1023 e denk geliyor.

İyi günler.

NaMcHo

#1
MPLAB  v8.56 Kurup yeniden derleme yapıp,similasyonu denedim fakat yine aynı sorun devam ediyor,float değeri lcd de 0.00 olarak görüyorum
#include <htc.h>
#include <stdio.h>
#include "delay.h"
#include "LCD216_benim.h"

unsigned int adc,deger[17];
float voltaj,x=2,78;
void main(void)
{
    TRISA=0x01;
    TRISB=0;   PORTB=0;
    TRISC=0;   PORTC=0;
    
    CHS0=0; CHS1=0; CHS2=0;                        //RA0 dan ADC yapılcak.
    DelayUs(50);
    ADCS0=1;   ADCS1=1;                            //RC osilatör secildi.
    PCFG0=0;   PCFG1=1;    PCFG2=1;    PCFG3=1;    //RA0 analog diger portlar dijital.
    ADFM=1;                                        //Sağa dayalı 10bitlik.
    ADON=1;
    
    lcd_hazirla();
    for(;;)
    {
        ADGO=1;
        while(ADGO);
        adc=ADRESL;    adc+=((unsigned int)ADRESH*256);
        voltaj=adc*(30/1024);
        sprintf(deger,"ADC : %d",adc);
        imlec(1,1);
        lcd_yaz(deger);
        
        sprintf(deger,"Voltaj: %.2lf",x);
        imlec(2,1);
        lcd_yaz(deger); 
        DelayMs(250);      
    } 
}


Isis,cof,hex : http://hotfile.com/links/70666142/57e998b/ADC_olacak.rar

Birde bazen programda ufak bir değişiklik yaptıktan sonra derleme işlemi yapınca şu çıktıları alıyorum:
[color=blue]Error   [285] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 7.18 no identifier in declaration
Error   [314] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 7.18 ";" expected
Warning [359] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 28.14 illegal conversion between pointer types
pointer to unsigned int -> pointer to unsigned char
Warning [359] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 30.14 illegal conversion between pointer types
pointer to unsigned int -> pointer to const unsigned char
Warning [359] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 32.14 illegal conversion between pointer types
pointer to unsigned int -> pointer to unsigned char
Error   [971] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 32.15 type modifiers not valid with this format
Warning [359] C:\Users\NaMcHo\Documents\Projelerim\ADC olacak\main.c; 34.14 illegal conversion between pointer types[/color]

sonra birdaha derleme yaptığımda hatalarını ve uyarılarını  almıyorum bir gariplik yokmu bu işte?

JKramer

Ekrana sadece şunu yazdırın:
voltaj=30/1024;

Float değeri göremiyorsanız şunu deneyin:
voltaj=30.0/1024;

Ya da şunu:
voltaj=(float)30/1024;

Bu aşamayı geçerseniz (float)adc ile çarpma işlemine geçersiniz.

NaMcHo

#3
@Jkramer cevabınız icin teşekkürler
voltaj=30./1023;  lcd de göründü 0.03 olarak fakat sonra adc ile bu sonucu carpıp göstermeye calıştığımda 0.00 olarak görünüyor,
şöyle birşey de denedim float x değişkeni tanımlayıp x=voltaj*1000 in değerini lcd de göstermeyi denedim çıkan sonuç:0.33 oldu  :o  ilginçtir 0.03 ü 1000 ile carpınca sonuç nasıl 0.33 çıkabilirki?

Birde sprintf(deger,"Voltaj: %.2lf",x); surda  %.2lf yerine %2.2lf yazdığımda yine ilginç birşey olarak    sprintf(deger,"ADC : %d",adc); bu fonksiyonun gösterdigi deger, eger 30V verirsem RA0 dan, 0 oluyor halbuki normalde düzgün olarak 1023 ü gösterdiği halde, sonuç olarak ya bu mplab çıldırmış yada  hi-tech.

Birde x değişkenini int olarak aldım ve lcd de istedigim değeri tam sayı olarak görebildim.27volt verdigimde RA0'a  lcd'de 27V, 19V verincede 19V lcd'de gözüktü
#include <htc.h>
#include <stdio.h>
#include "delay.h"
#include "LCD216_benim.h"

unsigned int adc,deger[17],x;
float voltaj;
void main(void)
{
    TRISA=0x01;
    TRISB=0;   PORTB=0;
    TRISC=0;   PORTC=0;
    
    CHS0=0; CHS1=0; CHS2=0;                        //RA0 dan ADC yapılcak.
    DelayUs(50);
    ADCS0=1;   ADCS1=1;                            //RC osilatör secildi.
    PCFG0=0;   PCFG1=1;    PCFG2=1;    PCFG3=1;    //RA0 analog diger portlar dijital.
    ADFM=1;                                        //Sağa dayalı 10bitlik.
    ADON=1;
    
    lcd_hazirla();
    for(;;)
    {
        ADGO=1;
        while(ADGO);
        adc=ADRESL;    adc+=((unsigned int)ADRESH*256);
        voltaj=(30.0/1023);
        x=(float)(voltaj*adc);
        sprintf(deger,"ADC : %d",adc);
        imlec(1,1);
        lcd_yaz(deger);
        DelayMs(100);
        sprintf(deger,"Voltaj : %d",x);
        imlec(2,1);
        lcd_yaz(deger); 
        DelayMs(250);      
    } 
}


float olarak hala yapabilmiş değilim.

M_B

Merhaba;

unsigned int adc,deger[17];
int değilde char tanımla. Asıl sorun burda değil ama int yede gerek yok.

ADGO=1; 
  while(ADGO);
  adc=ADRESL;    adc+=((unsigned int)ADRESH*256); 
  voltaj=(30.0/1023)*adc;
  sprintf(deger,"ADC : %d",adc);
  imlec(1,1);
  lcd_yaz(deger);
  DelayMs(100);
  sprintf(deger,"Voltaj : %f V",voltaj); 
  imlec(2,1);
  lcd_yaz(deger);   
  DelayMs(250);   


Şeklinde kodunu denediğinde sorun olmaması lazım.

Not: Burda puf nokta
  
 sprintf(deger,"Voltaj : %f V",voltaj);

kodunda kullanılan %f kısmıdır.

Kolay gelsin.
M_B


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

NaMcHo

#5
@M_B Merhabalar
    for(;;)
    {
        ADGO=1;
        while(ADGO);
        adc=ADRESL;    adc+=((unsigned int)ADRESH*256);
        voltaj=(30.0/1023)*adc;
        
        sprintf(deger,"ADC : %d",adc);
        imlec(1,1);
        lcd_yaz(deger);
        DelayMs(100);
        sprintf(deger,"Voltaj : %.2fV",voltaj);
        imlec(2,1);
        lcd_yaz(deger); 
        DelayMs(250);      
    }

Dediğiniz gibi değistirdim fakat hala 0.00 degerini goruyorum lcd de.
Birde float x=2.76 yaotım ve sprintf(deger,"Voltaj : %.2f V",x);  lcd_yaz(deger); yazınca lcd'de 0.76V gozuktu,sanırım Derleyici ayarlarında bir eksiklik var...

M_B

Merhaba;

Mlap ta
Compiler ayarlarından Float değişken'ler kullanmak için
olan ayarları etkin yapmak gerekiyor.

https://www.picproje.org/index.php/topic,19299.msg128736.html#msg128736
linkinde arslan74 hocamız nasıl yapılacagını gostermiş.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

NaMcHo

#7
@M_B
Evet bunu biliyorum fakat benim MPLAB 8.56 ve aslan74'ün gösterdigi ayarlar yok bende
Ekran görüntülerihttp://hotfile.com/dl/70775843/fb07671/Desktop.rar.html

JKramer

Son gönderdiğiniz kodu denediyseniz M_B'nin verdiği şekilde değil:
sprintf(deger,"Voltaj : %.2fV",voltaj);


%A.B

A: Toplam genişlik (nokta'dan öncesi (tam kısım)+ nokta + noktadan sonrası (ondalık kısım))
B: Noktadan sonraki hane sayısı

CCS'te de %.2f ekrana 0 yazdırdı.

NaMcHo

#9
sprintf(deger,"Voltaj : %2.1fV",x); lcd_yaz(deger);   x=23.79 yaptım ve lcd de 0.8 göründü 2.2 yapıncada 0.79 görünüyor direk %f yazıncada 0.79000  yazıyor,tam kısmı neden göstermezki hala anlam veremedim... "Hi-tech User Guid" ınada baktım ama sonuc alamadım hala.

ADC den okuduğum değer ab.cdef gibi bir değer olsun ben bunu x=(unsigned int)ab.cdef*100; yapıp unsigned int x değişkenine atadım ve bunu lcd de yazdırdığımda ab00 değerini görüyorum.
Bu float olayını v8.56 da deneyip beni bilgilendirebilirseniz sevinirim.
İyi günler.

NaMcHo

Halen float değeri lcd'de gösterebilmiş değilim fakat,tam sayı olarak voltajı okuyabiliyorum amacım küsüratlı değerleride okuyabilmek.

#include <htc.h>
#include "delay.h"
#include "LCD216_benim.h"

unsigned char deger[17];
unsigned int adc,voltaj;

void main(void)
{
    TRISA=0x01;
    TRISB=0;   PORTB=0;
    TRISC=0;   PORTC=0;
    
    CHS0=0; CHS1=0; CHS2=0;                        //RA0 dan ADC yapılcak.
    DelayUs(50);
    ADCS0=1;   ADCS1=1;                            //RC osilatör secildi.
    PCFG0=0;   PCFG1=1;    PCFG2=1;    PCFG3=1;    //RA0 analog diger portlar dijital.
    ADFM=1;                                        //Sağa dayalı 10bitlik.
    ADON=1;
    
    lcd_hazirla();
    for(;;)
    {
        ADGO=1;
        while(ADGO);             //ADC işlemi bitene kadar bekleniyor.
        adc=ADRESL;    adc+=((unsigned int)ADRESH*256);
        DelayMs(100);
        voltaj=((unsigned int)adc*(30.0/1023));
        voltaj=voltaj*100;
        imlec(1,1);
        lcd_yaz("ADC : ");
        imlec(1,6);
        lcd_karakter_yolla(adc/1000 + 48);
        lcd_karakter_yolla((adc%1000)/100 + 48);
        lcd_karakter_yolla(((adc%1000)%100)/10 + 48);
        lcd_karakter_yolla((adc%10) + 48);
        DelayMs(50);

        imlec(2,1);
        lcd_yaz("Voltaj : ");
        imlec(2,10);
        lcd_karakter_yolla(voltaj/1000 + 48);
        lcd_karakter_yolla((voltaj%1000)/100 + 48);
        lcd_yaz(".");
        lcd_karakter_yolla(((voltaj%1000)%100)/10 + 48);
        lcd_karakter_yolla((voltaj%10) + 48);
        lcd_yaz("V");    
    } 
}


JKramer

MPLAB'ı aradan çıkartmanız mümkün değil mi? Doğrudan Hi-Tech'in içinden ya da başka bir ide yardımıyla derlemeyi deneyin. Bir de test programında adc'yi falan çıkartın, sorun o kısımla ilgili değil:

float voltaj=23.78;
//ekrana yazma komutu

NaMcHo

#12
Hi-tech 9.80 i kurdum ve son bir deneme daha yaptım;
#include <htc.h>
#include "delay.h"
#include "LCD216_benim.h"

unsigned int adc,x;
float voltaj;

void main(void)
{
    TRISA=0x01;
    TRISB=0;    PORTB=0;
    TRISC=0;    PORTC=0;

    CHS0=0;    CHS1=0;    CHS2=0;  //RA0 dan ADC işlemi gerceklescek.
    PCFG0=0;    PCFG1=1;    PCFG2=1;    PCFG3=1;    //RA0 Analog diğerleri dijital.
    ADCS0=1;    ADCS1=1;    //RC osilatör secildi ADC icin.

    ADFM=1;
    ADON=1;
    
    lcd_hazirla();
    lcd_yaz("Voltaj Ust SINIR");
    imlec(2,1);
    lcd_yaz("30V'dur!");
    for(x=0;x<10;x++)
    DelayMs(100);
    lcd_temizle();
    for(;;)
    {
        ADGO=1;
        while(ADGO);                                //ADC işlemi bitene kadar bekle.
        adc=ADRESL;    adc+=(unsigned int)ADRESH*256;
        voltaj=(30.0/1023)*adc;
        x=voltaj*100;
        imlec(1,1);
        lcd_yaz("ADC:");
        lcd_karakter_yolla(adc/1000 + 48);
        lcd_karakter_yolla((adc%1000)/100 + 48);
        lcd_karakter_yolla((adc%100)/10 + 48);
        lcd_karakter_yolla(adc%10 +48);
        
        imlec(2,1);
        lcd_yaz("Voltaj:");
        lcd_karakter_yolla(x/1000 + 48);
        lcd_karakter_yolla((x%1000)/100 + 48);
        lcd_yaz(".");
        lcd_karakter_yolla((x%100)/10 + 48);
        lcd_karakter_yolla(x%10 + 48);
        lcd_yaz("V");
        DelayMs(100);
    }
}


-Jkramer ve M_B'ye teşekkür ederim zaman ayırıp ilgilendiğiniz için.