Hoe kan ik negatieve waarden op 'n LCD weergeven? Ik heb hetvolgende programma om de temperatuur te meten met een NTC:
DEVICE 16F877a ;Gebruik een 16F877A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, HS_OSC,
xtal 20
;ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Variabele declareren
DIM Waarde AS FLOAT
DIM Index AS BYTE
DIM Temp AS WORD
CLEAR
; 76543210
TRISA = %00000001
ADCON1 = %10000000
DELAYMS 500 ;LCD stabilisering
CLS
PRINT AT 1, 1, "Spanning:"
PRINT AT 2, 1, "Temp :"
Again:
Waarde = ADIN 0
Waarde = (waarde * 5) / 1023
DELAYMS 200
PRINT AT 1, 11," "
PRINT AT 1, 11, DEC2 Waarde, " V"
PRINT AT 2, 11," "
Index = (Waarde * 50) - 20
Temp = LOOKUP Index,_
[111,110,108,106,105,103,102,101, 99, 98, 97, 96, 95, 94, 93, 92,_
91, 90, 89, 88, 87, 86, 85, 85, 84, 83, 82, 81, 81, 80, 79, 79,_
78, 77, 77, 76, 75, 75, 74, 74, 73, 72, 72, 71, 71, 70, 70, 69,_
69, 68, 68, 67, 67, 66, 66, 65, 65, 64, 64, 63, 63, 62, 62, 61,_
61, 60, 60, 60, 59, 59, 58, 58, 58, 57, 57, 56, 56, 55, 55, 55,_
54, 54, 53, 53, 53, 52, 52, 52, 51, 51, 50, 50, 50, 49, 49, 49,_
48, 48, 48, 47, 47, 46, 46, 46, 45, 45, 45, 44, 44, 44, 43, 43,_
43, 42, 42, 41, 41, 41, 40, 40, 40, 39, 39, 39, 38, 38, 38, 37,_
37, 37, 36, 36, 36, 35, 35, 35, 34, 34, 33, 33, 33, 32, 32, 32,_
31, 31, 31, 30, 30, 30, 29, 29, 28, 28, 28, 27, 27, 27, 26, 26,_
25, 25, 25, 24, 24, 23, 23, 23, 22, 22, 21, 21, 21, 20, 20, 19,_
19, 18, 18, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12,_
11, 11, 10, 9, 9, 8, 8, 7]
Temp = Temp - 20
if Temp < 0 THEN
PRINT AT 2, 11, DEC Temp,%11011111,"C (Het vriest!!)"
ELSE
PRINT AT 2, 11, DEC Temp,%11011111,"C "
ENDIF
GOTO Again
END
De waarde van Temp wordt wel negatief, want de tekst "Het vriest!!" komt keurig op het scherm. Op de LCD wordt de waarde echter als een "unsigned word" afgedrukt: -1 wordt afgedrukt als 65535, -2 als 65534 etc. Is er een truc om de waarde als -1 en -2 af te drukken?
Het blijft natuurlijk basic... Zucht... Kun je als het gedal <0 is niet zelf een - printen en dan de modulus van je getal printen? Het is natuurlijk de achterdeur uit, maar ja... je moet wat...
Je zou de volgende 'truc' uit kunnen halen.
TEMP = TEMP + 100;
/*of +1000, net waar de verwachte waardes liggen binnen je systeem.*/
wat je nu hebt is dat 0 graden gecodeerd is als 100dec, en -100 graden ziet eruit als 0dec.
dan het volgende statement:
if (TEMP >= 100)
{
print "-";
}
print TEMP;
code voorbeeldje is pseudocode, ik spreek geen basic.
Dat gaat niet werken. Omdat TEMP een signed word is krijg je
101
-100 (<-- 0 graden)
-99
-98
...
-1
-0
-65535
-65534
Gewoon een s voor die dec neerzetten is dus de meest simpele oplossing.
Op 11 april 2007 21:17:50 schreef xantus:
Dat gaat niet werken. Omdat TEMP een signed word is krijg je101
-100 (<-- 0 graden)
-99
-98
...
-1
-0
-65535
-65534Gewoon een s voor die dec neerzetten is dus de meest simpele oplossing.
Werkt perfect. Bedankt voor de tip !!
Jeroen Boere
IF you can't convince them, then confuse them!
zoals in het andere topic dat je opende:
probeer eens een dword
dat is een 32 bit signed var in picbasic...
Op 11 april 2007 23:31:02 schreef Jeroen Boere:
zoals in het andere topic dat je opende:probeer eens een dword
dat is een 32 bit signed var in picbasic...
Bedankt, ik ga dat eens proberen. Ik blijf het vreemd vinden dat er geen 1 of 2 byte types zijn hiervoor. Ook vreemd dat WORD unsigned is, en DWORD signed...
Op 11 april 2007 21:17:50 schreef xantus:
Dat gaat niet werken. Omdat TEMP een signed word is krijg je...
DIM Temp AS WORD
Ik ken picbasic niet, maar staat WORD niet voor een unsigned 16 bit getal? Neem in dat geval gewoon een ander variabele type als integer oid.
Op 12 april 2007 13:01:54 schreef jojo:
[...]
DIM Temp AS WORDIk ken picbasic niet, maar staat WORD niet voor een unsigned 16 bit getal? Neem in dat geval gewoon een ander variabele type als integer oid.
integer oid kent picbasic niet. Ook de toevoeging signed en unsigned niet....
Lees de manual even door.., vanaf blz48.
Signed: FLOAT, DWORD
Unsigned: WORD, BYTE, BIT
Alleen FLOAT is geen integer.
Ik blijf problemen houden. Deze code:
if TEMP >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ELSE IF Temp >= 0 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"B"
Else IF Temp > -10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"C"
ELSE
PRINT AT 2,11," ",SDEC Temp,%11011111,"D"
ENDIF
waarin Temp een DWORD is, komt niet in de laatste else tak (ik druk dan een D af achter de waarde). Als de waarde -12 is, wordt hij afgedrukt met C erachter.
Op 17 april 2007 19:48:08 schreef Henry S.:
Je IF THEN ELSE structuur is niet logisch, wat is de bedoeling?
De bedoeling van de if-then-else code is om de afgedrukte waarde rechts uit te lijnen. Het aantal spaties dat ik in de code heb staan wordt hier echter niet goed afgedrukt, dus lijkt het of alle takken hetzelfde doen. In de werkelijke code worden er in de 'A' tak 3 spaties afgedrukt, in de 'B' tak 2, in de 'C' tak ook 2, en in de 'D' tak 1 spatie.
Wat er nu gebeurt is dat de waarden kleiner dan -10 afgedrukt worden door de 'C' tak, en er wordt dus 1 spatie teveel afgedrukt.
Op 17 april 2007 23:00:59 schreef Henry S.:
Andere IF THEN ELSE maken, deze klopt niet, ga maar na. Je moet met grenzen werken.
Sorry, maar ik zie niet wat ik fout doe:
Als Temp >= 10 doe "A",
anders als Temp >= 0 (dus 0..9) doe "B",
anders als Temp > -10 (dus -9..-1) doe "C",
anders (dus Temp <= -10) doe "D".
Dus ik zou verwachten dat "D" wordt uitgevoerd als Temp bijv. -12 is.
Wat is er fout aan mijn code, cq redenatie ?
IF Temp >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ENDIF
IF Temp >-10 AND Temp <10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111
IF Temp >=0 THEN
PRINT "B"
ELSE
PRINT "C"
ENDIF
ENDIF
IF Temp <=-10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"D"
ENDIF
Dit is een optie, het kan nog efficienter maar dat bespaar ik je. De structuur dmv code-tags duidelijk gemaakt.
Ok, bedankt voor je reactie Henry. Je suggestie werkt, maar wat je doet is nu drie keer op een gebied testen. In de tweede test bekijk je of Temp kleiner is dan 10, terwijl je dat al kon weten uit de eerste IF (als die niet waar is, dan moet Temp dus kleiner zijn dan 10. Daarom gebruikte ik de ELSE. Waarom werkt dit niet in PicBasic? Zover ik weet werkt deze constructie in talen zoals "C" wel.
Het 'AND Temp <10' stukje is idd dubbel testen, mag weg, maar dan moet je extra ELSE's gebruiken.
IF Temp >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ELSE
IF Temp >-10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111
IF Temp >=0 THEN
PRINT "B"
ELSE
PRINT "C"
ENDIF
ENDIF
ENDIF
IF Temp <=-10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"D"
ENDIF
Welke is nu in een oogopslag duidelijker?
Dit is basic testen binnen grenzen wat heel overzichtelijk blijft.
Ok, ik zie wat je bedoelt. Ik heb nu m'n eigen code wat aangepast, en nu werkt het naar wens (zat ook nog een foutje in met aantal spaties):
IF Temp >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ELSE IF Temp >= 0 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"B"
ELSE IF Temp > -10 AND Temp < 0 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"C"
ELSE IF Temp <= -10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"D"
ENDIF
Wat ik echter nog niet snap is dat de test Temp < 0 in de 2e ELSE tak nodig is. Als ik die weglaat wordt deze tak uitgevoerd als Temp < -10. Met deze test erbij wordt keurig code D uitgevoerd als Temp < -10. Mijns inziens is de test Temp < 0 overbodig omdat voor waarden > 0 de code A of B zou zijn uitgevoerd.
Ja, in A of B en C!
Pas op, ELSE IF is geen ELSEIF, manual blz. 240
ELSE
IF bla=TRUE THEN
moo=1
ELSE
moo=2
ENDIF
ENDIF
of
ELSEIF bla=TRUE THEN
moo=1
ELSE
moo=2
ENDIF
Proton+ is nogal strikt.
Behalve met eenregel sets:
IF x=10 THEN moo=0: ELSEIF x=20 THEN moo=1:ELSE:moo=3
Begint er al wat te koken, hier wel, ik doe dit droogzwemmend 
Begint er al wat te koken, hier wel, ik doe dit droogzwemmend
De mist begint op te trekken. Bedankt voor je eindeloze geduld met deze PicBasic beginner....
Ik heb jaren met verschillende BASIC's gestoeid, vanaf de C64, beetje GW en veel Amiga BLITZ, tot zo'n 7-8 jaar geleden. En nu een half jaartje PROTON+ met lange onderbrekingen.
Dus ik spiek ook regelmatig, maar misschien interpreteer ik het wat gemakkelijker.
Weer 'n stukje manual gelezen. Ik moet dus ELSEIF gebruiken. Ik heb het nu aan het werk, met een minimum aan testen, maar moest daarvoor wel de laatste test omdraaien, en heb geen flauw idee waarom. Schiet mij maar lek.
Dus deze code werkt niet (komt niet in tak D voor bv -12):
IF TEMP >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ELSEIF Temp >= 0 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"B"
ELSEIF Temp > -10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"C"
ELSE
PRINT AT 2,11," ",SDEC Temp,%11011111,"D"
ENDIF
en deze code werkt wel (zou m.i. hetzelfde moeten werken):
IF TEMP >= 10 THEN
PRINT AT 2,11," ", SDEC Temp,%11011111,"A"
ELSEIF Temp >= 0 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"B"
ELSEIF Temp <= -10 THEN
PRINT AT 2,11," ",SDEC Temp,%11011111,"D"
ELSE
PRINT AT 2,11," ",SDEC Temp,%11011111,"C"
ENDIF
Eerst maar eens even slapen lijkt me....
Ben weer wakker, maar nog geen idee waarom 't eerste stuk code anders werkt dan het tweede. Iemand anders misschien ?