Welcome, Guest. Please login or register.


Author Topic: HID kezelés ReLoaded (Enter the RPi) (Read 24450 times)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #75 on: 2018.November.01. 18:15:32 »
Azt kéne tehát megvizsgálni, hogy mikor anno írtam a vezérlőm EP oldalt kezelő megszakításának a kódját,
azt mennyire bénáztam vajon el ...

Az biztos hogy a legnagyobb prioritású megszakításra állítottam, és assembly -ben van,
de kérdés, hogy lehet -e annyira felgyorsítani, hogy működjön 7.12 MHz -en vagy 10 MHz -en is ...

(Maga az AVR ugye 16 MHz -en fut ...)

Így néz ki a megszakítás kódja jelenleg:

Code: [Select]

//
// EP interrupt ...
//

.global INT0_vect
INT0_vect:

push 26

in 26, _SFR_IO_ADDR(SREG)
push 26

in 26, _SFR_IO_ADDR(PINF)
andi 26, 0xf0

push 27
ldi 27, hi8(g_EPBuff)

ld 26, X
out _SFR_IO_ADDR(DDRB), 26 // Ez az a pont, ahol végülis kiíródik a billentyűzet sor,
                           // a többi már csak az újabb megszakítás indulásához számíthat ...

pop 27

pop 26
out _SFR_IO_ADDR(SREG), 26

pop 26

reti

« Last Edit: 2018.November.01. 18:20:54 by Z80System »
Z80 System

Offline pear

  • EP lover
  • *
  • Posts: 825
  • Country: pl
  • Z80 only
    • Támogató Támogató
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #76 on: 2018.November.01. 19:06:02 »
I'm sorry to watch you get tired ;)
You can always speed up. To certain limits.
Count the CPUs tacts and check what you can optimize.
Below is the PS/2 service code from EnterMice (MCS'51 assembler) after optimalization:
----
Sajnálom, hogy fáradt vagyok ;)
Mindig felgyorsíthatja. Bizonyos korlátok.
Sorolja fel a CPU-kat, és ellenőrizze, hogy mit tud optimalizálni.
Az alábbiakban az optimalizálás után az EnterMice (MCS'51 assembler) PS/2 szolgáltatáskódja található:
Code: ASM
  1. ;*** PS/2 low layer service ****************************************************
  2.                                         ; tacts limit 60 @12MHz (120 @24MHz)
  3. ps2service:                             ; +4 interrupt system delay + jump
  4.         HDW_INT_START   2               ; +6  using set #2 of GPR
  5.         jb      PS2TxON,ps2host         ; +2
  6. ps2receiver:
  7.         cjne    r7,#11,ps2rx_ctrl2      ; +2  is START bit ?
  8.         clr     PS2RxPE                 ; +1  init parity
  9.         sjmp    ps2rx_dec               ; +2
  10. ps2rx_ctrl2:    
  11.         cjne    r7,#2,ps2rx_ctrl1       ; +2  is parity bit ?
  12.         mov     c,PS2DAT                ; +1  get parity bit
  13.         jnc     ps2rx_dec               ; +2  parity control
  14.         cpl     PS2RxPE                 ; +1  if data_bit=1 then complement
  15.         sjmp    ps2rx_dec               ; +2
  16. ps2rx_ctrl1:
  17.         cjne    r7,#1,ps2rx_data        ; +2  is STOP bit ?
  18.         jb      PS2RxPE,ps2rx_store     ; +2  if not correct parity
  19.         setb    PS2Error                ; +1  then set error flag
  20. ps2rx_store:
  21.         mov     @r0,PS2RxBUF            ; +2  store byte in the buffer
  22.         inc     r0                      ; +1  increment buf ptr
  23.         mov     r7,#11                  ; +1  init bit counter for next service
  24.         sjmp    ps2rx_end               ; +2
  25. ps2rx_data:
  26.         mov     c,PS2DAT                ; +1  get PS/2 DATA bit
  27.         jnc     ps2rx_odd               ; +2  parity control  
  28.         cpl     PS2RxPE                 ; +1  if data_bit=1 then complement
  29. ps2rx_odd:
  30.         mov     a,r5                    ; +1  get buffered data
  31.         rrc     a                       ; +1  shift next data bit
  32.         mov     r5,a                    ; +1  store data
  33. ps2rx_dec:
  34.         dec     r7                      ; +1  decrement bit counter
  35. ps2rx_end:
  36.         jnb     PS2Error,ps2rx_end2     ; +2  if error
  37.         inc     r2                      ; +1  then increment error counter
  38. ps2rx_end2:
  39.         HDW_INT_END                     ; +6 = 27..37 tacts
  40. ;-------------------------------------------------------------------------------
  41. ps2host:                                ; +12 host mode
  42.         cjne    r6,#12,ps2tx_ctrl3      ; +2  is START bit ?
  43.         setb    PS2TxPE                 ; +1  init parity
  44.         sjmp    ps2tx_dec               ; +2  
  45. ps2tx_ctrl3:    
  46.         cjne    r6,#3,ps2tx_ctrl2       ; +2  is parity bit ?
  47.         mov     c,PS2TxPE               ; +1  set parity bit
  48.         sjmp    ps2tx_set               ; +2  
  49. ps2tx_ctrl2:
  50.         cjne    r6,#2,ps2tx_ctrl1       ; +2  is STOP bit ?
  51.         setb    PS2DAT                  ; +1  set STOP bit
  52.         sjmp    ps2tx_dec               ; +2  
  53. ps2tx_ctrl1:
  54.         cjne    r6,#1,ps2tx_data        ; +2  is ACK bit ?
  55.         mov     c,PS2DAT                ; +1  get ACK bit
  56.         mov     PS2Error,c              ; +1  store ACK as error flag
  57.         clr     PS2TxON                 ; +1  disable transmitter
  58.         sjmp    ps2tx_end               ; +2  
  59. ps2tx_data:
  60.         mov     a,r4                    ; +1  get data to send
  61.         rrc     a                       ; +1  shift next bit to send
  62.         mov     r4,a                    ; +1  store rest of data
  63.         jnc     ps2tx_set               ; +2  parity control    
  64.         cpl     PS2TxPE                 ; +1  if 1 then complement
  65. ps2tx_set:
  66.         mov     PS2DAT,c                ; +1  set PS/2 DATA bit
  67. ps2tx_dec:
  68.         dec     r6                      ; +1  decrement bit counter
  69. ps2tx_end:
  70.         jnb     PS2Error,ps2tx_end2     ; +2  if error
  71.         inc     r2                      ; +1  then increment error counter
  72. ps2tx_end2:
  73.         HDW_INT_END                     ; +6 = 27..37 tacts
  74. ;*******************************************************************************
  75.  
« Last Edit: 2018.November.01. 19:09:04 by pear »

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #77 on: 2018.November.01. 19:43:40 »
Quote
I'm sorry to watch you get tired ;)

You got it wrong ... :)

