Tök szép elképzelés volt ez:
- push egy regiszter
- regiszterbe beolvas lábakról input 4 bit
- regiszterbe betölt sajátmagával indexelve egy tömbből output 8bit
- regiszterből kiír output 8 bit lábakra
- pop regiszter
- ret
A baj csak az, hogy jól kifelejtettem a megszak tiltás/engedélyezést, meg hát ezt az apróságot:
4.8.1 Interrupt Response Time
The interrupt execution response for all the enabled AVR interrupts is five clock cycles minimum. After five clock
cycles the program vector address for the actual interrupt handling routine is executed.
A return from an interrupt handling routine takes five clock cycles. During these five clock cycles, the Program
Counter (three bytes) is popped back from the Stack, the Stack Pointer is incremented by three, and the I-bit in
SREG is set.
Vagyis 10 ciklus akkor is elmegy, ha egy szaros utasítást nem írok a megszakkezelőbe ... persze minimum kell egy reti ...
Vagyis ha jól értem, akkor egy 10MHz -es z80 -at (ami kb. 1 mikroszekundum alatt képes in -t végrehajtani, egy out után ) az életbe nem fog tudni kiszolgálni (atomstabilan) egy 16MHz -es AVR megszakításból ...
Bakkerság!
Arról már nem is beszélve, hogy mikor nem billentyűről van szó, ahol az AVR -nek csak egyetlen vonalat kell figyelnie megszakítással,
hanem pld. joystick -ról, ahol 5 vonalra is megszakítást kéne tenni, hogy bármelyiken észrevehesse az "engem kezelj" állapotot,
ott (ezzel az AVR -el, ami nekem van) meg vagyunk lőve ... mert tetszőlegesen szabályozható feltételű megszakításból csak 4 láb van ...
Van még valami olyan megszak, ami minden lábon lehetséges, és a változást figyeli (még olvasom) de ha az ilyen, akkor nem jó,
mert nekem rohadtul nem éri meg 5 megszakot kezelni (hisz a változás mindegyiken adott lesz egy "irányváltásnál"), egszerre fog fütyűlni nekem az összes megszak mind a 4+1 "irányon" ...