Következő kérdés mondjuk az lenne, hogy ami nekem kell, az vajon belefér -e egy ilyen 32 vagy 64 makrocellás CPLD -be ?
Kellene nekem minimum 80 de maximum 128 bitnyi "memória" egy ilyen alkatrészben,
amit egy soros interfészen írni tudok,
egy 8 bit adat + 4 bit cím interfészen meg olvasni.
Vajon ez a logika mennyi makrocellába férne bele ?
10 - 100 - 1000 makrocella ?
Mennyi lehet kb. nagyságrendileg ?
(32 makrocellára 600 felhasználható kaput írnak, 64 makrocellára 1250 kaput.)
uh, nekem ez az előző blog :) mintha kimaradt volna...
Észrevétel: nem bonyolítod te ezt egy kicsit túl? :ds_icon_cheesygrin:
Ha a terv az, hogy a billentyűzet felől jövő 4 sorkiválasztó jelet bekötöd ebbe, ez meg kifele majd generálja a 8 bitet,
A 10 soros verzióhoz is az EPM3128 kellene, a nagyobbhoz az EPM3256, legalábbis ami a bittárolási képességet illeti.
Nekem is egyszerűbbnek tűnik a 4-ről 10-re dekódolás után átvenni a fonalat és nem bonyolítani még azzal is az életedet.
Nem mondom hogy ne próbálkozz vele, de lehet érdemes lenne kezdésként kikerülni a CPLD-t is. Azért az elsőre nem teljesen triviális, ha nincs hardveres tapasztalatod.
Az FPGA-val meg az a prücök, hogy ahhoz meg szükséged lesz valami reset/programozó áramkörre, és programozó Flashre/ROM-ra, ami szintén helyigényes, így hát azzal sem igen jársz jobban.
Harmadrészt azért még egy 10 MHz-en hajtott Z80 sem tud mikroszekundumonként billentyűt olvasni,
A 10 soros verzióhoz is az EPM3128 kellene, a nagyobbhoz az EPM3256, legalábbis ami a bittárolási képességet illeti.
Ezt a gondolatot egyáltalán nem értem ...Valószínűleg én értettem félre a mondandódat és/vagy az EP billentyűmátrix kezelését.
... de ezekbe a modern FPGA -kba már beletesznek memóriákat, ami mégis eltárolja a logikát,Ja, hogy FPGA-mikrovezérlő hibridet akarsz! Az tényleg más, és a beágyazott processzor fel tudja programozni a memóriájából az FPGA-t, bár azoknak sem jobbak a kivezetéseik. Manapság már kezd kifutni minden ami nem BGA vagy CSP, akármiFP tokozással is egyre kevesebb dolog van.
és az FPGA újratöltésre kerül ebből a beépített tárból. ...
Korábbi topikokban megállapítottuk(ták), hogy ha kitolsz Z80 -on egymás után egy OUT és IN utasítást, akkor a kettő között (4 MHz Z80 esetén) kb. 3 mikroszekundum lehet,Valóban, de nem kell ezt folytonosan tudnia. Elég - bár nyilván az sem egyszerű - reakcióként tudni teljesíteni ezt az időt az olvasási kérelemre.
mire a bill. sornak a helyen kell lennie. Persze ha a kód nem közvetlenül olvas az OUT után, akármennyi is lehet, de működnie kell nyilván minden körülmények között.
10 MHz Z80 -nál meg annak a felénél is kevesebb ...
Valamint egy mikrón USB és Bluetooth billentyűzet, egér, jatékvezérlő (és franctudja mit találok még ki) támogatásokat lekódolni ...Azt még nem mondtad, hogy ebben hogyan is segítene az FPGA, még ha hibrid is. És azt sem, hogy miért kellene ezt mindet a billentyűzetbe vagy annak helyére kötni. Vagy megint benéztem valamit.
... A neve az, hogy CPLD. Ami a "Complex programmable logic device" rövidítése.Igen, pontosan van elnevezve. Ugyan is ezek kb. sima PLD-kből (GAL, PAL, akármi), valamiféle kapcsolómátrixból és esetleg néhány egyéb kiegészítő áramkörből vannak felépítve. Szóval ezek PLD-k, amik komplexek. Amikor ezeket először sikerült megkonstruálni és sorozatgyártani valamikor az 1970-es évek végén vagy a '80-asok elején, hidd el ennek a szintű összetettségnek is nagyon lehetett örülni.
Mondom COMPLEX !!! ...
Ja, hogy FPGA-mikrovezérlő hibridet akarsz!
Azt még nem mondtad, hogy ebben hogyan is segítene az FPGA, még ha hibrid is. És azt sem, hogy miért kellene ezt mindet a billentyűzetbe vagy annak helyére kötni. Vagy megint benéztem valamit.
Illetve egy makrocellában 1 db. tároló van, azaz 1 bit.
A 10 soros verzióhoz is az EPM3128 kellene, a nagyobbhoz az EPM3256, legalábbis ami a bittárolási képességet illeti.
library ieee;
use ieee.std_logic_1164.all;
entity single_port_ram is
port
(
data : in std_logic_vector(7 downto 0);
addr : in natural range 0 to 63;
we : in std_logic := '1';
clk : in std_logic;
q : out std_logic_vector(7 downto 0)
);
end entity;
architecture rtl of single_port_ram is
-- Build a 2-D array type for the RAM
subtype word_t is std_logic_vector(7 downto 0);
type memory_t is array(63 downto 0) of word_t;
-- Declare the RAM signal.
signal ram : memory_t;
-- Register to hold the address
signal addr_reg : natural range 0 to 63;
begin
process(clk)
begin
if(rising_edge(clk)) then
if(we = '1') then
ram(addr) <= data;
end if;
-- Register the address for reading
addr_reg <= addr;
end if;
end process;
q <= ram(addr_reg);
end rtl;
MAX 3000A devices use CMOS EEPROM cells to implement logic
functions. The user–configurable MAX 3000A architecture accommodates
a variety of independent combinatorial and sequential logic functions.
The devices can be reprogrammed for quick and efficient iterations
during design development and debugging cycles, and can be
programmed and erased up to 100 times.
Igen, ez lenne a terv. Max. még lehet hogy bele kell kombinálni a címzésnél a 4 sorkiválasztó drót mellé azt az 5. trigger drótot a lefutó éllel ...
Lehet tényleg inkább az FPGA -k között kéne keresgéljek, ott a "kis kapacitású" is sokkal nagyobb mint itt a CPLD -knél a "nagy kapacitású" ...
Inkább érdemes lenne átgondolni, hogy nem lehetséges-e mégis AVR-rel összehozni.
Másrészt - ezt majd balagesz pontosítja - elég jól túlhajthatóak. Emlékeim szerint a SwinSID egy 16 MHz-es jószágon lett megvalósítva kétszeres órajel mellett.
Harmadrészt azért még egy 10 MHz-en hajtott Z80 sem tud mikroszekundumonként billentyűt olvasni, arról nem is szólva, hogy értelme sincs.
Hát ezért akartam keresni diszkrét alkatrészt, de nem találok ... összerakni sem akarok IC -ből ... sőt ha csak 1etlen módot találok rá, nyákot sem akarok tervezni, gyártatni, forrasztani ...
Korábbi topikokban megállapítottuk(ták), hogy ha kitolsz Z80 -on egymás után egy OUT és IN utasítást, akkor a kettő között (4 MHz Z80 esetén) kb. 3 mikroszekundum lehet,
mire a bill. sornak a helyen kell lennie. Persze ha a kód nem közvetlenül olvas az OUT után, akármennyi is lehet, de működnie kell nyilván minden körülmények között.
Valamint egy mikrón USB és Bluetooth billentyűzet, egér, jatékvezérlő (és franctudja mit találok még ki) támogatásokat lekódolni ...
Ha ilyen pár bit sem fér bele, akkor minek az a rengeteg láb a tokozáson, meg mi végre ez a nagy hűhó ?
A neve az, hogy CPLD. Ami a "Complex programmable logic device" rövidítése.
Mondom COMPLEX !!!
Hát kérdem én, mi ezen a complex akkor ? Attól complex, hogy tudnak írni egy 666 oldalas .pdf -et róla ?
- Pici és olcsó mikrokontrollerrel nehézkes az EP igényeinek megfelelő sebességgel reagálni az EP IN/OUT jeleire.
- Pici és olcsó mikrokontrollerrel (sőt még drágával és naggyal is) marha nehéz (nagyon hosszas fejlesztés) USB és Bluetooth HID eszközöket kezelni.
- Vagyis inkább az EP -be belülre csak egy olyan fokozatot teszek, ami tökéletes sebességgel tud reagálni az EP IN/OUT jeleire,
egy 80-128 bitnyi bufferből, ami lefedi az EP billentyűzet mátrixot (és esetleg később még pár dolgot, mint pld. a reset, stb.)
és a lehető legkevesebb számú dróttal/pinnel/csatlakozóval lehet kihozni az EP -ből, egy soros interfészen.
- A mindenféle HID eszközök kezelése innentől opcionális, csinálhatod az EP -n kívülről olyan komplexitású hardverrel,
amivel csak akarod, es ki tudod vele szolgálni az előző pontban megnevezett soros interfészt.
- Ez a komplex hardver pld. lehet egy Raspberry Pi, ahol API -kat használva olvashatsz HID eszközöket, és GPIO -n pumpálhatod az EP -be a soros interfészen.
Mindezekhez azonban kell egy fokozat, hardver, az EP -be, ami 80-128 bitnyi infót bufferel,
soros interfészen engedi azt írni kívülről, és 4 cím + 8 adat párhuzamos interfészen engedi az EP -nek azt olvasni belülről.
De mi lehet ez a hardver ? Nem találtam ilyen diszkrét alkatrészt sajna eddig.
Itt jönnek a képbe a PLD -k. CPLD, FPGA, akármi, csak tudjam vele megcsinálni a fenti fokozatot.
Ezt egyébként honnan vagy miből lehet látni ?
Namost ez mi a rák ? Max 100X írhatom csak bele a logikát ? Az nagyon sovinak tűnik nekem ... :(
A trigger ehhez "by design" nem kell
ha csak nem akarod magát a 4 bitet is saját magad tárolni a gépben levő U25/74LS273 helyett.
Valóban, de ezt egy kissé "ágyúval verébre" megoldásnak érzem,
Egy 20MHz-es mikrovezérlőnek az 20 órajelciklus, de egy 50 MHz-esnek már 50! Azzal azért elég sok helyre oda lehet érni.
Azért az nem semmi, hogy egy 8 bites gép billentyűzetét kiváltandó egy komplett, GHz-es sebességű számítógép lesz használva. :) Ekkor minek egyáltalán az eredeti gép? Az árpin futhatna egy EP emulátor, aztán kész is vagy. :-D
Hacsak... Jut eszembe! Itt van az alkatrészed!. Kérdés, hogy beszerezhető-e? Mondjuk ehhez is kell némi körítés, de a lényeget megoldja. :-D
Van az EP -ben olyan órajel, ami nem változik meg a CPU húzásakor (tehát minden gépen lehet vele ugyanazt az időt mérni),Pl Nick órajel.
és felhasználható párhuzamosan egy másik inputon is ? Vagy erre saját órajelet kell generálni ?
Pl Nick órajel.
És az mennyiaz ? :) (Thx. Zozo)14237536.27 Hz (https://enterpriseforever.com/hardver/nick/msg22123/#msg22123)
14237536.27 Hz
Hát ez már akkor is az volt, mikor 16 MHz -es 32 bites mikrót használtam PS/2 illesztéshez ... :) (Oszt mégse elég gyors ugye ...)
Még az 50 Mhz -nél se olyan triviális, hogy mire kiváltódik az a megszak, mindenféle mechanizmusokon keresztül,
meg le push -olja azt a 2 regisztert, amit muszály, és kiírja végre a billentyűzet sor bájtját, addig nem csúszik ki az 1 mikroszekundumból.
Azt írja, hogy 40 -es DIP -be rakják. (Breakout board -ot valszeg nem fogok találni az SMD verziójából ...)
A 40 -es dip 52 mm X 15 mm, és azt írod még kellene valami mellé ...
2,
Tud -e valaki saccolni, hogy fenti logika belefér -e (lehet 80 bittel számolni továbbra is) ebbe az FPGA -ba:
https://store.tinyfpga.com/products/tinyfpga-a1
MachXO2-256
https://www.latticesemi.com/Products/FPGAandCPLD/MachXO2#_3D24D0EEB97F430890D7AF24D20DF79A
Eh... A 16 MHz határesetnek tűnik, de mi is volt ez a mikró pontosan? (32 bitesből ily' lassú? :-D )
Ha jó az, hogy 10 vezetékkel (plusz tápok) jössz ki a gépből,
Az oldalon a doksi azt írja, hogy 18 user I/O-d van. Az elég lesz?
Amúgy 2 KBit RAM-ot is ír mellette, abba talán elférnek a tárolandók. (Mondjuk pont egy FPGA-ban van más mód is bitet tárolni, de ehhez jó lehet a direkt RAM is.)
Hááát ... most hogy így rákérdeztél ... :oops:
Eléggé 8 bitesnek tűnik az adatbusz ... :)
Hát dehogy jó ... ha jó lenne, akkor azt a pár lábas Dual Port RAM -ot kéne betenni az EP -be egyedül,
amit még úgy a topik nyitásánál linkeltem, és kalap kabát, minden kész volna ...
2 soros input+ 12 parhuzamos output+ 1 reset output = 15 drót
Akkor van még 3 felesleges ...
Nem ?
12 párhuzamos outputaz gondolom 8 ki meg 4 bemenet lesz. :)
Ez azt jelenti szerinted, hogy az FPGA -ba írható logikai funkciók
1,
Elérik írásra/olvasásra azt a dedikált 2 KBit RAM -ot ?
2,
És azok elérése, "címzése" kevesebb logikával jár, mintha a bitek úgy lennének megvalósítva szintén a programozható területen, logikai hálózatokkal ?
Eléggé 8 bitesnek tűnik az adatbusz ... :)
De akkor is 16 MHz ! :oops:
(És benne van a nevében hogy 32 ...) :oops:
Hát dehogy jó ... ha jó lenne, akkor azt a pár lábas Dual Port RAM -ot kéne betenni az EP -be egyedül,
amit még úgy a topik nyitásánál linkeltem, és kalap kabát, minden kész volna ...
Amugy AVR-rel (most ertem itt az ATmega meg ATtiny csaladot, az ATxmega az mar mas, ahogy az AVR32 es/vagy ARM core-os cuccok is) erdekes projectek vannak, pl dedikalt hw nelkul VGA signal eloallitasa, tisztan software-bol, stb (spec itt hasznos az, hogy van benne shift-out register is, ami pl SPI-hoz is kell, es lehet "abuse-olni" ilyen celra is). Stb, szoval azert annyira lassunak nem neveznem, foleg ahhoz kepest, hogy nyilvan ez a 8 bit MCU kategoria, ahol azert altalaban nem par szaz MHz-es orajelet szokas hasznalni altalaban, akkor az mar inkabb a 32 bit/ARM core/stb kategoria szokott lenni.Az egyik híresebb projekt (https://www.linusakesson.net/scene/craft/index.php).
Az egyik híresebb projekt (https://www.linusakesson.net/scene/craft/index.php).
Az egyik híresebb projekt (https://www.linusakesson.net/scene/craft/index.php).hohó, és a Craft végén Julia halmaz morpher :-)
Az jutott még az eszembe, hogy egyrészt itt is kell majd szint-illesztened legalább a 12 (+1) EP-be drótozandó jelet,
- vagyis az RPi és az FPGA között nem kell majd illeszteni,
- az FPGA és az EP közötti adat vonalakat (8 drót) szintén nem kell illeszteni, mert a 3.3V már magasba hajtja majd az EP TTL inputjait,
- csupán az FPGA és az EP közötti cím vonalakat (4 drót) kell majd illeszteni, mert az EP 5V -os cím drótjait majd vissza kell fogjam 3.3V -ra ...
Hmmm ... hát ez a "logikai áramkör programozás" ez lehet hogy egyszerűbb lesz, mint hittem ...
Mer nem is kell majd logikai hálózatokat tervezzek valójában ...
Az FPGA és az EP közötti 8 adatvonallal az a gond, hogy azok az EP-ben nem csak belemennek simán egy bemeneti kapuba
Na, erre azért majd kíváncsi leszek. :)
Jajj már balagesz ... te aztán nagy mestere vagy az ember bíztatásának ... :)
Francba ... akkor uána kell nézzek ezeknek az illesztési szaroknak is ... 12 illesztés az már elég sok (nagy) lehet gondolom ...
A VHDL -be nem lehet szekvenciális kódokat írni,
és nem fogja azt nekem valamilyen logikai hálózatokkal megvalósítani a fejlesztőeszköz ?
Ezt a legegyszerűbben talán két 74LS06-tal lehetne megoldani. Egy ilyen tokban van 6 db. OC-s kimenetű inverter. A 8 kimenetre ugyan csak 8 kapu kellene, itt az inverterek bemenetére simán köthető az FPGA kimeneti lába, a '06 kimenetei meg mehetnek közvetlenül a billentyűzet 8 bemeneti vonalára. A fennmaradó 4 inverterkapu viszont pont jó lehet az EP-ből jövő 4 jel FPGA-hoz illesztéséhez: ott az inverterek bemeneteire jön az EP 4 sorkiválasztó jele. A kimenetek mehetnek közvetlenül az FPGA bemeneteire, de mivel ezen kapuk OC-s kimenetűek, ezért csak alacsonyat fognak oda kapcsolni. Hogy a magas is meglegyen, az FPGA ezen lábait a saját VCCio-jára, tehát 3.3V-ra fel kell húzni ellenállásokkal, ilyen 2.2-4.7 KOhm-ra gondolnék itt. A maradék RESET jelhez már így nem marad illesztés, de azt egy egyszerű ellenállás + tranzisztor kombóval el lehet sütni. Összességében annyira nem sok alkesz kell hozzá.
Ha valamit szekvenciálisan akarsz csinálni, akkor annak a feltételeit meg kell teremteni először. Persze szinte tuti, hogy vannak készen ilyen modulok, ezért is írtam, hogy kíváncsi leszek, nem tudom ugyanis, hogy mit találtál ki. :-D
Hát persze ... négy marék IC ide, négy marék IC oda ... azt megfűszerezzük fél marék ellenállással, és csipetnyi tranzisztorral,
mindezeket ízlés szerint bedisznózva, vagy egy kisebb focipálya méretű nyákra rendezgetve tálalható is a cucc ...
Namost ha ezek szerves részét képezik fenti programnyelv(ek)nek,
és az ezekkel megfogalmazott működéseket állítólag programozható logikai eszközökbe lehet írni,
akkor valakinek a logikai hálózatra történő konverziót el kell végeznie közben ...
Pontosan. :) Visszakanyarodtunk megint ide, ahol az elején tartott a projekt: a "csak kész eszközöket bedrótozunk" verzió kevésbé működőképes, mivel elég speciális a feladat. Nem véletlen, hogy manapság ezt a fajta billentyűzetkezelést nem csinálják. :-D
Szerves részét képezik, de azt ne felejtsd el, hogy a VHDL / Verilog az nem programnyelv, hanem hardver-leíró nyelv. Soros "végrehajtás" itt akkor lesz, ha a lépések állapotát eltárolod magad. De ha tovább csavarjuk a megfogalmazást, eljutunk odáig, hogy lesz egy FPGA-ba implementált processzorod. :-D
Összevissza minden bekapcsolásnál más és más összes memóriát,A többször tárgyalt fantom rossz RAM (https://enterpriseforever.com/hardver/kezdo-hardver-kerdesek/msg45636/#msg45636), felhúzó ellenállás témakörnek tűnik. Van azon a lapon?
és más és más hibás memóriát jelez ki ... :(
Nincs, de miért csak most kezdte el a fantom fájást ? Eddig semmi baja nem volt ...Nem rákötöttél mindenféle cuccot? Az felborítja az eddigi véletlenszerű egyensúlyt.
Nem rákötöttél mindenféle cuccot? Az felborítja az eddigi véletlenszerű egyensúlyt.
di
ld c,0b5h
loop:
ld a,0
out (c),a
in a,(c)
cp 255
jp nz,err
ld a,1
out (c),a
in a,(c)
cp 255
jp nz,err
ld a,2
out (c),a
in a,(c)
cp 255
jp nz,err
...
...
...
ld a,7
out (c),a
in a,(c)
cp 192
jp nz,err
...
...
...
ld a,8
out (c),a
in a,(c)
cp 255
jp nz,err
ld a,9
out (c),a
in a,(c)
cp 255
jp nz,err
ld a,10
out (c),a
in a,(c)
cp 255
jp nz,err
...
...
...
ld a,15
out (c),a
in a,(c)
cp 255
jp nz,err
jp loop
err:
ei
ret
//
// 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
I'm sorry to watch you get tired ;)
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 ...)
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
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.
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.
azaz kihagyhatod az ANDI-t, -1 utasítás
másrészt magát a státusz-regisztert sem kell menteni / visszaállítani
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.
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.)
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.)
(Ha valaki tud Z80 -on gyorsabb OUT/IN párt, az légyszi szóljon, mert akor nem a leggyorsabbat tesztelem ...)
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 ? ? ?
//
// EP interrupt ...
//
.global INT0_vect
INT0_vect:
in 28, _SFR_IO_ADDR(PINF)
ld 28, Y
out _SFR_IO_ADDR(DDRB), 28
reti
Akkor szólnék, :oops: az IN A,(0b5h) a fentiek szerint gyorsabb, de ez nekem egy kicsit furcsa.
Milyen µC van ezen a board-on? ATmega32U4?
Az "F"-nek hiányzik a 2 + 3 bitje. Azt hogyan szeded fel?
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.
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 ...
Megpróbálom ellenőrizni, hogy mi van a megszakításokkal, ugye párhuzamosan van 2 megszak, plussz a főprogram,
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.
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.
Mivel ennyire határeset lett a dolog, attól a másik megszakítástól ideje megszabadulni. :)
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ó! :)
10 MHz ... a billentyű hang sem a megszokottA billentyűhangot szerintem meg lehet csinálni mélyebbre.
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 ...
Így az INT0 meg fogja tudni szakítani az INT1(3) -et, míg fordítva nem igaz.
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 ...
A programod amúgy most mit is csinál?
De egyenlőre sajnos még azzal is meg vagyok lőve,Azt nem azért nem lehet, mert Harvard architektúrájú az AVR?
hogy a megszak vektort módosítsam ...
Ugyanis azt nem lehet runtime, mert a program memóriában van ...
Csak compile time lehet, az AVR-GCC -ben meg mintha nem nagyon gondoltak volna erre ...
(Még nem találtam meg ...)
Azt nem azért nem lehet, mert Harvard architektúrájú az AVR?
És most üt meg a guta ... :smt010 :smt011 :smt013
CLI
IN YL,PINF
LD YL,Y
OUT DDRB,YL
SEI
Ezt a rutint minden táblázatfrissítés után lefuttatod
Kell az a tiltás,
Csak sajnálom rá az időt ... elméletben ... :)
:-D A tesztedet átírtad az IN A,(0b5h)-s verzióra? (Az OUT utasítás nem számít.)
:-D A tesztedet átírtad az IN A,(0b5h)-s verzióra? (Az OUT utasítás nem számít.)
Megírtam mind a 4 kombinációt, és végigteszteltem mind a (maradék) 3 kombinációt ...
Mindegyikben jó. :smt045 :smt045 :smt045
IN YL,PINF
LD R2,Y
OUT DDRB,R2
RETI
IN YL,PINF
LD R2,Y
OUT DDRB,R2
Ez tehát beterheli a vezérlőt az EP oldali megszakítással,
én pedig párhuzamosan rátenyerelek az összes billentyűre, amit csak elérek,
és nyomva tartom őket. (Reset billentyűket kivéve persze ...)
Ekkor a PS/2 billentyű is küldi az összes billentyűjét a vezérlőnek repeat rate -tel ismételve.
Közben megálmodtam, :lol: hogy hogyan lehet CLI/SEI nélkül megcsinálni a főprogramos frissítést.
Az én régi emlékeim erről olyanok, hogy ha egyszerre sok billentyűt nyomsz le, akkor nyilván elküldi a billentyűzet az összes lenyomott gomb (MAKE) kódját. De ismételni csak a legutoljára kiküldött kódot fogja, nem az összeset. Sőt: ha egy előzőleg kiküldött billentyűt közben felengedsz, akkor kiküldi annak a felengedési (BREAK) kódját, de az ismétlést ettől abba is hagyja. Persze változhatott a spec, a tévedés jogát fenntartom, stb...
Közben megálmodtam, :lol: hogy hogyan lehet CLI/SEI nélkül megcsinálni a főprogramos frissítést.
- Az összeset csak akkor küldi el, ha "N key rollover" -es, a legtöbb modern billentyű csak 3-10 key rollover, főleg az USB -sek, de PS/2 is ...
- Hogy csak az utolsót ismételné ... annak meg mi értelme lenne ? Ha N van lenyomva, ismételni is N -et kellene ...
Valahogy meg kellene ezt csinálni normálisan ...Színes drótokkal :-)