I'm just started ... :)

Z80 System

Offline pear

  • EP lover
  • *
  • Posts: 825
  • Country: pl
  • Z80 only
    • Támogató Támogató
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #78 on: 2018.November.01. 19:47:12 »
OKAY.
I'm silent and I'm watching :D

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #79 on: 2018.November.01. 22:18:54 »

Oké, a 7.12 MHz már megvan, azzal már jól működik.

Most a 10 MHz -ért küzdök ... hátha ... :)

Z80 System

Offline balagesz

  • EP user
  • *
  • Posts: 277
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #80 on: 2018.November.01. 23:13:31 »
Az biztos hogy a legnagyobb prioritású megszakításra állítottam, és assembly -ben van,
de kérdés, hogy lehet -e annyira felgyorsítani, hogy működjön 7.12 MHz -en vagy 10 MHz -en is ...

(Maga az AVR ugye 16 MHz -en fut ...)

Optimalizálási lehetőség az van sok. :) Három dolog is eszembe jutott:

Az AVR inicializációs kódját nem láttam, a megszakításod melyik élre van beállítva? Ha jól sejtem (a rajz alapján), a regiszter beíró jelek aktív alacsonyak. A sorszámot tároló tároló :) felfutóélre tárol, azaz az írási ciklus végén jelenik meg a kimenetén a beírt adat. Ha az AVR megszakítása már a lefutóélre indul, azzal lehet nyerni egy kis időt.

Az IT rutinodból azt veszem ki, hogy az "F" port aljára van bekötve a 4 sorkiválasztó vonal. Ha meg tudod azt tenni, hogy a felső 4 lábát az "F" portnak nem használod semmire, akkor állítsd be ezeket kimenetre és kapcsold őket alacsonyra. Így amikor a portot majd beolvasod, a kapott BYTE teteje mindig 0 lesz, nem kell majd maszkolni, azaz kihagyhatod az ANDI-t, -1 utasítás. :)

