printf ondalıklı sayı gösterme sorunu

Başlatan gtokmak91, 18 Ekim 2012, 22:35:06

gtokmak91

Arkadaşlar uzun zamandır uğraşıyorum malesef lcd ekranda ondalıklı sayıyı gösteremedim.Ne türlü sorun var anlamış değilim.
dosyaları yükledim bakmak isterseniz.

http://s3.dosya.tc/server4/q0otTm/Atmega8_Lcd.rar.html
/*
 * Atmega8_Lcd.c
 *
 * Created: 18.10.2012 17:11:39
 *  Author: Gökhan
 */ 


#include <avr/io.h> 
#include "lcd.h"
#include <util/delay.h> 
#include <stdio.h>

FILE lcd_str = FDEV_SETUP_STREAM(lcd_data, NULL,_FDEV_SETUP_WRITE);


int main(void)
{
	float sayi=15.5;
	unsigned long x=0 , z=0; 
	stdout = stdin = &lcd_str; // giriþ cikiþin aktarilmasi
	
	lcd_hazirla(); // LCd on hazirlik
	lcd_satirsutun( 0, 1 );
	lcd_yaz(" ATMAGA8 LCD");
	lcd_satirsutun( 1, 2 );
	lcd_yaz("DENEMESI");
	_delay_ms(1000);
	lcd_sil();
while(1)
{

	
	
	
	lcd_satirsutun( 0, 1 ); // Lcd nin 1. satir 0 sutununa git
	lcd_yaz("ONDALIKLI SAYI"); // printf kullanimi.
	lcd_satirsutun( 0, 2 ); // Lcd nin 2. satir 0 sutununa git
	printf("=%3f",sayi); // printf kullanimi.
	
	 
	
	
	_delay_ms(500);

}	
}

JKramer

%x.yf
x: Toplam genişlik
y: Noktadan sonraki basamak sayısı

15.5 gösterimi için, %4.1f şeklinde kullanırsanız olması gerekiyor.

diot

Peki decimal gruplar arsına nokta koyarak ayırma işlemi nasıl oluyor. mesela 1000000 u 1.000.000 şeklinde göstermeyi nasıl yapacaz.

JKramer

printf fonksiyonunda öyle bir özellik yok diye biliyorum, "digit grouping" şeklinde bir arama yapınca bazı örnekler çıkıyor.

AsHeS

Yanlış biliyor olabilirim ama printf fonksiyonu seri porta veri basmak için kullanılıyor MCU için olan derleyecilerde(genelde).

gtokmak91

#5
Alıntı yapılan: JKramer - 19 Ekim 2012, 08:48:45
%x.yf
x: Toplam genişlik
y: Noktadan sonraki basamak sayısı

15.5 gösterimi için, %4.1f şeklinde kullanırsanız olması gerekiyor.

Bu dediğiniz şekilde denedim olmuyor ? çıkıyor ekranda
printf("= %4.1f",sayi);

yaptığım halde aynı sorun  ama  printf("= %4d",sayi);  decimal olarak yaptığımda ekranda sayıyı gösteriyor.
Acaba lcd kütüphanesinden kaynaklanan sorun olabilir mi?

dosyaları yüklemiştim bakmak isterseniz.
Avr studio 6 da derleme yaptım.
Isıs 7.1 sp 9

Klein

Derleyici ayarlarından olabilir. Bazı derleyicilerde  printf ve scanf opsiyonları bulunuyor.  Az miktarda program belleğine sahip işlemcilerde kodu kısaltmak için printf fonksiyonundan floating point işlemleri kaldırılıyor.
İar derleyicide "printf" ve "scanf"  ; "small", "medium" ve "large" olarak seçilebiliyor. "large" seçilirse floating sayıları işleyebiliyor.

gtokmak91

Hocam kafayı yiyeceğim valla artık canımı sıktı yaa 1 haftadır uğraşıyorum yapamadım  :'(  avr studio 6 kullanıyorum atmelden vazgeçecektim şu eaysAVR6 almasaydım  :)

Klein

nette şöyle birşey buldum. belki işine yarar.
printf support: 
( ) Standard 
(*) Float 
( ) Minimal 

scanf support: 
(*) Standard 
( ) Float 
( ) Minimal

gtokmak91

OHHH beee sonunda oldu yabancı sitelerde forumlarda büyük uğraşlar sonunda buldum ve oldu sorun çözüldü resimli bir şekilde anlatmak istiyorum diğer arkadaşlara yardımcı olur.

proje dosyası üzerinde sağ tıklıyoruz (1)
properties tıklıyoruz (2)
açılan pencereden toolchain (3)
AVR/GNU C Linker altındaki libraries (4)
açılan pencerede sağdan add ıtem tıklıyoruz (5)  açılan pencereye  printf_flt,-u,vfprintf,-lm  bunu yapıştırıyoruz ve ok
son olarak alttan eklediğimiz uzantı görünüyor (6) derlediğimiz zaman float kullanabiliriz artık :)


M_B

Cozduğünüze sevindim.
Alıntı yapılan: Klein - 19 Ekim 2012, 19:55:32
Derleyici ayarlarından olabilir. Bazı derleyicilerde  printf ve scanf opsiyonları bulunuyor.  Az miktarda program belleğine sahip işlemcilerde kodu kısaltmak için printf fonksiyonundan floating point işlemleri kaldırılıyor.
İar derleyicide "printf" ve "scanf"  ; "small", "medium" ve "large" olarak seçilebiliyor. "large" seçilirse floating sayıları işleyebiliyor.

Sonuca bakarsak Klein hoca derleyici ayarlarından olabilir demişti.

Resimli acıklamada güzel olmuş elinize sağlık.


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

gtokmak91

evet Klein arkadaşımızın dediği gibi derleyici ayarlarında yoğunlaşınca zorda olsa  sorunu çözdüm
Paylaşmak güzel yardımcı olanlara teşekkür ederim :)

karacan451



Arkadaşlar gtokmak91 bahsettiği menü bende yoktu galiba farklı sürümünden kaynaklanan bir şeydi (WinAVR-20100110). Ben sorunu resimdeki gibi hallettim.Resimdeki işlemi hallettikten sonra save as diyerek proje dosyanıza ekleyiniz. Eğer lcd ekranınızda fazla sıfır varsa printf("%2.f",i); sayıyı arttırın
( printf("%3.f",sicaklik);   printf("%4.f",sicaklik); gibi )

Allah Size Kolaylık Versin.....