Sida 1 av 2

Omvandling mellan datatyper -=LÖST=-

Postat: 17 maj 2005, 15:19:04
av DeVille
Nu är jag riktigt trött.

Om jag har ett flyttal.. ex 3.45 och vill skriva ut det på LCD displayen..
hur ska jag göra? det bästa hade varit att få 4 variabler,
10-tal, 1-tal, decimal1, decimal2... hur att göra?

Postat: 17 maj 2005, 15:28:41
av Fagge
Du får väll köra en subrutin som omvandlar det binära talet till BCD-kod först!.
Sedan är det ju bara att skifta runt sifrorna & adera med #$30 & direkt ut till displayen!.
Vilken processor använder du?

Postat: 17 maj 2005, 15:35:07
av DeVille
Använder en AT90s8515
AVR GCC

Postat: 17 maj 2005, 15:36:02
av MicaelKarlsson
I winAVR för AVR finns kommandona:
dtostrf -- För formatet: "[-]d.ddd"
dtostre -- För formatet: "[-]d.ddde177dd":

dtostrf(flyttals_variabel,NrOfDigits,NrOfDecimals,teckensträngen);

Lycka till!!

Postat: 17 maj 2005, 15:44:43
av DeVille
aha.. så flyttalet blir en tecken sträng?
float test=3.45;

skulle bli

Kod: Markera allt

             
       bit    0123
unsigned char[3.45]

Postat: 17 maj 2005, 16:05:58
av MicaelKarlsson
Japp!
Ditt flyttal omvandlas till en teckensträng på formatet "[-]d.ddd" sedan är det bara att skriva ut det på displayen på samma sätt som du skriver ut text. :)

Postat: 17 maj 2005, 16:52:35
av Rymdninja
unsigned char buffer[256];

sprintf(buffer,"%f\0",ditt_tal);

skriv_till_lcd(buffer);


buffer innehåller ditt flyttal som en sträng...

funkar i alla c kompilatorer

Postat: 17 maj 2005, 20:43:51
av DeVille
okay då hänger jag med..

vilket lib ligger sprintf() i då? standard lib:en?

Tack för hjälpen!

Postat: 17 maj 2005, 21:03:09
av Icecap
sprintf brukar ligga i 'stdio.h'

Postat: 18 maj 2005, 10:32:41
av DeVille
Om jag vill använda math.h så måste ju den includeras.
samt att man ska lägga till LIBFLAGS= -ml i makefilen..

vad mer? jag får inte ex sqrt() att funka!

undefined reference fel när jag makear

Postat: 18 maj 2005, 11:47:16
av DeVille
math funktioner funkar nu iaf..

sprintf(); vill inte vara med och leka, hänger allting när jag använder den.

provade med följande;

float testing2;
unsigned char text[255];

testing2=sqrt(15);
dtostrf(testing2, 1, 2, text);

men det blir "som vanligt" undefined reference to dtostrf();

Postat: 18 maj 2005, 17:57:06
av erixon
Har du includat stdlib.h?

Postat: 23 maj 2005, 08:57:29
av DeVille
Nu har det framkommit att sprintf() inte fungerar under AVRX..

om jag har ett flyttal, ex 15.2 hur skall jag göra för att få 15 i en int och 2 i en annan int..

Nu har jag nämligen tröttnat på det här, så det blir en "ful" variant.

Postat: 23 maj 2005, 10:08:42
av Icecap
Float F = 15,2;
int X1 = F;
int X2 = (F - X1) * 1000,0;

t.ex.

Postat: 23 maj 2005, 10:31:47
av DeVille
aha.. borde jag tänkt på själv!

Nu har jag ett intressant problem.. om jag kör koden nedan så får jag
undefined reference to sqrt(). men om jag byter ut PORTA=tor; mot tex PORTA=b; så funkar kompileringen klockrent... varför blir det såhär?

Vad blir det eg i tor som den inte fattar? Varför vill den inte lägga det på PORTA??

Raden med *** i kommentaren är den där problemet uppstår.

Kod: Markera allt

int w;
float matemp;
float a,b,c,R,tor;

a=-131.59;
b=761.25;
c=25.71;
R=125.50;



//Gör uträkning
matemp=b-R;
tor=sqrt(matemp);
matemp=tor-c;
matemp=a*tor;
tor=matemp;

tor=(int)tor;  //Typomvandling


	while (1)
	{
	PORTA=128;		//Placera coursor i början av Display.
	eclock();
	delay();
	
	PORTA=tor;	//****Skriv ut variablen tor på Display. ex om tor=65 så blir det A på displayen.
	e_rsclock();
	delay();
	delay();
	
		for(;;)	//Gör ingenting.
		{
		w++;
		}

	}