Azért is jó az AVR mint CPU-mag, mert van neki rengeteg regisztere. Simán meg lehet tenni, hogy kiválasztasz közülük párat, amit csak a megszakítás használ, illetve annyit, hogy a megszakítás mást ne is használjon, csak a kiválasztottakat. Így kihagyható a regiszter-mentés / visszaállítások zöme az IT rutinból. Hardkór változatnak én azt csinálnám, hogy kiválasztanám csak az IT használatára az r26/r27 regiszterpárt. Ez az XL/XH, vagy egésznek az X. A 16 BYTE-nyi billentyűtáblát mondjuk 0x0100..0x010F memóriaterületre raknám, a főprogram valahol az elején beállítaná az XH-t ennek a címnek megfelelően 0x01-re. A megszakítás rutin akkor így nézne ki:

Code: [Select]
  IN   XL,PINF     ;Kiválasztott sor számának beolvasása, 0x00..0x0F
  LD   XL,X        ;Táblázatból felszedve a kiválasztott sor adata
  OUT  DDRB,XL     ;Oszlop-érték beállítása a billentyűzet felé
  RETI

Aztán a megszakítási rutin ennyi is. Azért elég ez, mert egyrészt csak olyan regisztert használ, amit a főprogram nem, másrészt magát a státusz-regisztert sem kell menteni / visszaállítani, mert a fenti utasítások közül semelyik sem módosít egy státusz-bitet sem. Ha az "F" port felső 4 bitje használatban van, akkor a maszkoláshoz kell az ANDI, az viszont bántja a státusz-regisztert, akkor annak a mentése / visszaállítása még kell, de ahhoz is célszerű kinevezni egy csak erre a mentésre használt regisztert, így nem kell vermelni / visszaolvasni, a PUSH/POP az 2-2 órajelciklus.

Ezekkel azért eléggé sok idő nyerhető, viszont az XL/XH regiszterpár lefoglalásával lehet gond; milyen nyelven is programozod azt a tokot? :) Assembly-ben sima liba, de ha az Arduino saját nyelvét használod zömében, az - ha jól tudom - végül is az avr-gcc-vel forgat. Abba jó kérdés, hogy ezt a két regisztert lehet-e lefoglaltnak definiálni, hogy máshol ne használja. (Ugyan ezen regiszterpáron kívül van még kettő, ami így összevonva pointerként használható, de na. :) )

Ha ezen kívül is kellene másik megszakítást használni, az annyiban mindenképpen bonyolítja a szituációt, hogy annak az IT rutinjának egy SEI-vel kellene kezdődnie minimum, de az megnövelné a reakcióidőt mindenképpen, szóval az ellenjavallt. :) De az AVR kódját lehetne nagyon egyszerűnek tartani; úgyis az volt a terved, hogy majd az rPi fogja neki tolni a teendőket. Azt a legegyszerűbb úgy megcsinálni, hogy az AVR-en a sima soros portot, az USART-ot használnád, annak a bemenetére (RxD) az rPi usartjának a kimenetét (TxD) még rá is lehet kötni közvetlenül. Így egy vezetékkel az AVR irányába lehet küldeni bármit. Visszafele irányra valószínűleg sok szükséged nincs is.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #81 on: 2018.November.02. 01:14:30 »
Quote
Az AVR inicializációs kódját nem láttam, a megszakításod melyik élre van beállítva? Ha jól sejtem (a rajz alapján), a regiszter beíró jelek aktív alacsonyak. A sorszámot tároló tároló :) felfutóélre tárol, azaz az írási ciklus végén jelenik meg a kimenetén a beírt adat. Ha az AVR megszakítása már a lefutóélre indul, azzal lehet nyerni egy kis időt.

Ezt az okfejtést sajnos még nem értettem meg,
de az EP oldali megszak az lefutó él érzékenyre van konfigolva.
(Mert annó azt mondták, hogy mikor kész a bill. sor 4 bites címe, akkor ezt egy lefutó él jelzi az 5. dróton.)

Ez most akkor jó így szerinted vagy nem ?

