Welcome, Guest. Please login or register.


Author Topic: HID kezelés Arduino -val (Read 75046 times)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HW készítés Arduino-val
« Reply #300 on: 2014.October.19. 23:34:32 »
Hol lehet olyan infót megtalálni, hogy pld. az LDI utasítással csak 16 -nál nagyobb (indexű) regiszterbe lehet értéket tölteni ?

Mert a datasheet -től azt várnám hogy ilyen benne legyen ott, ahol az utasításkészlet van leírva.
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HW készítés Arduino-val
« Reply #301 on: 2014.October.20. 02:09:27 »
Na meglett a galiba ha minden igaz ... egyenlőre minden teljesen logikusnak és stabilnak tűnik ...

Az volt a gáz, hogy a bootloader bekapcsolva felejtette az USB megszakításait, és azok ott a háttérben operálgattak, mindenféle értelmetlenségeket okozva ...

De mostmár stabilan jön a megszak a PS/2 -től, billentyű nyomásra változnak a ledek, ahogy kell ... úgyhogy remélem felgyorsulnak már végre az események ...

Mondjuk az még lesz egy szép kis szöszölős dolog, mire az EP 17 vezetékét bekötöm a próbapanelre ... ma csak 4 dróttal kellett beforrasztani a PS/2 csatit, de azzal is elszöszöltem pár órát ... minden mütyűr, szétforrasztom, elolvad, elfolyik, leesik, eldől, megégetem az ujjam, stb ... :)

Pld. mikor beforrasztottam a PS/2 aljzatba a kábeleket, utána alig akart belemenni a billentyűzet csatlakozója ... előtte meg teljesen jó volt ... nyilván szétforrasztottam belül a lelkét szegénynek ... de hál istennek érintkezik mind a 4 csati, kimértem.

Na de először meg kell akkor írjam a billentyűk beolvasását, mikor majd már be tudom állítani, hogy 3 általam hardkódolt scancode -ra gyulladjon ki a 3 led a próbapanelen, akkor jön majd csak az EP oldali drótozás kérdése ...
Z80 System

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #302 on: 2014.October.20. 09:10:38 »
Pld. mikor beforrasztottam a PS/2 aljzatba a kábeleket, utána alig akart belemenni a billentyűzet csatlakozója ... előtte meg teljesen jó volt ... nyilván szétforrasztottam belül a lelkét szegénynek ... de hál istennek érintkezik mind a 4 csati, kimértem.

Az szokott lenni, hogy pl tulmelegitetted forrasztas kozben a cuccot, ezert a muanyag ize bize nemileg deformalodott kozben, es "elallitodtak" az erintkezok. Ez ellen megoldas lehet, ha vagy nem melegited agyon es gyorsan, profin :) forrasztas [ez az ami nekem se szokott osszejonni, kisse remegos kezem van sajna, bar csipesz stb segithet], illetve amit ilyenkor tenni szoktam az az a csunya megoldas, hogy beledugsz egy bele valo csatit a forrasztas idejere, igy nem tud "elallitodni" akkor sem, ha nemileg sikerul tulmelegitened. Bar nem tudom, sikerult-e erthetoen leirni mit akarok :)

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #303 on: 2014.October.20. 09:19:25 »
Hol lehet olyan infót megtalálni, hogy pld. az LDI utasítással csak 16 -nál nagyobb (indexű) regiszterbe lehet értéket tölteni ?

Hogy oszinte legyek, regen olvastam mar a hivatalos datasheet-et, amde pl ha ezt megnezed:

http://www.avr-asm-tutorial.net/avr_en/beginner/COMMANDS.html

