Hallo,

nog een vraagje: hoe kan ik een variabele in picbasic casten van float naar byte? Als ik een float waarde (bijv. 3.25) in een variable van het type byte kopieer, dan krijg ik niet de gewenste 3, maar een heel andere waarde.

Volgens mij gaat dat niet.

Ik zag toevallig vandaag wel een cursus stukje staan over de decimaal punt op picbasic.nl
Misschien heb je daar wat aan.

http://www.picbasic.nl/frameload_nl.htm?http://www.picbasic.nl/beginne…

Op Proton Geeks niks over casting gevonden.

Floats kan je goed vermijden btw.

Moest C zoiets niet hebben, zou ik dit doen:


unsigned char cast(float x)
{
    unsigned char y = 0;

    while (x > 1.0) {
	y++;
	x -= 1.0;
    }
    return (y);
}

// ...
unsigned char a = cast(3.25);

Dat moet toch te vertalen zijn naar die rare picbasic?

er staat mij iets bij dat ik het ergens gelezen heb ik zal eens kijken voor je moment

Probleemloos ondanks het ontbreken van lokale variabelen.

Maar ik lees net in de manual dat FP's automagisch naar integer gecast wordt:


DIM Test as FLOAT
DIM Test2 as BYTE

Test=3.14
Test2=Test
' Test2=3
Print DEC Test2

Foutje van de TS of een bug?

Op 2 april 2007 22:38:25 schreef Henry S.:
Probleemloos ondanks het ontbreken van lokale variabelen.

Maar ik lees net in de manual dat FP's automagisch naar integer gecast wordt:


DIM Test as FLOAT
DIM Test2 as BYTE

Test=3.14
Test2=Test
' Test2=3
Print DEC Test2

Foutje van de TS of een bug?

Foutje van de programmeur dus: Float wordt idd prima gecast naar byte, maar ik had voor het afdrukken op de LCD het scherm niet op de juiste plaats schoongemaakt, zodat een deel van de vorige waarde bleef staan.

Ik vraag me overigens wel af hoe ik in mijn code het gebruik van floats kan vermijden. Ik wil de analoge spanning (0..5v) die ik met een 16F877 meet, omgezet hebben naar een byte met waarde 0..250. Nu doe ik dat zo (en het werkt goed nu):

CLS
PRINT AT 1, 1, "Spanning:"
PRINT AT 2, 1, "Als byte: "

Again:
Waarde = ADIN 0
Waarde = (waarde * 5) / 1023
DELAYMS 200
PRINT AT 1, 11," "
PRINT AT 1, 11, DEC2 Waarde, " V"
Index = Waarde * 50
PRINT AT 2, 11," "
PRINT AT 2, 11, DEC Index
GOTO Again

Waarde is hier een float, en Index een byte. Kun je ditzelfde doen zonder een float variabele?

Bedankt voor jullie reacties, en vrolijk Pasen !!!

Als dat een 10-bits ADC is, met een referentiespanning van 5V, komt 1023 overeen met 5000mV. Maar als je met een 16-bits integer werkt, kan je daar 50000 van maken. een ADC-waarde van 1 komt dan overeen met (50000 / 1023) = 48.875 = 49.
Al wat je dus moet doen, is je ADC-waarde vermenigvuldigen met 49 en vervolgens delen door 10 om de spanning in mV te bekomen. De afwijking bedraagt dan 0.25%. Geen floats vandoen...