Quote
Hardkór változatnak én azt csinálnám, hogy kiválasztanám csak az IT használatára az r26/r27 regiszterpárt. Ez az XL/XH, vagy egésznek az X. A 16 BYTE-nyi billentyűtáblát mondjuk 0x0100..0x010F memóriaterületre raknám, a főprogram valahol az elején beállítaná az XH-t ennek a címnek megfelelően 0x01-re.

Ez már megtörtént, ettől kezdett el menni a 7.12 MHz. Csak én az Y regiszterrel oldottam meg, mert az X és Z regiszterekhez jobban ragaszkodik az avr-gcc.
(Le lehet azokról is beszélni, de az Y -ról volt a legkönnyebb.)

Quote
azaz kihagyhatod az ANDI-t, -1 utasítás

másrészt magát a státusz-regisztert sem kell menteni / visszaállítani

Na ezen megy most a szívás, mert ehhez a PS/2 data jelet át kellett vakarjam a pf0 -ról (máshova) a pd4 -re,
és ettől vártam volna, hogy akkor kiszehetem a statusz mentést meg az andi -t
(ami összesen -2 órajelciklus lesz, és kész, tehát ettől a 2 órajeltől vagy működni kezd a 10 MHz vagy nem),

de valamiért nem műxik ...

Elromlott az egész ...

Nem értés van ...

Quote
hogy az AVR-en a sima soros portot, az USART-ot használnád, annak a bemenetére (RxD) az rPi usartjának a kimenetét (TxD) még rá is lehet kötni közvetlenül. Így egy vezetékkel az AVR irányába lehet küldeni bármit. Visszafele irányra valószínűleg sok szükséged nincs is.

Nem lesz külön interfész az RPi -nek ...

Az RPi PS/2 -t fog küldeni az Arduino most elkészülő PS/2 bemenetére ... :)
« Last Edit: 2018.November.02. 01:48:32 by Z80System »
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #82 on: 2018.November.02. 02:29:16 »
Hmmm ... nem tudom mi lehet a baj ...

Eddig a D port 4 -es bitje nem volt használva ... most arra kötném a PS/2 data vonalat ...

Lehet hogy a D port 4 -es számú (ötödik) bitjének digitális bemeneti felhasználásához valami kontrol porton le kell tiltani valami magasabb szintű funkciót ? ? ?
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #83 on: 2018.November.02. 13:48:10 »
Á bakker, ez így eleg gáz !

Azon szívtam idáig, hogy ahhoz hogy szoftveresen máshogy tudjak működni,
ahhoz át kellett forrasszak 1 db drótot egyik lábról a másikra.

Ehhez viszont ugye le kellett szereljem a kontroller lapját az EP alaplapról,
és meg kellett bolygassam a jól összeszorongatott drótokat,
és ettől még vagy 4 másik drót kezdett el kontakthibázni,
vagy konkrétan leszakadni a zsugorcső alatt (ami ugye nem látszik) ...

Pedig esküszöm mindíg mikor felforrasztok egy lábra egy drótot,
utána megrángatom, hogy frankó lett -e, és utána húzom csak rá a zsugorcsövet ...

De ahogy így össze vannak zanzálva, törve a kábelek a felrakásnál, szépen töredeznek is lefele a levételkor ... :(


Na mindegy, megkeresgéltem mi halt le, visszaforrasztgattam,
de valamit csak ki kéne találni erre ...

Hogy csináljam hogy a drótok stabilabbak legyenek ? ! :shock:

Z80 System

Offline balagesz

  • EP user
  • *
  • Posts: 277
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #84 on: 2018.November.02. 13:51:36 »
de az EP oldali megszak az lefutó él érzékenyre van konfigolva.
(Mert annó azt mondták, hogy mikor kész a bill. sor 4 bites címe, akkor ezt egy lefutó él jelzi az 5. dróton.)

Valójában a felfutó él fogja a tárolást elvégezni, akkor kerül ki a 4 vonalra a beírt érték. A lefutás viszont a ciklus elején, egy kicsit előrébb van időben, de mire az AVR kódja a kiolvasáshoz ér, addigra a felfutás is meglesz, ha csak nem túl gyors a Z80. :)

Csak én az Y regiszterrel oldottam meg, mert az X és Z regiszterekhez jobban ragaszkodik az avr-gcc.
(Le lehet azokról is beszélni, de az Y -ról volt a legkönnyebb.)