Az LDI-nel az szerepel, hogy "LDI rh,c255", es alul a roviditesek listajaban ott is van, hogy az "Upper page register R16..R31". Amugy ezek a "furcsasagok" azert vannak, mert bar a CPU-nak kb mindegy lenne, szukos az elerheto utasitaskeszlet tartomany, igy neha persze valasztas ele allitja a tervezot, hogy bar az un register file a CPU-ban ISA szinten barmit tudna barmivel, egyszeruen nem lehet eleg utasitast definialni, amivel mindegyik kombinacio elerheto. Jo pelda erre az ARM, ahol ugye 32 bit egy utasitas, igy van minden hulyeseg, pl minden utasitas lehet felteteles automatice, vagy shift-el is kozben adatot, amig a fo funkciot vegrehajtja, stb stb. Azonban ugye ez kisse "pazarlo" az un kodsurruseg nem a legjobb amiatt, hogy igy 32 bit az alap kodszo meret. Ezert talaltak ki a fenti mellett a Thumb utasitaskeszletet, ahol mar nem elerheto minden amit az ARM tudna amugy, cserebe tomorebb a kod, kevesebb memoriat igenyel, stb. Nyilvan AVR eseten nincs valasztasi lehetoseged, az ARM csak pelda volt (btw, van ARM alapu MCU is, sot volt anno hir is, hogy DIP tokozassal is lehet kapni egy konkret tipust, ezek persze siman fejbe vernek egy AVR-t ami 8 bites, az arm meg 32 ... es mas dolgokrol nem is beszelve).

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #304 on: 2014.October.20. 09:23:20 »
Btw, ha mar EP-hez (ami ugye Z80-at hasznal) akar az ember MCU-t csatlakoztatni erdekes lehet (mar ha csak erdekesseg es nem gyakorlati szempontbol is), hogy elvileg Zilog is gyart/gyartott MCU-kat, pl:

http://en.wikipedia.org/wiki/Zilog_Z8

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HW készítés Arduino-val
« Reply #305 on: 2014.October.20. 09:33:59 »
Hmmm ... hát ha kész vagyok ezzel a PS/2 dologgal,

akkor továbbra is kérdés marad a 10MHz -es (z80) működés (mert ez nem fog menni 10 MHz -es z80 -nal, ha igaz a 11 órajelciklus),

és továbbra is kérdés az USB működés is, ahol a háttérben más megszakítások is lehetnek, melyek valószínűleg nem engedik majd megszakítani magukat (én most majd engedem megszakítani a PS/2 megszakokat is) az én két szép szememért, hogy kiszolgálhassam az EP -t, az USB könyvtárakba belemászni pedig már nem szeretnék ...

Szóval mindkét probléma feloldásához kéne valami plussz funkció, ahol is ugye az mcu sebessége jelentéktelenné válik, mert valami plussz funkció megcsinálja az EP -nek a gyors választ.

Valami olyan dolog, ami 4 biten engedi magát címezni, és 16 darab 8 bites regiszteréből (tárjából) felel egy 8 bites értékkel a 4 bites címzésre, azonnal.
Nem mellesleg engedi magát az előzőtől függetlenül feltölteni aszinkron módon.

Hogy ez egy másik mcu család, vagy egy kiegészítő alkatrész lesz azt nem tudom, de a 10MHz z80 -hoz és a kényelmes, nem bitbabrálós USB -hez kelleni fog.
Z80 System

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14743
  • Country: hu
    • http://enterprise.iko.hu/
Re: HW készítés Arduino-val
« Reply #306 on: 2014.October.20. 09:39:35 »
Valami olyan dolog, ami 4 biten engedi magát címezni, és 16 darab 8 bites regiszteréből (tárjából) felel egy 8 bites értékkel a 4 bites címzésre, azonnal.
Nem mellesleg engedi magát az előzőtől függetlenül feltölteni aszinkron módon.
Lgb már beírta: dual port SRAM.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #307 on: 2014.October.20. 09:43:13 »
Lgb már beírta: dual port SRAM.

