Omvandling mellan datatyper -=LÖST=-

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Omvandling mellan datatyper -=LÖST=-

Inlägg 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?
Senast redigerad av DeVille 25 maj 2005, 08:11:44, redigerad totalt 1 gång.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg 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?
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

Använder en AT90s8515
AVR GCC
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg 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!!
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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]
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg 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. :)
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg 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
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

okay då hänger jag med..

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

Tack för hjälpen!
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

sprintf brukar ligga i 'stdio.h'
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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();
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Har du includat stdlib.h?
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Float F = 15,2;
int X1 = F;
int X2 = (F - X1) * 1000,0;

t.ex.
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg 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++;
		}

	}
Skriv svar