Hoi,
in JAL heb ik een klein programmaatje geschreven dat twee karakters ontvangt via de RS232 poort en die opgetelt weer verzend naar de computer. Dit werkt op zich prima.
dit is de code:
-- tested by Surducan Vasile
-- date: 10 may 2001
-- compiler: Jal 04.35
include 16f84_4 -- procesor fuse description
include jpic -- general processor resources definition
include max232p -- pin configuration for RS232 and LCD
include jseriala -- Axel's serial routine, 19200,8,n,1
var byte een, twee, samen
forever loop
asynch_receive
een = lastreceived
asynch_receive
twee = lastreceived
samen = (een + twee)
asynch_send (samen)
end loop
Nu mijn vraag:
Het cijfer 4 wordt opgeslagen als ASCII byte. Vervolgens tik je 5 in, deze wordt ook opgeslagen als ASCII byte. Als je deze nu optelt zou je als uitkomst 9 verwachten. Helaas....hij rekent in ASCII dus er wordt een overeenkomstig ASCII teken verstuurd.
Er wordt dus gerekend met ASCII bytes. Wat je retour krijgt is dus ook weer een ASCII teken.
Nu wil ik het volgende kunnen:
Een getal (bijv: 56) kunnen intikken en deze met bijv. 12 optellen. Die uitkomst moet dan als dec/hex/bin worden opgeslagen in het register.
Wat er nu dus gebeurd is dat er met ASCII tekens gerekend wordt terwijl ik gewoon met decimale tekens wil rekenen.
Hoe doe ik dit?
Je kunt:
- Je input fixed length maken, bijv. 2 character. 2 wordt dan 02 en 15 gewoon 15
- Met een terminator werken
De eerste optie is het eenvoudigst te verwerken:
- Definieer 4 bytes voor input
- Haal ze op
- Converteer (een 0 heeft als ASCII code 48)
- Bereken
- Stuur terug
Nadeel is wel dat je geen edit mogenlijkheden hebt, en dat je geen startpositie kunt definieren (je hebt altijd 4 bytes, loop je ooit 1 byte out-of-sync, komt dat ook niet meer goed).
Verder kun je er natuurlijk ook 'bagger' instoppen (zoals letters, zou je af moeten vangen in je code), die dan (als je ze niet af vangt) voor leuke resultaten kunnen zorgen (ben zelf nooit zo'n voorstander van SISO functies)
Voordeel is dat je vawege 2 digits invoer ook nooit boven de 198 kunt komen, en het dus altijd in een byte past.
Met een terminator (bijv. CR) wordt het nog wat ingewikkelder, je blijft dan binnen halen tot je je term. character tegen komt. Er worden dus meer eisen gesteld aan je invoer routine, moet ook als er bagger in komt geen rare dingen gaan doen.
Leuk he? Fatsoenlijke invoerroutine schrijven 
Ok, klinkt goed uitvoerbaar....alleen hoe het converteren werkt snap ik niet. Is hier een commando voor in JAL of moet ik de nummerieke ASCII tekens allemaal invoeren in een soort omreken tabel? Zo wordt het wel erg omslachtig en kan ik beter in Delphi o.i.d. een PC progje schrijven dat alleen de berekende Bytes naar de compoort stuurt.
Het is inderdaad erg leuk om zo'n invoerroutine schrijven 
Joszs
Eindelijk mijn site doet het http://home.concepts.nl/~pc106181/Jos/Index.html
De cijvers in ACSII staan allamaal achter elkaar dus als je er een bepaalt getal van af trekt kom je op de waarde die je moet hebben
Grmbl...
JAL is al zo high-level als de pest... Doe het eens in assembly
Maar goed... Zal het generatieverschil wel zijn...
Afijn, pak een ASCII tabel, en zie... Als je van de ASCII code 48 (decimaal) af trekt, heb je de binaire waarde van de cijfers.
Je snapt natuurlijk dat als je er wat anders in cijfers in stopt en deze methode toepast, je mogenlijk onbedoelde binaire waarden krijgt, waardoor mogenlijk ergens een overflow ontstaat (geen idee hoe JAL daarmee omgaat...)