Ja, vagy a cross-switch cuccos, amit pont hasznaltak is ilyen celra pl C64-es PS/2 illesztonel is :) Valahol irtam mar a temaban. Masik lehetoseg: USB MCU-n belul stb bonyolit: interrupt stb azt is kezelni kell ... Ha megelegednel PS/2-vel, akkor annak protokollja egyszeru ahhoz, hogy magad rendezd, es bele lehet vhogy eroszakolni az idozitesbe, hiszen Tigrian-nak is sikerult valahogy, tehat nem a lehetetlenseg kategoria.

Apropo, Zozo, a Tigrian fele illesztodbol kibabralt AVR-rel sikerult vegulis az MSX cuccos? :) Tudod volt, hogy irtad, x10 gyorsabbnak tunik, en meg papoltam a fuse bitekrol stb, de nem remlik, hogy valaszoltal volna, vagy csak en nem figyeltem :(

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #308 on: 2014.October.20. 09:57:14 »
Es vegul meg egy lehetoseg: a Zozo altal is emlitett Propeller nevu MCU, ami tobb magos "csoda". Ebben viszont tenyleg konkretan nulla tapasztalatom van ... Az biztos, hogy ha egy mag elbirja idozitesben a "matrix emulalast", akkor neki eleg csak azt csinalnia neznie, es masik mag foglalkozhat tobbi dologgal. Viszont a Propeller pl nekem emlekeim szerint lasabbnak tunik mint az AVR, itt 4 orajel ciklus egy atlag utasitas, ha jol remlik, AVR-nel a legegyszerubbek csak 1. Viszont cserebe tobb core :) Masreszt, a core-ok kozotti kommunikacio es a "kozponti" RAM resz elerese lassab is vagy mi, foleg ha tobb mag probalja egyszerre, szoval nem vagyok benne teljesen biztos, hogy ez igy idozitesre hogy a fenebe jon ki aztan :( Mondjuk irnak vmi uj verziorol amiben lesz majd bika sok RAM, meg sokkal gyorsabb is lesz, utasitas/ciklis szinten, es orajel max szinten is ... Akkor mar tenyleg erdekelne engem is, akkor lassan mar _TALAN_ nick-et is lehet vele emulalni :D Bar ez utobbit imho tovabbra is FPGA-ban vagy hasonloban kene mint logikai halozatot implementalni (vegulis az eredeti Nick is az, max nem FPGA-nak hivjak amibe szintetizalva lett, ma talan ASIC-nak hivnak?).

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HW készítés Arduino-val
« Reply #309 on: 2014.October.20. 23:30:56 »
lgb, van neked valami tapasztalatod, hogy lehetne valami avr gcc flag -gel, vagy ilyesmivel lekorlátozni az avr gcc -t,

hogy a fordított kódban ne használjon N darab (pld. 3) regisztert ?

tehát azt szeretném, hogy a 16,26,27 regisztereket mondjuk ne használja ... hagyja meg a megszakoknak, amik meg assembly -ben lesznek ...
Z80 System

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #310 on: 2014.October.20. 23:35:48 »
Code: Text
  1.   in R26,PIND   ; portD pin status is read into R26
  2.   RJMP 0x3a
  3. ...
  4. ...
  5.   3a:   b6 3f           in      R3, SREG        ; save status register to R3 [on AVR status register is in the "I/O space")
  6.   3c:   fb a5           bst     R26, 5            ; T-bit is set from bit 5 of R26
  7.   3e:   f9 a3           bld     R26, 3            ; T bit is loaded to bit3 of R26
  8.   40:   70 af           andi    R26, 0x0f       ; R26 AND 0x0F
  9.   42:   2e 5a           mov     R5, R26        ; copy R26 into R5
  10.   44:   6d a0           ori     R26, 0xd0        ; R26 OR 0xD0
  11.   46:   90 1c           ld      R1, X              ; load memory byte at register X (which is R26-R27 register "pair") into R1
  12.   48:   ba 17           out     DDRB, R1       ; set port direction of portB from R1
  13.   4a:   94 23           inc     R2                 ; R2 = R2 + 1
  14.   4c:   24 11           eor     R1, R1           ; R1 EOR R1 (R1:=0)
  15.   4e:   be 3f           out     SREG, R3        ; restore status register from R3
  16.   50:   95 18           reti                         ; return from interrupt handler
  17.  

No, ez itt kerem egy AVR disassembler kimenete Tigrian task illesztojenek flash tartalmabol (ami ugye file-ban megvan csak a forrast sikerult elkeverni ...), altalam commentalva, remelem hirtelen nem szurtam el semmit, illetve az I/O port es register neveket atirtam numerikus ertek helyett (amit disasm kidobott) az adott ATtiny-nek megfelelo dolgokra. Ez maga az interrupt handler lenne, amit az INT1 aktivizal, mely utobbi a WR0 (low active) signalra van kotve. Azaz, ha valtozik, a B4 EP porton vmi, mert oda irtak, az alacsony lesz, gondolom AVR itt a lefuto elre reagalva megszakitast general. Valojaban az AVR flash elejen levo (boot loader ezt kicsit megkeveri, mert ATmega-n legalabbis akkor ket helyen is van, sajnos kevesbe emlekszem mar, remelem jot nezek hehe) interrupt tablaban kezdodik a jatek, ahol van sokfele interruptra RJMP (ugras) utasitas, a legelso amugy a reset, itt nincs feltuntetve.

Az elso erdekesseg, amit meg a hex dump-al is megaldott resz ele tettem maga az interrupt tabla ideillo resze. Itt jon az elso trukk, amit Tigrian alkalmazott. Ugyanis, egy utasitasnyi hely van egy interrupt-nak, utana jon a masik interrupt, tehat logikus, hogy onnan el kell ugrani, azaz normal esetben mindenhol RJMP all ebben a tablazatban. Viszont pont az INT1 helyen egy IN utasitas van. Ennek hatasa ugye az, hogy mivel utana mar masik interrupt belepesi pontja van, arra "fut ra" a dolog, ami nem gond, ha az az interrupt ugyse fordulhat elo. Megis miert csinalhatta igy? Gondolom azert, mert igy tudja a leheto leggyorsabban olvasni a B4-re kiadott erteket, amig a Z80 meg tartja a buszon, ha elotte RJMP-vel elugrik, az biza 2 AVR orajelciklus mielott meg vegrehajtodhatna az IN. Ha most Zozo intelmeit megfogadjuk, ez a hokusz-pokusz nem kellene, ha nem kozvetlenul az adatbuszrol venne le ugye, hanem a demultiplexer bemeneterol.

Valojaban amugy a fenti kod ugy mokodhet amit elkepzeltem. Van a foprogram, o foglalkozik a PS/2 kezelessel. Nem tul time critical, par MHz-en siman elkezel egy PS/2 szintu protokolt. Van valahol tarolva az AVR SRAM-jaban egy 10 byte-nyi teruleten az, ami megfelel 8*10 bitre vonatkozolag az "emulalt" billentyuzet allapotanak, a foprogram PS/2 kutyulasa utan ott "nyom meg" vagy "enged el" billentyuket, a megfelelo byte megfelelo bitjenek allitgatasaval. Az interrupt handler nyilvan a WR0 jel lefuto elere lep eletbe, es feladata az, hogy beolvassa, melyik row-t akarja scannelni az EP, es amilyen gyorsan lehet, ez alapjan a B porton kikuldje a fenti kis "taszt allapot tombunk" ezzel indexelt erteket.

A kulcs itt ugye az, amirol targyaltunk, hogy vmi 11 Z80 orajelciklus van, ha a leheto leggyorsabban EP OUT-ba tesz vmit B4-re majd azonnal olvassa is, igy ennyi ido alatt azt meg kell oldani AVR-en.

Mivel AVR-nek azert van par registere, ilyen esetben "felaldozhatunk" parat, amit az interrupt handler hasznal, es nem fogja menteni, ennek eredmenye az, hogy persze foprogramban nem igazan erdemes hasznalni, mert az elso int utan "el fog allitodni". Viszont igy megsporolunk jo par orajelciklust. Viszont, AVR eseten az SREG (status register, amiben van ugye carry flag, meg a szokasos dolgok) mentese / visszaallitasa tovabbra is a mi dolgunk. Az SREG mint I/O port elerheto (valojaban meg a CPU registerek is, sot RAM cimkent is, csak ugy lassabb lenne, vannak trukkok azert AVR-en ...).

Az a T-bites jatek (a T bit az un transfer bit, arra jo, hogy pl adott reg adott bitjet belemasolhatod, vagy kimasolhatod, igy egyszerubb mindenfele bonyolult elforgatasos jatek helyett "kivagni" adott bitet es mashova "berakni") azert kell, mert a kerdeses AVR eszkozon a portD ugye nem bitfolyamatosan van, mivel egyik lab pont onnan INT1 celra van eppen.

Szoval kb logikus, a portB (ahova a 'valaszt' kiirja ugye) kezelese erdekes. Lathatoan nem vmi adatot ir ki, hanem a DDR-t (Data Direction Register, azaz meghatarozza, hogy az egyes labak a portB-n ki vagy bemenetek) allit helyette. Miert is jo ez? Azert, mert parhuzamosan kapcsolodik szegeny taszt illeszto a billentyuzettel! Ha a billentyuzet es a taszt illeszto rossz csillagallas mellett ellenkezo szinteket allitana be az nem lenne tul szep, illetve akar tonkre is tenne vmit. Itt gondolom vmi olyasmi lehet, hogy a portB mint kimenet mindig 0-ra van allitva. Ha a billentyu nincs lenyomva, akkor az adott pin a DDR-el input-ra all, ami kb nagy impendancias allapot, tehat nem szol bele az AVR a jelszintbe. Ha le van nyomva, akkor 0 ertek kell, ekkor output-ba teszi az adott bit-et, es mivel a portB AVR-ben outputra fixen 0-ra van allitva, ez "lehuzza" GND szintre. Ha kozben EP billencs is le van nyomva, no para, mert az is csak foldre huzna le, tehat nincs konfliktus. Bocs, lehet hirtelen elneztem vmit, illetve csak az interrupt kod alapjan mondom ezt, de kb ez a megerzesem, hogy igy mukodik az egesz a fenti par byte-nyi AVR kodra ranezes utan.

Ja, az ORI azert van ott persze, hogy a D0 memoricimtol nezze azt a kis tablazatunkat. Ebben az AVR-ben csak 128 byte RAm van, de az adat cimterulet elejen az I/O elerheto szinten, a D0 valojaban a RAM vege elott 16 byte-tal van. Ez ugye eleg a 10 byte-os "tablazatra", mivel alapvetoen a select jel 4 bites, max nem lesz hasznalva a tobbi.

Azert van itt feher folt, pl az EOR R1,R1 hogy mire jo ... Elvileg ugye nullaza az R1-et, az oke, de utana ugysem hasznalja mar. Gyanitom, hogy ez valamiert a foprogramnak kell aztan. Hasonlo az R2, amit novel eggyel, de semmire sincs hasznalva, gondolom ezt is a foprogram nezi valahol.

Na, vege a mesedelutannak. Most nem akarok felelotlen igeretet tenni, de szerintem ezt meg lehet tomorebben is oldani ... itt ugye a kulcs az, hogy az interrupt kiszolgalasa es az OUT vegrehajtasa kozott eltelt ido az, aminek akkor ugye 11 Z80 orajelnyi ido alatt le kell futnia. Szerintem meg lehetne csinalni gyorsabbra is ennel, foleg, mivel nem feltetlen ertem, mire valo itt 1-2 dolog :) Mivel RAM nem kell tul sok az egesz cuccnak, akar fel lehet aldozni azt is, hogy a portD "nem folytonos" kiosztasa miatt vmi elkefelt matrixunk legyen, amiben van egy "nagy lyuk", cserebe a T bites jatek pl megsporolhato. Az R5 hogy mire kell neki az passz, szerintem felesleges. Ez talan szinten a foprogramnak szol, es arra kell, hogy programozni lehessen a taszt illesztot EP-rol? Lehet az R2 novelest erzekelve "latja" a foprogram hogy uj adat lett kiirva, es akkor nezi az R5-ot. Oszinen, en inkabb redundans modon (ha kell ilyen) megcsinalnam az IN-t a foprogramban is, ha a Zozo fele bekotest alkalmazzuk akkor az ott "taszt illeszto programzas" kapcsan nem critical, mig a matrix scan miatti lenne csak az interrupt-ban.