Ez azért jó hír. Közben ránéztem a Z80 adatlapjára, azért látok érdekességet... :) Az IN r,(C) utasítás a doksi szerint 12 ciklus alatt fut. Az IN A,(n) meg csak 11, ez alapján a valódi címet tartalmazó utasítás gyorsabb, mintha a cím a C regiszterben lenne, és azzal történne az olvasás. (Ugyanez vonatkozik az OUT-ra is.)

(Ha valaki tud Z80 -on gyorsabb OUT/IN párt, az légyszi szóljon, mert akor nem a leggyorsabbat tesztelem ...)

Akkor szólnék, :oops: az IN A,(0b5h) a fentiek szerint gyorsabb, de ez nekem egy kicsit furcsa. Mindkét utasítás 2 BYTE-os, a (C)-s címzésűnél a második BYTE tartalmazza a regiszter számát. A Z80 ezt a BYTE-ot is úgy olvassa be, mintha op-kód lenne? (Tulajdonképpen az is. :) ) Ezt azért valaki megerősíthetné, hogy tényleg így van-e. :-D

Az IN utasítás 11 órajelciklus, de az a komplett végrehajtás, én inkább számolok most 10-zel. A 10 MHz-es Z80 ezt 1 µSec alatt futja meg, ennyi idő alatt 16 órajelciklus fog végrehajtódni az AVR-en. Nem mondanám, hogy rengeteg idő, de a "mini" IT rutin lényegi része 4 alatt megvan, rossz esetben egy 4 ciklusos utasítás szakítódna meg, az eddig 8. A maradék 8 csak elég arra, hogy az AVR oldalán elkezdődjön a végrehajtás, de ezt most nem kerestem ki.

Lehet hogy a D port 4 -es számú (ötödik) bitjének digitális bemeneti felhasználásához valami kontrol porton le kell tiltani valami magasabb szintű funkciót ? ? ?

Milyen µC van ezen a board-on? ATmega32U4? Most nézem az adatlapját... Ennek az "F" (meg az "E") portja nincs is teljesen kivezetve a tokon kívülre?! Az "F"-nek hiányzik a 2 + 3 bitje. Azt hogyan szeded fel? Persze beköthető helyette a 4 + 5, de akkor a billentyűtábla egy kicsit megkavarodik. :) A PD4 egyrészt timer funkció lehet, ezen kívül meg még analóg bemenet. RESET után egyik sem lesz aktív, a kérdés az, hogy az arduino mit konfigol be induláskor.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #85 on: 2018.November.02. 14:02:26 »
Na, de hogy valami jót is írjak, ne csak mindíg a nyafogást,
majdnem jók vagyunk. Majdnem ...

Ezzel a megszak kóddal:

Code: [Select]

//
// EP interrupt ...
//

.global INT0_vect
INT0_vect:

in 28, _SFR_IO_ADDR(PINF)

ld 28, Y
out _SFR_IO_ADDR(DDRB), 28

reti



már teljesen stabilan lehet 10 MHz -en is gépelni az EXOS -szal
(eddig legalábbis nem vettem észre hibázást,
érdekes volna tudni vajon az EXOS billentyűzet olvasó kódja mennyire válaszidőérzékeny),

és a korábban leírt tesztprogramban sem olyan rossz.

Ugye abban a tesztben akkor szerepelne tökéletesen, ha addig nem lépne ki, amíg nyomom az ENTER -t,
és 10 MHz -en általában 10 másodperc körüli idő után lép ki, ritkábban van hogy 1 másodperc,
és volt már hogy 30 másodpercig is bírta.

Szóval tökéletesnek nem tökéletes.


Ez az AVR megszak dolog úgy van,
hogy ugye nekünk kb 1 us altt kéne a válasz, ami ugye 16 MHz -es AVR -nél 16 darab órajel,

namost a megszakítás kiváltódásától minimum 5 órajel az AVR -nek mire ráugrig a megszak vektorra,
ahol egy további ugrás van a megszak kódra, ami még 3 órajel,
szóval 8 órajel már eltelt, mire elindul a megszak kód,
és ugye az a megszak kód az 4 órajel.

Tehát elvben mi megvagyunk 12 órajel alatt, mégsem tökéletes ...
valahol közbe tud jönni valami keh, és akkor nem lesz idejében válasz ...


Megpróbálom ellenőrizni, hogy mi van a megszakításokkal, ugye párhuzamosan van 2 megszak, plussz a főprogram,
hátha ki tudok okoskodni még valamit, ami megakadályozza hogy az EP megszak teljesítse a 12 órajeles idejét,

