Ó bakkerkám ...
Na, gondoltam ma este megírom a progit, holnap reggel ráforrasztom azt a pár szál drótot, aztán délután már csak a billentyű mappolásokat lövögetem befele ...
Ehhez képest annyit sikerült elérnem, hogy sikerült végre egy megszakítást kiváltanom ...
Először gyorsan felszórtam a cuccra 3 ledet (azért pont annyit, mert teljesen különálló regisztereken, bitezgetések nélkül 3 láb van jelenleg szabadon),
három színben, mégpedig debug célokra, mert okos fejemmel rájöttem, hogy oké hogy kidobtam az arduino framework -öt, és raw avr-libc -re tértem át,
hogy az arduino ne kezelgessen ott nekem megszakításokat a fícsőreihez, de ezzel kidobtam pld. a serial logging fícsőrt is, úgyhogy max akkor lehet logolni,
ha beletervezem a kütyübe, és persze meg is valósítom ... mert ugye az arduino az az eszközön kezel egy slave usb virtual serial portot ...
Na szóval ledekkel fogok debuggolni, most egyenlőre hárommal. (Ha nagyon muszáj, szöszöléssel felmehetek akár 8 -ig is.)
Ezzel nem is lett volna galiba.
Na akkor élesszünk be egy assembly megszakot ... hát ehhez ugye el kellett olvasni mindenfélét, assembly -ről, megszakról (mind avr-libc, mind hardveres oldalról), meg miegyébről ...
Aztán bepötyögtem és nem szakított ...
Ugye maga a megszakítási láb az egy bemenet (mer én arra állítottam), felhúzóellenállással (mert az kell szinte mindenhova, de a PS/2 -nek biztosan, és ráadásul a teszthez különösen jó volt ha nem lebegdez összevissza), és erre van még rákapcsolva egy lefutó élfigyelő megszakítás, az is azért mert az kell a PS/2 -nek.
A felhúzó ellenállás miatt azt gondolom nyugottan tapperolhatom a drótot, meg érintgethetem a földhoz, ha szakítani akarok. Hát megszakadtam, de ez nem szakadt meg ...
Magát a magasat (amíg nem kötöm le dróttal a földhöz) mérem a lábon 4V formájában, tehát a felhúzás végzi a dolgát.
De mikor letüskézem a földhöz, akkor se szakad meg.
Persze gondoltam mindenféle fordítási, linkelési, akármilyen hibákra, nem teljesen agyondokumentált az avr-libc megszak vektor kezelése ...
De a gond nem magában a megszak vektorban lesz, inkább a megszak engedélyezések, maszk beállítások, request flag törlések körül ...
Végülis összevissza próbálkozással sikerült eredményt elérnem, de mintha nem működne teljesen atombiztosan, az meg ugye semmire nem jó ...
Szóval az van, hogy van egy global megszak flag, egy megszakítás vektoronkénti(típusonkénti, forrásonkénti) megszak flag, és van a legtöbbhöz még egy ilyen megszak igény cache flag is, és akkor még a forrás típusától függő paraméterezhetőség ...
És én azt kísérletezgettem ki, hogy ha a megszak igény cache portot (indián nevén: EIFR) törlöm egy írással (doksi szerint írással törlöm a megfelelő bitet), akkor hiába tunkolom a kábelt a föld sínbe, nem lesz megszak.
Ha nullát írok ki rá (vagyis írom, de nullával, nem 1 -gyel, ahogy a doksi mondja), akkor azonnal lesz megszak. Tehát anélkül, hogy a lebegő (ne felejtsük a felhúzó ellenállást) drótot beletolnám a föld sínbe. Egyedül akkor nem lesz rögtön megszak, ha a drótot még indulás előtt csatlakoztatom a földhöz. Ebben az esetben csak akkor lesz a megszak, mikor kihúzom a drótot. Ezt mondjuk betudhatom valami pergési dolognak, mert ugye a megszaknak a lefutó élen kéne sípolnia ...
Ez a nulla írós módszer egyébként megegyezik azzal, mintha egyáltalán nem írnék erre az EIFR portra semmit.
Na és van még egy harmadik eset is, mikor először 1 -et írok rá, de közvetlen utána 0 -át. Na ez az eset működik a leginkább úgy ahogy elképzeltem,
amig nem dugom rá, addig nem fütyül, ha meg hozzáérintem, akkor fütyül a megszak ... Csak itt meg az van, hogy ha úgy indítom, hogy le van dugva induláskor,
akkor mikor kihúzom nem kezd el megszakítani (ilyenkor hol van a pergés?), és van néha hogy még akkor sem ha visszaérintem először, hanem csak a második hozzáérintésre lesz a megszak ...
Szóval nem igazán tudom mi ez ...