Szoval kiesne egy BST egy BLD, egy MOV, egy INC, egy EOR. Ez ot AVR orajelciklus sporolas az OUT-ig azonnal. Cserebe bonyolitottuk a foprogramot ha programozni is akarjuk az illesztot, es pazaroltunk RAM-ot mert nem "tomor" a kbd allapot "tombunk". Kovetkezo igen extrem optimalizacio: tegyuk az egesz interrupt handlert oda, ahol az int tablazat van :D Ezzel nyerunk ket tovabbi AVR orajelciklust (az RJMP nem kell) cserebe kb egyetlen interrupt-ot sem tudunk hasznalni AVR-unkon ami az INT1 utan all, hiszen ott a mi kodunk van helyette. Ezt most csak a hasamra utottem, lehet nem lehet kikerulni vminek a hasznalatat, es ez az elv nem mukodik. Mindenestre a legextremebb adott AVR-re (ami pl mas AVR-n nem is igy nezne ki feltetlen pl mas portkiosztas stb) valo optimalizaciot bevetve 7 AVR orajelciklust sporoltunk azonnal.

Na, most azt hiszem eleget irtam ebben a temaban, kerdeses, hogy valakit erdekelt-e egyaltalan :)
« Last Edit: 2014.October.20. 23:44:19 by lgb »

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #311 on: 2014.October.20. 23:51:14 »
Tovabbi optimalizacio jut eszembe: nagyobb AVR (pl ATmega8, meg mindig nem sokkal dragabb, bar kisse magyobb), ahol pl tobb pin van adott portra, es az a "nincs bitfolyamatos masik port ami csak port" szeru kerdes sem erdekes, igy megsporolhato talan az ANDI, sot az ORI is, mivel eleg RAM ott van (1K ha jol remlik ott mar), az X registar-pair felso erteket meg a foprogrambol folyamatosan adott erteken tartjuk, ezzel mondjuk kisse megint pazarloan banunk a RAM-al, viszont ha ez mukodne az elozo optimalizaciokkal egyutt, akkor talan mar 9 AVR orajelciklust faragtunk el. Plusz, nagyobb AVR: a RAM-jaban meg a pazarlas mellett is elfer vmi kbd layout tabla, nem kell EEPROM-ba irni, ami macera, es az is serulhet a flash mellett, meg ott idozites kritikus az iras, stb, bar valoszinu meg lehet oldani, Tigrian is megcsinalta persze, csak en nem ertek hozza :) Ez mondjuk egy hatrannyal jar: igy a kbd kiosztas mapping tablat minden reset utan le kell tolteni az AVR-be, mondjuk alapbol csak vmi default lenne ott hogy lehessen hasznalni, a RESET routine altal inicializalva. Ennel tobb optimalizacio hirtelen nem jut az eszembe, nem szamoltam ossze, de lehet igy mar ketszer gyorsabb is akar majdnem az AVR IN es OUT kozott a cucc?