mert azt nem nagyon hiszem, hogy ezen a megszakítás kezelési időn még szignifikánsan faraghatnánk lejjebb ... :)
« Last Edit: 2018.November.02. 14:23:52 by Z80System »
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #86 on: 2018.November.02. 14:17:54 »
Quote
Akkor szólnék, :oops: az IN A,(0b5h) a fentiek szerint gyorsabb, de ez nekem egy kicsit furcsa.

Hát ez marha jó ... akkor majd ha azzal ami most van már stabilan megy
(menne, mert most csak kevéssé hiszem hogy fog menni),

akkor kipróbálom majd azzal is.

Quote
Milyen µC van ezen a board-on? ATmega32U4?

Igen.

Quote
Az "F"-nek hiányzik a 2 + 3 bitje. Azt hogyan szeded fel?

Az F portot korábban úgy használtam, hogy az egész portot felhúzott bemenetre állítottam,
és felső négy bitet használtam az EP -től jövő 4 bites bill mátrix sor cím beolvasására,
a 0. biten pedig jött be a PS/2 data vonal.
(A korábbi EP megszakban ez a PS/2 data vonal ((és akármi más az alsó 4 bitről)) volt ANDI -val semlegesítve.)

Most pedig úgy használom, hogy a port felső 4 bitje csak a felhúzott bemenet, az alsó 4 bit az lenullázott kimenet,
és csak a felső 4 bitet használom az EP megszakban, a PS/2 data vonal átkerült a D port 4. bitjére.

Quote
A PD4 egyrészt timer funkció lehet, ezen kívül meg még analóg bemenet. RESET után egyik sem lesz aktív, a kérdés az, hogy az arduino mit konfigol be induláskor.

Végülis nem ez volt a baj, hanem hogy szétszakadtak a kábeleim.
Ugyanúgy lehet használni digitális felhúzott inputnak a D4 -et is, mint eddig bármit amit próbáltam.

Csak ez az állandó kábelszétszakadás megőrjít már ... :evil:
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #87 on: 2018.November.02. 14:27:45 »
Most (hogy így csattogok itt a külső billentyűzettel 10 MHz -en :)),
veszem észre hogy milyen jó is ez a 10 MHz ...

Az ember elkezd idegenkedni tőle mikor ez ENTERPRISE felirat furán villog,
meg a billentyű hang sem a megszokott,

de mikor elkezdi használni, és a directory -k tök jó gyorsan jelennek meg,
a lomha ASMON funkciók megtáltosodnak, stb ... :)

Tök jó ! :)
Z80 System

Offline balagesz

  • EP user
  • *
  • Posts: 277
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #88 on: 2018.November.02. 14:40:31 »
Ez az AVR megszak dolog úgy van,
hogy ugye nekünk kb 1 us altt kéne a válasz, ami ugye 16 MHz -es AVR -nél 16 darab órajel,

namost a megszakítás kiváltódásától minimum 5 órajel az AVR -nek mire ráugrig a megszak vektorra,
ahol egy további ugrás van a megszak kódra, ami még 3 órajel,
szóval 8 órajel már eltelt, mire elindul a megszak kód,
és ugye az a megszak kód az 4 órajel.

Tehát elvben mi megvagyunk 12 órajel alatt, mégsem tökéletes ...

Upsz, erről a plusz ugrásról meg is felejtkeztem. :oops: Ha jól értem az IT rutinod, az INT0-t használod, aminek a belépési címe a $0002, ide kerül most az ugrás. Ha a következő vektort, az INT1-et nem használod (ne használd! :) ), akkor az ugrás helyére, tehát $0002-re közvetlenül odarakhatod a jelenlegi komplett megszakítás rutint, ami összesen 4 utasítás, tehát csak az INT1 ugrásának a helyére lóg rá. Így megspórolod az ugrás 3 órajelét, ami szerintem pont elég.

Megpróbálom ellenőrizni, hogy mi van a megszakításokkal, ugye párhuzamosan van 2 megszak, plussz a főprogram,

Mivel ennyire határeset lett a dolog, attól a másik megszakítástól ideje megszabadulni. :)

Most pedig úgy használom, hogy a port felső 4 bitje csak a felhúzott bemenet, az alsó 4 bit az lenullázott kimenet,
és csak a felső 4 bitet használom az EP megszakban, a PS/2 data vonal átkerült a D port 4. bitjére.

