ik zit met een stukje programmeercode waar ik niet uitkomt in .Jal
Het gaat om Lcd_high_low_line_pos(hbyte,lbyte,regel,positie) uit het boek van Bert van Dam 50 microcontroller projecten.
Ik probeer erachter te komen hoe hbyte en lbyte werkt bij deze regel
Als ik een teller wil maken die moet doortellen naar 65535 dan teld hij netjes tot 255 en dan gaat hij met stappen van volgens mij van 8 bit verder tellen
Bv. 256 512 1024 en niet 255 256 257 enz tot 65535.
Hoe moet ik dit oplossen en wat moet ik invullen bij hbyte en lbyte.
Code wat ik bv gebruik:
Include 16f877_bert
Include lcd_44780
Var word teller
Teller = Adc_read(2)
Lcd init
Fover loop
Lcd_high_low_line_pos(0,teller,0,3)
Delay_1ms(500)
End loopik hoop dat iemand mij een stukje op weg kan helpen.
Uiteindelijk wil ik bv een pt100 de weerstandwaarde weergeven op display
[Bericht gewijzigd door Henry S. op (1%)]
Vovpvi
De jacht is mooier dan de vangst....
Dubbeltopics worden hier niet op prijs gesteld.
http://www.circuitsonline.net/forum/view/102711
Verder zitten hier weinig JAL experten (zover ik weet)
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Topics kunnen uiteraard nooit meer verwijderd worden. Anders kun je ze niet meer terugvinden he...
Ik weet niets van Jal, maar hbyte en lbyte klinkt als een functie waarmee je het hoge en lage byte van een 16 bits waarde kunt bepalen. Als je bv een teller hebt van 16 bits dan loopt het lbyte eerst van 0..255. Bij 1 stapje extra rolt het lbyte over van 255 naar 0 en tegelijkertijd verhoogt het hbyte met 1. Dat gebeurt telkens bij een roll-over van het lbyte.
Ik weet niet of dit helemaal relateerd met je vraag, maar misschien heb je er iets aan.
je helpt me wel op weg maar weet nog niet hoe ik het op de lcd goed moet krijgen en wat ik moet doen om hbyte en lbyte in te stellen
jovak
meten is weten, weten is meten, maar hoe kan je weten wat je allemaal moet meten en weten.
Verder zitten hier weinig JAL experten (zover ik weet)
De gene die JAL heeft ontwikkeld zit op dit forum, maar Er zijn nu al andere versies op internet te downloaden. 
Ik zie niet in jouw code dat je een tellertje optelt. Tevens laat de code zien d.m.v copy/paste.
De lcd opdracht laat je een getal van 0 tot 65535 printen op een bepaalde regel op een bepaalde positie van je LCD.
Als je dat wilt doen dan tel in je low variable van 0 tot 255, wil je er een bij optellen dan verhoog je je high variabele met 1 en zet je je low variabele weer op nul. Je hebt dan 256. Dan ga je je low variabele weer verhogen, 1,2,3..254 en als je weer bij 255 kom, verhoog je je high variabele weer met 1 en je lw variabele weer op nul. Je bent dan bij 512, en zo ga je verder.
Zoiets als dit,
HighVar = 0
LowVar = 0
Forever loop
Lcd_high_low_line_pos ( highVar, lowVar, 0, 5)
If lowVar < 255 then
LowVar = lowVar + 1
else
lowVar = 0
If highVar < 255 then
HighVar = highvar + 1
else
HighVar = 0
Endif
endif
End loop
Ik heb een ander boek gehad, maar volgens mij staan er toch voorbeelden in dit boek over het gebruik van deze lcd-bibliotheek
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
In de documentatie van Jal moet toch een beschrijving van hbyte en lbyte staan? Of is het geen instructie/functie maar een variabele die in het boek als voorbeeld wordt genomen. In jouw (TS) code staat helemaal niets met hbyte...
het is een var benaming in een functie decl.
en om je teller om te zetten naar je low en high variabele gebruik je 'at'
zoals
var myByte[2] at teller
de 'myByte' byte var bezit d.m.v verwijzing de desbetreffende deel van je 'word' i.d.g teller.
dus als je je 'adc in' wilt gebruiken om iets op je scherm te krijgen zal je zoiets als dit moeten doen.
EDIT: even wat betere benaming gegeven voor de vars
var word ADC_value -- was - var word teller
var byte ADCBytes[2] at ADC_value -- was - var byte myByte[2] at teller
ADC_HighByte = ADCBytes[1]
ADC_LowByte = ADCBytes[0]
Lcd init
Forever loop
ADC_value = Adc_read(2)
-- Lcd_high_low_line_pos ( ADBytes[1], ADBytes[0], 0, 5)
Lcd_high_low_line_pos ( ADC_HighByte, ADC_LowByte, 0, 5)
End loop
De volgorde in de array van High en Low byte hangt af of je MC little of big endian is. Effe google'n.
bedankt allemaal hier kan ik denk ik wel wat mee ik kan het nou op dit moment niet proberen maar het wordt mij steeds duidelijker ik ga deze info zeker proberen en laat het weten hoe het is gegaan
benleentje
Golden Member
Is er niet een LCD met word functie. Voor zover ik weet kan een een word in jal op 2 manieren bekijken
- Als 2 verschillende variabelen elk als 2 verschillende byte's met de high en low byte die samen een 16 bit getal vormen
- Als 1 enkele variabele als een word die een 16 bit getal vormt
JE zal denk ook wel functies hebben om 2 bytes om te zetten naar een word en andersom.
PS
Ik ben toevallig ook met dat boek bezig ben pas begonnen. Het is een goed boek met duidelijke uitleg.
[Bericht gewijzigd door benleentje op (12%)]
Ik heb de code van -Lord Anubis- deze code heb ik een klein beetje aangepast maar werkt zoals ik het bedoelde super
[b]include 18f4455
include lcd_44780
var word HighVar = 0
var word LowVar = 0
lcd_init
lcd_cursor = off
Forever loop
Lcd_high_low_line_pos ( highVar, lowVar, 0, 5)
If lowVar < 255 then
LowVar = lowVar + 1
else
lowVar = 0
If highVar < 255 then
HighVar = highvar + 1
else
HighVar = 0
End if
end if
delay_1ms(250)
End loop[/b]
bedankt allemaal voor jullie hulp.
[Bericht gewijzigd door Henry S. op (1%)]
Gebruik
Var byte highVar
i.p.v word.
Check even of je LCD_init weg mag blijven laten.
Misschien een volgende uitdaging, laat het resultaat rechts uitgelijnd zijn.
1
101
65000I.p.v
1
101
65000En laat nu eens je ADC ingelezen waarde op de lcd zichtbaar worden.
Een WORD zijn twee BYTES.
Dus je gebruikt hier 4 bytes, terwijl twee voldoende zijn. De chipjes hebben niet al te veel ruimte voor de code, en verkeerd gebruik van de data type grootte in een groot programma kan dus problemen opleveren.
De LCD functie gebruikt een HighBYTE en een LowBYTE. Bytes dus.
Buiten het feit dat het problemen kan opleveren in eventueel andere situaties is het ook niet de bedoeling van de maker van de Lib functie.
Als je een word gebruikt, zal de functie de onderste 8 bits gebruiken voor HighByte, en dit geld ook voor LowByte, Zou je WORD gebruiken met een waarde groter dan 255, b.v 256 en je zet deze in een functie die een byte verwacht dan krijg de functie de waarde 1 mee, i.p.v 256.
Ook b.v als je je code gaat gebruiken voor een andere type MC die een litleEndian is i.p.v bigEndian ( google ) krijg je problemen.
Gebruik een WORD waar het moet, dit geldt ook voor een BYTE, BIT of NIBBLE.
En iedere data type hier genoemd bestaan uit digits. 1bit is 1digit.
Beetje globaal genomen in dit wereldje
Bit: 1 digit
Nibble: 4 digits
Byte: 8 digits ( vaak 8bits genoemd )
Word: 16bit, 32bit, 64bit afhankelijk van je MC of processor.
Let op een int ( integer ) gebruikt in andere talen is niet per sé 8bits.
Daarom google even naar boven genoemde woorden, b.v "wiki word" of "wiki pic byte"
Later als je het onder de knie hebt kan je trucjes uitvoeren.
HTH