Nagyobb AVR masik elonye: pl lehetne ra joy bemenet tudomisen akar C64 szeru joy, mert az pl nekem is van :) Es az pl jelen esetben a "parhuzamosan" kacsolodna a belso joy-al. Azert azzal, mert sajnos az teny, hogy nagyon time critical a kbd port olvasas/iras, az uabban az AVR-ben kevesbe fer bele, hogy masik portot is nezzunk, az viszont igen, ha a kbd matrixba irjunk mas dolgot is mint a PS/2 billencstol jon, mivel az a fogprogram resze, nem time critical. Sot, meg az is belefer, hogy meg egy PS/2 bemenet, es eger, de akkor itt is max kurzor mozgatasra forditjuk le, mert interrupt az kisse "szoros" es mar el vagyon hasznalva erosen. Mondjuk kulso joy kezelest en nem ismerem, ha az nem annyira time critical, akkor lehet belefer egy masik kulso interruptra teve aminek kisebb a prioritasa mint a WR0 altal vezerelt AVR interruptnak, de akkor maris az int tablaba pakoljuk a kodot optimalizacio problemas, es vesztunk OMG 2 teljes AVR ciklust ....

Ja es bocs, lehet kevertem mar vhol a Dave B4 es B5 portjat, nem mind1 :)
« Last Edit: 2014.October.20. 23:58:45 by lgb »

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #312 on: 2014.October.20. 23:52:43 »
lgb, van neked valami tapasztalatod, hogy lehetne valami avr gcc flag -gel, vagy ilyesmivel lekorlátozni az avr gcc -t,