Akkor így a billentyűtábla egy 256 BYTE-os területre van szétszórva, minden 16. BYTE az értékes? Így is jó! :)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: HID kezelés ReLoaded (Enter the RPi)
« Reply #89 on: 2018.November.02. 15:21:15 »
Quote
Upsz, erről a plusz ugrásról meg is felejtkeztem. :oops: Ha jól értem az IT rutinod, az INT0-t használod, aminek a belépési címe a $0002, ide kerül most az ugrás. Ha a következő vektort, az INT1-et nem használod (ne használd! :) ), akkor az ugrás helyére, tehát $0002-re közvetlenül odarakhatod a jelenlegi komplett megszakítás rutint, ami összesen 4 utasítás, tehát csak az INT1 ugrásának a helyére lóg rá. Így megspórolod az ugrás 3 órajelét, ami szerintem pont elég.

Ú vazze, na látod ezért jó itt írogatni, előbb utóbb mindíg jön valaki, aki odébblök ...

Magam is gondoltam, hogy a megszak kódot a megszak vektorba kéne tenni direktben,
de mikor láttam hogy a megszak vektorban csak 4 byte van, ami kell neki egy szaros ugráshoz,
akkor láttam, hogy na, ide nem lesz az bepakolva ...

De most hogy mondod, hogy szerinted ez a megszak kód csak a második vektorba lógna bele,
(és a lista file tanúsága szerint valóban csak 8 byte),
valóban tehetem (újabb forrasztás vazze :evil: ) én a PS/2 megszakot akár az INT3 -ra is,
és akkor 12 byte lehet az INT0 -nak ...

Kúlság - faszaság, azzal talán akkor valóban meglesz ...


Quote
Mivel ennyire határeset lett a dolog, attól a másik megszakítástól ideje megszabadulni. :)

Most ezt hogy érted ?

Az 1 dolog, hogy ez EP oldalról jön egy akár 1 MHz -es nagyságú megszakítás, amit villámgyorsan ki kell szolgálni.
De hát jön a PS/2 oldalról is egy (jóval kisebb, általában 10 KHz - 30 KHz esetleg 100 KHz körüli megszak),
amit ha nem is olyan gyorsan, de azért észre kell venni, és kezelni kell ...

Ez még szerintem nem főprogram kategória ... hogy főprogramból pollozzam a PS/2 órajelet ...

Szóval szerintem kell az a második megszakítás is, csak annyi a különbség,
hogy amíg a PS/2 megszakítás kezelő (ami most fog átkerülni INT1 -ről INT3 -ra) egy SEI -vel kezdődik,
addig az EP oldali kezelő nem ad ki SEI -t, hanem csak a RETI fog újra engedélyezni.

Így az INT0 meg fogja tudni szakítani az INT1(3) -et, míg fordítva nem igaz.

Persze vannak ott valami ármányok az AVR megszakítás leírásában,
hogy az elso 5 órajelciklus közben bekövetkező megszakítás priotitásos lesz ahhoz a megszakhoz képest,
akinek az első 5 ciklusa (kiváltódás eleje) fut,
tehát ezek szerint a PS/2 megszak mégis bele tud szakítani az EP megszakba,
ha jól értettem ...

Szal ezeket próbálom még olvasgatni az AVR -nél ...

Mert megszüntetni a PS/2 megszakot szerintem nem nagyon lehetne ...


Quote
Akkor így a billentyűtábla egy 256 BYTE-os területre van szétszórva, minden 16. BYTE az értékes? Így is jó! :)

Ja, mivel minden más portot elszartak valamire ...


A - portot nem is láttam, asse tom létezik -e, nincs belőle kivezetés ...

B -port az egyetlen összefüggő 8 bit, az kell a billentyűzet sornak ...

C- portból 2 bit van, azon is 2 SMD led lóg a lapon gyárilag ...

D -port az teljes, de az alsó 4 bitjére tették a 4 hardver megszakítást, amiből nekem 2 kell, szal ott sem szabad az alsó 4 bit ...

E -portból 2 bitet hagytak csak meg szintén ...

F -porton is csak a felső 4 és az alsó 2 van kivezetve ...


Oszt nincs több port bakker ... Szal maradt a felső bitezés a cím beolvasáshoz.
« Last Edit: 2018.November.02. 16:16:41 by Z80System »
Z80 System