LCD de Ondalıklı sayıyı basamaklarla olusturup Eproma kaydetmek Hk.

Başlatan axionvb, 27 Mart 2011, 02:33:18

axionvb

Acele ile yazdığımdan dizinin tüm index değerlerini 0 olarak yazmışım. Normalde 0,1,2,3,4,5,6,7 şeklindedir.

Ayrıca verdiğiniz son komutu kullanamadım çünkü tanımlı değil diyor hem sscanf ve Temp için, Ben ekranda sayı oluşturma işini bir fonksiyonda son basamak değerinden sonraki kaydetme işlemini başka bir fonksiyonda yapıyorum. Bu durumda değişiklik sadece m3HF dizisinde ve LCD ekranda yapılıyor. sizin verdiğiniz komutla ekrana yazılmadan önceki değer bulunmuyormu. Bu durumda değişmiş halini kaydetmemiş olacağız. sscanf komutunu Serdar ÇİÇEK in hazırladığı kitapta bulamadım. CCS C daha kapsamlı anlatan başka bir kitap varmı? En azından o kitabı alıp size benim için zor sizin için kolay sorular sormak yerine sizin de ilginizi çekecek tarzda sorular sormak isterim.

char m3HF[9];
void Deger_Al(int8 Bsmk)
{
         float Temp;
         ee_read_float(0,&Temp);         // Eprmda 0. adresdeki değeri oku
         sprintf(m3HF,"%08.2f",Temp); // m3HF dizinine ekle
         lcd_imlec(2,1);         
         printf(lcd_Yaz,"                ");    // LCD 2.satır 1.sutun seç ve bu satırı temizle     
         lcd_imlec(2,1);
         printf(lcd_Yaz,"%08.2f",Temp); // Epromdan okunan değeri 2.satır 1.sutuna yaz.
         lcd_imlec(2,Bsmk);                    // aktif olan Basamak karakterine konumlan
         printf(lcd_Yaz,"\j");                   // ve o karaktere yanıp sönme efekti uygula
}
void Basamak_LCD(int8 BasamakDegeri, int8 Bsmk)  // Son basamak degeri LCD de değiştirildikten sonra OK basılmış ise bu fonksiyona geliyor.

{
        if(Bsmk==9) 
        {
              Kaydet(); // Son Basamak da OK ise bu fonksiyona git. Yoksa Basamak değerini değiştirmeye devam et.
        }
        int8 m3HFx;            
        m3HFx=(int8)lcd_getc(2,Bsmk);  // LCD ekrandaki ilgili basamak karakterini değişkene al.           
        m3HFx++;                                         // Değeri 1 arttır.
        if(m3HFx>'9'){m3HFx='0';}               // 9 dan büyükse 0 yap. değilse devam et.
        m3HF[Bsmk-1]=m3HFx;              // değeri dizinin ilgili indexsine yaz.
}
void Kaydet()
{
        lcd_imlec(2,1);                                 // LCD 2.satır 1.Sutun seç
        printf(lcd_Yaz,"\c");                         // Yanıp Sönme efektini kapat
        lcd_imlec(1,1);                                 // LCD 1.satır 1.sutun seç
        printf(lcd_Yaz,"Kaydediyor...   ");    // Kaydediyor... yaz 
        lcd_imlec(2,1);                                // LCD 2.satır 1.sutun seç
        printf(lcd_Yaz,"                ");           // Oluşturulan ondalıklı sayıyı ekrandan sil.
        sscanf(buffer,"%08.2f",&Temp);    // sscanf ve Temp tanımlı değil uyarısı veriyor. sscanf diye fonksiyonu bulamadım
        ee_write_float(0,&Temp);              // 
        Delay_Ms(2000);                            // 2 sn. bekle
        lcd_imlec(1,1);                                // LCD 1.satır 1.sutun seç
        printf(lcd_Yaz,"                ");           // Kaydediyor... yazısını temizle

}

Klein

CCS konusunda hiç bilgim yok malesef. Bir ara kurmuştum ama Standart C kalıplarına uymadığı için kaldırdım. Daha sonra da hiç ilgilenmedim.
sscanf fonksiyonunun hangi kütüphanede bulunduğunu hatırlamıyorum. stdlib kütüphanesinde olabilir.
sğse sscanf fonksiyonunu bulamazsanız  sizin yaptığınız gibi çarpma toplama yaparak da sonuç bulunabilir. dizi referanslarının düzeltilmiş halini tekrar yazarsan hatanın nerede olduğuna tekrar bakabiliriz.