Sajna nem tudom, elso probalkozast kiveve amit tettem AVR-rel, sose C-ztem rajta :) Amugy guglival most rakerestem, vannak ilyen kerdesek, de ahogy latom (legalabbis amiket megneztem talaltokat), nem igazan van pozitiv valasz, vagy csak en neztem pont rossz talalatokat :)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HW készítés Arduino-val
« Reply #313 on: 2014.October.21. 00:35:19 »
Mindenesetre sztm valami atomjó jutott eszembe most ahogy itt olvastalak,

frankón felelevenítettél és összefoglaltál dolgokat, amikről már beszéltünk, de én teljesen elfelejtettem: pld. azt hogy lenyomatlan billentyű helyett felhúzott bemenetet kell visszaadjak majd az EP -nek ha együtt akarok működni a beépített billentyűzettel ...

Namost ezen elmélkedve jött a következő ötletem:

ahogy itt olvastam, egy PS/2 -es billentyű általában 2 scancode tábla szerint adja vissza a billentyűket. van egy harmadik is (és elvben ugye nincs határ, de már a harmadik is csak egy speciális gyártó ősrégi code táblája, modern PS/2 cucc nem használja),

szóval nagyjából 2 féle scancode táblára kéne felkészüljek, melyek (mivel scancode) fizikai billentyűhöz kötődnek, de 2 féle táblázat.

