Int0 az adatlapban, a beágyazó életében

Az AVR külső megszakításának viselkedésének ezen jellemzőjéről az Rtmip Radiochat fórum egyik munkatársa hívta fel a figyelmet. Érdekelt a kérdésem, és én egy kis kutatást végeztem, amelynek eredményeit felajánlják az olvasóknak.

Természetesen, mielőtt elkezdenénk a kutatásokat, szükségünk van a megfelelő zenére - ritkán dolgozom csendben.

Tehát az ügy lényege. Mint ismeretes, a megszakítások (minden, és nem csak AVR) az alábbiak szerint vannak elrendezve: léteznek vezérlõregiszterek, azokban az értékekben lokálisan engedélyezik / tiltják / konfigurálják a megszakításokat; vannak zászlóregiszterek - ha egy olyan esemény történik, amely megszakításhoz vezet, akkor a megszakítás zászlója fel van csavarva. akkor ha a megszakítások globálisan engedélyezettek, akkor a kezelőre való átmenet azonnal megtörténik, és ha globálisan letiltja, akkor a kezelőre való áttérés a zászló aktuális állapota után történik, amint a megszakítások újra megoldódnak.

Az INT0 külső megszakítás, amely e cikk témaként szolgál, számos esetben előállítható, különösen a száron lévő impulzus elülső oldalán, az impulzus bomlása, az állapotváltozás és a lábszár alacsony szintje mellett. És itt érdekesnek tűnik - ha elolvastad az adatlapot, akkor elolvashatod, hogy ha a megszakítás alacsony szinten van beállítva, a zászló mindig visszaáll.

Hogy van így? És mi a helyzet a kezelő hívásával? És mi történik, ha a megszakítás akkor fordul elő, amikor a megszakítások globálisan tiltottak? Hogyan tudja a vezérlő, mi az? És tudni fogja?

A kérdések megválaszolásához feltártam az elrendezést, írtam egy kis tesztet, amelynek kódját alább felsoroltam, és több kísérletet végeztem.

1. Igen, a szint megszakítás beállításakor a megszakítási jelző mindig visszaáll.

2. Ugyanakkor, ha a megszakítások globálisan engedélyezettek, akkor a megszakítást a zászló beállítása nélkül hívják! Csodák!

3. Ha a lábszár szintje abban a pillanatban történt, amikor a megszakítások tiltottak (és eltűntek a felbontás előtt), akkor az esemény elvész. A vezérlő nem tud róla, ellentétben az elülső / lefelé / szint változással.

Természetesen a kimenet helyes, nem csak az INT0, hanem az INT1 esetében is - azonosak.

Mi ennek a rendszernek a mély jelentése? Ha megnézzük a filozófiai dolgokat, akkor feltételezhető, hogy az érzékenység módban a szintet adunk csak azért, hogy megjelenítse a vezérlő egy alacsony fogyasztású, hiszen megszakítás él / őszi / változás nem működnek, ha az óra ki van kapcsolva, de a megszakítási szintet működik és sikeresen felébreszti az MC-t.

Végül is, a PCINT készlet bármely megszakításával átviheti az MK aktív üzemmódba. Miért van szükségünk ilyen furcsa INT0 feldolgozásra? A válasz megtalálható, ha elolvassa az adatlapot valami fosszíliából az AVR sorozatból; például az AT90S1200-on. Azokban az években, még nem voltak új hipermodern PCINT, de meglehetősen alacsony fogyasztású mód és annak szükségességét, hogy ki közülük még valamilyen más módon, mint a rendszer újraindítására - ami felér egy ravasz trükk, hogy INT0. Most ez nyilvánvalóan nem más, mint egy tisztelgés a kompatibilitás, mivel megszakítása általános szintje a kényelmetlen - működik folyamatosan, amíg a jelenlegi szinten (a potenciális lehetőség, hogy függessze fel a vezérlő), és általában a reakció szükségessé a névváltoztatást láb állam - a gomb megnyomásával, az érzékelő működését, hogy valami ilyesmi más. Mert nagyon kevés ember figyel a leírtakra.

Az alábbiakban a teszt kódja. A "Vga" rémálmában íródott - a C-ben telített a feltételes összeállítás, a makro-helyettesítések és néhány varázsszó-irányelvek telítettségével, általában véve rajtam. 😀 A program lehetővé teszi az INT0 megszakítás tesztelését különböző módokon és különböző módokon, bizonyos preprocesszoros irányelvektől függően. Az 1. és a 2. üzemmódra (megszakítás és zászló tesztek) egy külső húzóerőre van szükség, és a 3. üzemmód (megszakítási vizsgálat a globális megszakítás tilalma alatt) autonóm módon működik.

Az egyetlen zászló helyes törlése úgy néz ki, mint az EIFR = _BV (INTF0); Ebben a példában azonban nem feltétlenül szükséges.

Ó, és nézd meg, hogy egy kicsi szemüveges lány hogyan énekel ...

Rendben, szóval ezt tesszük:
A megszakítások letiltása előtt adja hozzá:
PORTC = EIFR;
_delay_us (50);
PORTC = 0;
és a reteszelés után távolítsa el a sei () -t;
Természetesen be kell állítania a C portot a kimeneten.

Hidd el, nagyon meglepett leszel!

Amit az int0 megszakítási tilalomnak hívtál, nem más, mint - a kezelő törlése, a megszakítás, a hardver szintjén - történik.

maszk; / * rossz út! * /
A bitwise "not" operátor (

) szintén elősegíti a maszk értékét egy int-ban. Egy 8 bites érték megtartásához írja be a "no" operátor előtt:
var = (unsigned char)

és így tovább:
EICRA = _BV (ISC01) | _BV (ISC00); // TESTED_MODE_MASK;

ne, először tiltsa le a megszakításokat.

Nem értesült a cikk frissítéséről. 🙂 Most minden helyes. (körülbelül EIFR | _ _BV (INTF0)).

Valahogy mindig kapcsolódtam a megszakításokhoz az eseményekkel. Egy esemény egy változás a rendszerben. Az emelkedő front, a lefelé mutató front, minden változás a rendszerben. Ez azt jelenti, hogy ezek az események. Tehát beilleszkednek a megszakítási paradigmába. Minden logikus. És ha semmi sem változik a rendszerben, akkor hol van az esemény? Minden élet egy nullás szint alatt - ez nem egy esemény, ez változatlan állapot. A változatlan állapotra való reagálás valahogy hülyeség, és úgy néz ki, mint a hozzá nem értés. Ezért nem értem a megszakítások jelentését. Nézetem szerint ez valamiféle "anahrenizmus". Azt gondolom, hogy az AVR-vezérlők fejlesztői is nehézséget okoztak az első mikrokontrollerekben, hogy kiváltsák a portok bemeneteit, amelyek "felfegyverkeztek" az eseményen.

Igen, úgy tűnik, ez valóban nem egy jó életből származik. De egyébként, ahogy ismét rám támadt az Rtmip. A mega8-ban például nincs PCINT. Ezért az egyetlen mód kívülről, hogy ébressze fel az MK-t, mivel alvás állapotban van, olyan furcsa megszakítás vagy rendszer-visszaállítás.

EIFR | = _BV (INTF0); // Zászló törlése