Op 15 juli 2011 11:11:06 schreef PbSn:
Afdrukken van een der drie tijdcounters bv hh in ACC:
code:
mov B,#10
div AB
add a,#'0'
acall write_uart
mov a,B
add a,#'0'
acall write_uart
je bent KNETTERGEK . waarom haal je daar nou al dat rekenwerk bij ?
en een CALL ? komaan zeg.... inline !
zenduart is 2 instructies... karakter in scon gooien en wachten op TX1 ...
je verspeelt meer tijd met call en return dan dat het waard is.
en die call en ret vreten 3 bytes rom + de nodige cpu cycli.
je moet de dptr immers laden en trug plaatsen. ( we gaan er dan nog niet vanuit dat je de context saved. dan verspil je nog meer tijd , en code en rom space en stackspace. )
ik tel niet in het hoofdprogramma. de teller logica zit in de inthandler. die updated de 6 bytes en zet een vlag.
in de main thread test ik vlaggen en dispatch ik daar de zendroutines.
ik heb al eens ganse epistels gepost over hoe je threaded low level programmeert.
kwestie van een pak sequences te maken. die zijn netjes allemaal deterministisch in lengte.
interrupthandlers doen het hoogstnodige en de atomaire operaties. eenmaal klaar zetten ze een vlag.
het hoofdprogramma is een while(1) die gewoon vlaggen checkt en de sequences dispatcht.
ik gebruik meestal een van de hardware counters om een timed interrupt te maken. die levert dan een heartbeat af. daar haak je dan software tellers op in. als die aflopen . vlag zetten. de dispatcher handelt de rest wel af.
je kan zo mooi sequences maken om iets te doen. eentje doet poort output. eentje input. eenje het lcd , eentje doet het menu eentje doet dit en eentje doet dat.
als de input sequence iets detecteert ( key_hit) dan dispatcht ie de processor daar voor. enzovoort.
er is nog een ander element: Je kan gebruik maken van een watchdog.
in princiepe moet je dispatcher om de zoveel tijd doorlopen worden ( sequences zijn altijd non-blocking. )
als er toch ene vastloopt dan gaat die watchdog gegarandeerd komen bijten.
ik was gisteren ook zoiet aant debuggen. bleek dat die de 'codeschijters' geen benul hebben hoe ze met een watchdog moeten omgaan. ze waren vanuit 3 verschillende threads die watchdog aant clearen.. zo werkt dat natuurlijk niet he..
eentje had commentaar. 'ik haat watchdogs. ik zet ze meestal af [ERM]kreun[/ERM]'
Op 15 juli 2011 11:17:31 schreef Uranium:
Ik zou de code van FE nog aanpassen als volgt.
Ipv bv t_minuten te laten beginnen op 0 en tot 5 te laten gaan laten beginnen bij '0' (48) en tot '5' (53)
ssst. die hield ik achter de hand voor als er iemand toch per se wou bewijzen dat hij compactere code kon schrijven. met die truuk kon ik nog een 30 tal instructies van mijn piepklijn programmatje afschaven.
Bravo ! dikke kus van de juffrouw en een bank vooruit.
inderdaad. voor die processor maakt het geen fluit uit of hij nu 0 tot 9 moet doen of '0' tot '9'. ascii karakters zijn ook binaire waardes voor een cpu.
je kan dus direct in ascii tellen. ben je gelijk van al dat gemov en add vanaf.
je code blijft identiek. alleen initialiseer je de variabelen niet op nul maar op 48 ( ascii waarde van '0' is 48 decimaal )
ziet er dan zo uit :
code:
[init]
eseconden=48
tseconden=48
blaaa
port1 = 1.
if tick
eseconden = eseconden +1
if eseconden = 57 then
eseconden = 48
tseconden = tseconden +1
if tseconden = 54 then
tseconden = 48
eminuten = eminuten +1
.... blablabla
nu gaan we zenden
scon = turen
wacht op txclear
scon = euren
wacht op txclear
scon = ':'
blaaaa
scon = 10 ' carriage return . we overschrijven huidige lijn
wacht op txclear vlag
if (tminuten and 1) ' test even of oneven van eenheden minuten
port1 = rol(port1)
else
port1 = ror (port1)
end if
tis wreed moeilijk he ?
@pbsn : timer1 in 16 bit of 13 bit mode vlammen. kijken welk kristal je hebt en daar een downcounter met automatic reload programmeren.
11.520 is een mooi getal. je kan daar zonder problemen 200 us uit halen. desnoods met de prescaler spelen.
als je per se met 8 bit moet dan doe je dat maar je plaatst een regel commentaar dat het niet accuraat is en je geeft het alternatief er meteen bij. tis 2 minuten werk.
kwestie van even in datasheet van intel te kijken waar je allemaal kan mee spelen. En als je echt een luie reet wilt zijn : ga bij silicon labs hun IDE halen. die is gratis. er zit een timer wizard in, en een c compiler en een assembler.
je pletst er je kristal requentie in en je tikt de gewenste waarde. de assembly rolt er zo uit.
en als je je code wilt simuleren : ik geloof dat oshonsoft een gratis 8051 emulator heeft. anders ga je maar naar 8051.com. daar staan bakken tools en voorbeelden voor die core.
8051 is de meest gebruikte core ter wereld. Er zijn meest fabrikanten die het ding maken en meest varianten van. Het is ook een van de oudste cores.
Dat ding is gemaakt voor deep embedded spul. De architecten van dat ding wisten heel goed waar ze mee bezig waren. er zijn zelfs registerbanken zodat je context swap compleet kan vermijden.
als we natuurlijk Crap++ gewend zijn van het vliegend schijt type...
@TS
Je aanpak is totaal verkeerd. ik zie daar overal wachtlussen. dat is dus not done.
lees mijn posts of threaded programmeren. Twas iets met ledjes die moesten knipperen en branden afhankelijk van druktoetsen.
je praat over variableen definieren. er is niks te definieren in assembly. je pakt gewoon een vrij ram plaats en vooruit met de geit.
doe me een lol.
gooi je code daar weg en begin met een schone lei.
alloceer 6 bytes uit en initialiseer ze op 48(decimaal)
schrijf je baudrate generator code ( ik zie in jouw code veeeeel te veel instructies daarvoor. het kan met 3 of 4. )
laad poort1 met het getal 1 zo hebben we al een ledje wat brandt
vlooi nu je 200us code uit.
schrijf een interrupt handler en maak daar die teller ladder.
op het end van die ladder zet je een boolean op '1'.
je hoofdprogramma is een eindeloze lus met daarin een if-then
code:
if 'tick' ( de eerder genoemde boolean )
tick = 0
scon = digit
wacht op TI
scon = volgend digit
blabla
if minuten and 1 ror(poort)
else rol (poort)
post wanneer je een stukje hebt. We gaan je wel helpen de boel te optimaliseren.
die ganse code is geen bladzijde assembly.
[Bericht gewijzigd door
Henry S.
op vrijdag 15 juli 2011 20:58:31
(46%)