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...

maar de manual lezen is ook een kunst. je moet sdec gebruike ipv dec voor signed values.

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 je

101
-100 (<-- 0 graden)
-99
-98
...
-1
-0
-65535
-65534

Gewoon een s voor die dec neerzetten is dus de meest simpele oplossing.

Werkt perfect. Bedankt voor de tip !!

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 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.

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.

Je IF THEN ELSE structuur is niet logisch, wat is de bedoeling?

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.

Andere IF THEN ELSE maken, deze klopt niet, ga maar na. Je moet met grenzen werken.

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 :P

Begint er al wat te koken, hier wel, ik doe dit droogzwemmend :P

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 ?