Namost hogy a billentyű visszaadja -e magárol az inicializálásnál hogy ő melyik, az 1 dolog.
És hogy én implementálom -e ennek a kezelését, az egy másik dolog.
Legjobb esetben is beáll majd valamire ez a dolog, és lesz egy kezelt scancode tábla.

Namost (még ha csak egy is lenne, de minimum 2 van ugye) az viszont hogy egy- egy felhasználó (pld. én) melyik billentyűzetének épp melyik fizikai billentyűjét szeretné melyik EP gombhoz társítani ... mondanom sem kell, hogy billentyűről billentyűre, és felhasználóról felhasználóra változna ...

A testreszabás kérdése eddig számomra nem volt érdekes, nem láttam olyan lehetőséget, ami elég kis munka ahhoz, hogy érdemes legyen foglalkozi a kérdéssel.

Ha valaki testre akarja szabni a billentyű mappingot, annak forrásban kell(ett volna) módosítani, és fordítnai magának egy testreszabott progit.



De most hogy írtad ezt az EP vs PS/2 billentyűzet együttműködést, leesett valami:

Ha felhúzott bemeneten lesz a billentyű sorom, engedve hogy az ep bill. operáljon, akkor én azt vissza is tudom olvasni a kontrollerbe.

Vagyis egyetlen mikrokapcsoló felrakásával, vagy pedig egy speciális (más programok által soha b5 -re ki nem írt billentyű sor) címzéssel átkapcsolnám a mikrokontrollert billentyű mapping testreszabó módba,

