https://wiki.enterpriseforever.com/index.php?title=Protokoll&feed=atom&action=historyProtokoll - Revision history2024-03-28T08:31:45ZRevision history for this page on the wikiMediaWiki 1.27.1https://wiki.enterpriseforever.com/index.php?title=Protokoll&diff=395&oldid=prevSzipucsu at 09:54, 3 May 20102010-05-03T09:54:05Z<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;' lang='en'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 09:54, 3 May 2010</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l150" >Line 150:</td>
<td colspan="2" class="diff-lineno">Line 150:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>-----------------------------------------------------------------</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>-----------------------------------------------------------------</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ha valaki jobban érti a forráskódot  :wink: :</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ha valaki jobban érti a forráskódot  :wink: :</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>http://www.enterpriseforever.<del class="diffchange diffchange-inline">org</del>/index.php?action=dlattach;topic=187.0;attach=402</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>http://www.enterpriseforever.<ins class="diffchange diffchange-inline">com</ins>/index.php?action=dlattach;topic=187.0;attach=402</div></td></tr>
</table>Szipucsuhttps://wiki.enterpriseforever.com/index.php?title=Protokoll&diff=34&oldid=prevMrprise: New page: == Tasztillesztő == === Protokol === Az egész protokol az EP taszt --nem használt-- 10..15 címét használja. A bootloader addig (és csak addig) aktív, amíg ilyen címeket kap. A...2007-03-14T18:08:13Z<p>New page: == Tasztillesztő == === Protokol === Az egész protokol az EP taszt --nem használt-- 10..15 címét használja. A bootloader addig (és csak addig) aktív, amíg ilyen címeket kap. A...</p>
<p><b>New page</b></p><div>== Tasztillesztő ==<br />
<br />
=== Protokol ===<br />
<br />
Az egész protokol az EP taszt --nem használt-- 10..15 címét használja.<br />
<br />
A bootloader addig (és csak addig) aktív, amíg ilyen címeket kap. Az elsõ "igazi" EP-taszt címre (0..9) a mûködése befejezõdik.<br />
<br />
Van tehát 6-féle kódunk, ezek egyenként:<br />
<br />
[font=Courier New]0A: EADDR (cím beállítása)<br />
0B: EBIT1 (1-es bit küldése)<br />
0C: EBIT0 (0-s bit küldése<br />
0D: EDATA (RAM adat cseréje)<br />
0E: EFLSH (flash, vagy EEPROM írása)<br />
0F: ELAST (utolsó kód?)[/font]<br />
<br />
A válasz-adatokat a normál taszt-emu táblába teszem. Ami ezután az U27 bemenetén olvasható, [b]a következõ alkalommal[/b] .<br />
Miért is? Mert a Z80-nal a kommunikáció OUT-IN párossal történik. Az OUT (B5),0A..0F hatására megy valamelyik programrészre, ami beírja a taszt-emu táblát, ugyanúgy, mint normál mûködés esetén. A taszt-emu táblából viszont IT rutin-nal kérdezhetõ le az adat, vagyis a következõ OUT hatására teszi ki az adatot.<br />
<br />
[quote]<br />
Miért nem azonnal?<br />
Egyrészt, mert nincs "azonnal". Idõt kéne definiálni rá, hogy leghamarabb mikor kerülne ki az adat. Ami igencsak változó, a legtöbb esetben gyorsabban, mint ahogy a Z80 új utasítást hajt végre ;) , de pl. az EEPROM írás 30 msec körüli.<br />
Másrészt, mert akkor csak egyféle adatot tudnék küldeni, mindig. Így viszont az emu-ramból egyszerre többféle is kiolvasható.<br />
[/quote]<br />
<br />
--------------<br />
<br />
Minden egyes címre elõször azonnal 00-t tesz az emuram[0F]-re (tehát a Z80-nal OUT (B5),0F / IN (B5)-re FF olvasható), majd amikor elvégezte a feladatot, akkor egy kódot (rendszerint u.azt a címet) teszi ki.<br />
<br />
Az adatok cseréje tehát az egyik irányban (EP->uC) bitenként, míg a másik irányba (uC->EP) byte-onként történik.<br />
A bootloader 1 shift regisztert, pár egyéb regisztert és egy 64 byte-os RAM területet használ ehhez. Valamint természetesen a normál emu-RAM területet.<br />
<br />
[font=Courier New]<br />
progdataw: ... 16 bites (shift) adatregister<br />
progaddrw: ... 16 bites címregiszter<br />
progcnt: ..... 8 bites adatszámláló (valójában biteket is számol)<br />
bufptr: ...... pointer a belsõ pufferre<br />
tab_ram: ..... ez maga a puffer is egyben<br />
lastcode: .... 8 bites adat, amivel lekérdezhetõ, mi is történt <br />
[/font]<br />
Van még egy timer is (kb. 120 msec), amit az elsõ belépéskor indítok, és minden EFLSH újraindítja.<br />
<br />
-------------------------------------------------------------<br />
C (szerû) szintakszist használok itt, elnézést, ha valakinek nem egyértelmû<br />
<br />
<br />
0A..0F:<br />
emuram[0F] = 0<br />
lastcode = funkció (0A..0F)<br />
call func<br />
<br />
<br />
A funkciók<br />
<br />
--------------------<br />
[font=Courier New]EBIT1 (0B):<br />
progdataw = progdataw * 2 + 1<br />
emu[0B] = EEPROM[progaddr]<br />
emu[0C] = FLASH[progaddr++]<br />
progcnt = progcnt+1<br />
<br />
--------------------<br />
EBIT0 (0C):<br />
progdataw = progdataw * 2 + 0<br />
emu[0C] = FLASH[progaddr++]<br />
progcnt = progcnt+1<br />
<br />
--------------------<br />
EADDR (0A):<br />
progaddrw = progdataw<br />
bufptr = tab_ram<br />
progcnt = 0<br />
<br />
--------------------<br />
EDATA (0D):<br />
progcnt = 0 : emu[0D] = *bufptr++<br />
....... !=0 : bufptr túlcsordult ? lastcode |= D0<br />
............. egyébként:<br />
................... *bufptr++ = LOW(progdataw)<br />
................... ++progcnt<br />
<br />
<br />
--------------------<br />
EFLSH (0E):<br />
timer lejárt ? .......... lastcode |= 0x10<br />
progcnt != 32 ? ..........lastcode |= 0x20<br />
progaddr -= progcnt<br />
progaddr != progdata ? .. lastcode |= 0x40<br />
progaddr hibás ? ........ lastcode |= 0x40<br />
bufptr != tabram ? ...... lastcode |= 0x80<br />
<br />
lastcode < 0x10 :<br />
......progaddr < 0x200 : EEPROM írása tabram-ból, 32 byte<br />
.......................: FLASH ----------- " ------------<br />
......timer újrindítása<br />
<br />
<br />
<br />
A címnek 0x800-nál kisebbnek kell lenni, és az alsó 5 bit 0 kell legyen. Egyébként hibás.<br />
A buftr = tabram EADDR esetén keletkezik, EDATA viszont elrontja. Írás tehát csak akkor lehetséges, ha a sorrend EADDR, aztán (32-szer) EBITx volt.<br />
<br />
------------------<br />
ELAST (0F):<br />
emuram[0F] <- lastcode<br />
[/font]<br />
---------------------------------------------------<br />
<br />
<br />
A használat tehát a következõ:<br />
<br />
--OLVASÁS--<br />
EBITx funkciókkal 16 bitet át kell vinni.<br />
EADDR átteszi ezt címmé.<br />
Ezután<br />
<br />
az EEPROM tartalmát folyamatos EBIT1 küldözgetésével lehet olvasni,<br />
...vagy...<br />
a FLASH tartalmát folyamatos EBIT0 küldözgetésével lehet olvasni,<br />
...vagy...<br />
tabRAM tartalmát folyamatos EDATA adja vissza (itt a cím értéke nem számít, de KELL az EADDR! Az EBITx viszont kihagyható)<br />
<br />
<br />
--ÍRÁS-- eloször mindig a tabRAM-ba<br />
1. EADDR<br />
2. (8-szor) EBITx, majd EDATA, ez egyetlen byte-ot ír<br />
3. (2) ismételve max. 64-szer, de FLASH és EEPROM írása csak az elsõ 32 byte-ból történik<br />
Ha csak a tabRAM-ot akarjuk írni, akkor ennyi.<br />
<br />
4. FLASH, ill. EEPROM irása: <br />
a) címet be kell állítani: (16-szor) EBITx, majd EADDR<br />
b) még egyszer ki kell adni a címet, pontosan 32 db EBITx hívással<br />
c) EFLSH<br />
<br />
[quote]<br />
Miért pont 32 byte? Mert ennek a uC-nek ekkora a belsõ lapmérete, egyszerre ennyi adatot ír a flash-be. Ez EEPROM-nál nem igaz, de egyrészt így jóval rövidebb a kód, másrészt újabb restrikció a protokolban, ami itt jól jön.<br />
[/quote]<br />
<br />
ELAST az egész folyamat közben bármikor kiadható, az itt olvasott értékkel ellenõrizhetõ, hogy milyen hívás történt utoljára, és sikeres volt-e.<br />
<br />
----------------------------------------------------------<br />
Az emuram-ba írt érték valójában nem az, amit az Z80 "lát", mert az EP-ben használt 373-as IC (az U27) kicsit zagyván használja a lábait. Mindenki 573-ast használt helyette, amikor már tehette (és akkor nem kéne annyi átkötés sem a uC beépítésekor).<br />
; in: 76543210<br />
; out: 65210347<br />
<br />
A 7-es bitbõl tehát 6-os bitet, a 6-os bitbõl 5-ös bitet stb. kell "gyártani", a Z80 kódban.<br />
<br />
A normál mûködést ez azért nem zavarja, mert már eleve "visszakavart" értékeket írok ki, a tasztdefiníciós értékek így készültek (epkeys.h)<br />
<br />
-----------------------------------------------------------------<br />
Ha valaki jobban érti a forráskódot :wink: :<br />
http://www.enterpriseforever.org/index.php?action=dlattach;topic=187.0;attach=402</div>Mrprise