temp benim uydurduğum float tipinde bir değişken. illa temp olması gerekmez. herhangi bir float değiken olur.

axionvb

Çarpma işlemi ile yaptığım kodlar aşağıdaki gibi, Önce ekrandaki karekterler değiştirilerek oluşturulan m3HF dizisinin isis de okunan şeklini yazıyorum Dizi içeriği aşağıdaki gibi;

m3HF[0]='2'
m3HF[1]='0'
m3HF[2]='4'
m3HF[3]='9'
m3HF[4]='6'
m3HF[5]='.'
m3HF[6]='2'
m3HF[7]='3'
m3HF[8]='\0'

Bu diziyi çarpma işlemi ile float tipine dönüştürüp eproma yazma kodları aşağıdaki gibidir.

float Sonuc;
Sonuc=(m3HF[0]*10000)+(m3HF[1]*1000)+(m3HF[2]*100)+(m3HF[3]*10)+(m3HF[4]*1)+(m3HF[6]*0.10)+(m3HF[7]*0.01);
ee_write_float(0,&Sonuc);

ekrandaki yazı 20496.23 karakterlerinden oluşuyor. Yapılan işlem sonucunda epromdan tekrar okuduğumda 23909.51 olarak okunuyor. Oysa 20496.23 olarak okunmalıydı.

JKramer

"Sonuc"u eeprom'a yazmadan önce ekrana yazıp kontrol edin. Beklediğiniz gibiyse float sayıyı eeprom'a yazmayla (ya da okumayla) ilgili bir sorun vardır.

Ayrıca sscanf fonksiyonunu araştırmadım ama string'i float bir değişkene yazmak için stdlib.h içindeki atof() fonksiyonunu kullanabilirsiniz. (Yardım dosyası içinde atof diye aratırsanız örneği bulabilirsiniz.)

axionvb

m3HF[0]='2'
m3HF[1]='0'
m3HF[2]='4'
m3HF[3]='9'
m3HF[4]='6'
m3HF[5]='.'
m3HF[6]='2'
m3HF[7]='3'
m3HF[8]='\0'

Bu diziyi çarpma işlemi ile float tipine dönüştürüp eproma yazma kodları aşağıdaki gibidir.

float Sonuc;
Sonuc=(m3HF[0]*10000)+(m3HF[1]*1000)+(m3HF[2]*100)+(m3HF[3]*10)+(m3HF[4]*1)+(m3HF[6]*0.10)+(m3HF[7]*0.01);

ee_write_float(0,&Sonuc);

üstü çizili komut yerine ;

Sonuc=atof(m3HF);
komutunu eklediğimde 20496.23 olan ekran değeri eproma yazıldıktan sonra tekrar okutulunca 20496.22 olarak geliyor. Bu işlemle istenen değere daha yakın bir değer elde ediliyor. Anlayamadığım neden ondalıktan sonraki kısım 23 değil de 22 olarak geliyor.

her sayı için epromdan okunan değere 0.01 mi eklemem gerekecek ?

axionvb

JKramer sizin mesajınızı okumadan önce yazmıştım. Sizin de ifade ettiğiniz gibi atof komutunu kullandım ama 0.01 kadar eksik geri dönüyor epromdan.

axionvb

Sayın JKramer sizin dediğiniz gibi eproma yazdırma satırını iptal edip Sonuc değişkenini m3HF dizisine ve ekrana tekrar yazdırdığımda 0.01 değeri kadar eksik yazıyor. Yani değer 20496.23 iken 20496.22 olarak yazıyor. Bu durumda eproma yazma ile ilgili değil sorun atof komutuyla ilgili sanıyorum.

axionvb

20496.23 ü 20496.22 yazıyor.
08916.24 olarak ekranda oluşturduğum sayıyı 08916.24 olarak geri okuyorum.

Sanırım atof fonksiyonunu modifiye etmek gerekecek.


axionvb

Aşağıdaki linkte verdiğim örnek çalışma da sorunun giderilmiş şeklini görebilirsiniz. Ayrıca 2x16 LCD Menu yapımınıda bu uygulamadaki kodları kullanarak kendi uygulamanıza ekleyebilirsiniz. Örnek çalışma dosyalarının yeri linkteki mesajda verilmiştir.

https://www.picproje.org/index.php/topic,32746.0.html

klutch