ekkor egy tetszőleges program (lehet egy saját kis EP progi is, de sztm a basic editor is jó lesz, mert az is szkenneli a teljes mátrixot szerintem) szkennelné EP pldalon a bill mátrixot, én beolvasnám és ha találok lenyomott gombot (fontos hogy a felhasználó egyszerre csak egy gombot nyomjon le, de sztm ez betartható) akkor beolvasnék egy gombot a PS/2 -ről is (ott is megvárnám az első lenyomott gombot persze) és az összerendelést ELMENTENÉM az AVR perzisztens memóriájába, amit aztán későbbi indulásoknál mindíg visszatöltenék, és testreszabnám vele kódból, a default scan code táblát ...

Így akkor teljesen testre szabható lenne a billentyű mapping a külső és belső billentyűzet között,
és a testreszabás folyamata pedig annyi lenne, hogy először EP -n megnyomunk egy gombot, aztán meg a külső billentyűn, és azok már össze is ragadtak.

Illetve a sorrend most mindegy, lényeg hogy a külső / belső billentyűzetet felváltva nyomogatva már egymáshoz is rendelődnének a billentyűk, amit a cucc megjegyezne perzisztensen ... na sztm ez már nagyon gromek lenne ... :)
Z80 System

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: HW készítés Arduino-val
« Reply #314 on: 2014.October.21. 01:03:56 »
Meg egy (az egesz interrupt handlerben out utan is egy, tehat ketto) AVR orajelciklus sporolas :) Ha nagyobb AVR es tobb RAM es/vagy egy teljes 8 bites port input eseten szamuzheto minden utasitas ami SREG-et allitani (flags), igy annak mentese/visszatoltese nem kell :) Igy egyben csokkentettuk az interrupt handler altal elhasznalt regiszterek szamat is. OMG, lassan nem marad utasitas szegeny interrupt handlerben annyira rovid :) Optimalis esetben kb ennyi:

Code: [Select]
IN  XL, INPUT_PORT
LD  XL, X
OUT OUTPUT_PORT,XL
RETI

Hoppa ... :) Ehhez persze az kell, hogy az X regiszter felso byte-ja fixen a foprogram alatt is kb jo helyre mutasson a memoriaba. Mondjuk ezt nem gondoltam elegge at, nem garantalt, hogy jo lesz-e igy. Ha igen, akkor viszont az a durva eset all fenn, hogy ketlem, ez tovabb optimalizalhato lenne, hiszen minden lepes (port olvas, megfelelo emulalat kbd row membol be, valasz kiir, interrupt vege) egyetlen egy utasitas mar csak.

A fenti kod pl ATtiny-n biztos nem megy, meg mason se, ha 256 byte-nal kevesebb RAM van viszont, mert az a trukk hogy elpazarolunk 256 byte-ot eleve, a kerdeses MCU-nak meg annyi RAM-ja sincs mar eleve. Ha fixen tudjuk h az INPUT_PORT-al jelolt porton mi jon a nem hasznalt biteken es az nulla lenne (Tigrian cuccan bizos nem mert a PS/2 data input is, egyszeruen tul keves a lab mashova tenni azon az AVR-n), akkor finomithato esetleg az LDD utasitassal, ahol konstans kis ertek adhato az Y-hoz (akkor az osszes Y YL persze atirando az X-rol) pl. orajel ciklusban ettol nem valtozik ha minden igaz. Vagy vmi hasonlo :) Kezdel belefaradni az optimalizalasba, meg hat elmult 1 ora is mar, ideje lenne inkabb aludnom, es nem szet-flood-olni szegeny forumot.