[elektro] Használtok valami free RTOS-t PIC-hez?
Moravcsik Szilárd
mszilard at contarex.hu
Fri Mar 30 09:03:06 CEST 2012
2012.03.29. 19:17 keltezéssel, Skandar Graun írta:
> Ezt én assemblyben írnám, egy timer0 IT-vel.
> Vagy, ha sietek, basic.
> Egy RTOS erre kissé ágyúval verébre kategória nekem.
>
Szia!
Nálam a gombok portbemenetei általában a port belső felhúzó ellenállásán
keresztül vannak a VCC-re kötve. Ehhez kapcsolódik a gomb egyik fele, a
másik fele pedig a GND-re. Tehát a gomb megnyomva 0-át ad, elengedve 1-et.
A gombokat pl. 50 ms-enként kérdezem le (már csak a prel kiküszöbölés
miatt is), ez egy #define konstans is lehet.
Minden gomb minimum 2 biten tarolja az állapotát.
Az állapotot tároló változó RESET után a 11b bin. értékre inicializált
(azaz mintha a gomb nem lenne megnyomva).
Minden gomblekérdezéskor beolvasódik a gomb tényleges állapota (ez egy bit).
A gomb aktuális logikai állapotát tároló 2 bites változó tartalma eggyel
balra shiftelődik. Az alsó bit helyére beíródik a gomb éppen beolvasott
értéke. Így a gombok kezeléséhez az alábbi állapotokat szoktam használni:
11 - felengedve, nyugvó állapot (FENN)
10 - éppen lenyomva, lefutó él (LE)
00 - lenyomott, nyugvó állapot (LENN)
01 - éppen felengedve, felfutó él (FEL)
Minden gombhoz tartozik egy előző logikai állapotot is rögzítő változó,
ami kezdetben szintén 11b-re van inicializálva (FENN).
Ha az éppen aktualizált és az előző logikai gombállapot nem azonos,
akkor egy logikai változó HAMIS-ról IGAZ-ra változik. Ezt azután a
gombot kezelő egyéb magasabb szintű függvényekben kell majd törölni.
Minden állapot aktualizálás után után a gombkezelő megvizsgálja, hogy az
adott gombhoz kell-e hosszan (pl. > 5s) lenyomott állapotot is figyelni.
Ha igen, akkor amíg a gomb állapota LENN, minden lekérdezéskor egy
gombhoz rendelt timer változó előre feltöltött értéke eggyel csökken (ez
pl. 50ms-es lépésekben történik). Ha ez az érték (pl. 100) eléri a
nullát, egy szintén a gombhoz rendelt logikai változó HAMIS-ról IGAZ-ra
vált, jelezve, hogy a gombot már hosszú ideje nyomják. Ha a gombot
felengedik, akkor a jelző törlődik (itt, a lekérdező, vagy a feldolgozó
rutinban), a timer ismét felveszi a kezdeti értékét, stb.
Ha a gombismétlés is engedélyezve van, akkor ha a gomb már hosszan
lenyomott állapotú, egy újabb gombhoz rendelt timerrel lehet kezelni az
ismétléseket, stb.
CvAVR-ben, ATmega2561-en, ahol van SRAM bőven, pl. ilyen struktúrát
szoktam használni:
typedef unsigned char BYTE;
typedef unsigned int WORD;
// Tasztatúra gomb struktúrája:
typedef struct{
char enabled; // TRUE, ha gomb kezelés mehet
char prev_state; // Gomb előző állapota
char act_state; // Gomb aktuális állapota
char lng; // TRUE, ha gombot hosszan
megnyom.
WORD lng_tmr; // Hosszú gombnyomás időzítője
char rep_en; // TRUE, ha repeat mehet
WORD rep_tmr; // Repeat időzítője
char changed; // TRUE, ha állapot
változott
} BTN_t;
// Tasztatúra gombok struktúra tömbje:
typedef struct{
char enabled; // TRUE, ha gombok kezelése
mehet
char go; // TRUE, ha gombok
lekérdezése mehet
BYTE pol_tmr; // Polling időzítője
BTN_t btn[ NUM_OF_BTNS ]; // Gombok tömbje
} BTNS_t;
extern BTNS_t btns; // Taszti gombok (main.c)
//-----------------------------------------------------------------------------
// Tasztatúra gombok lekérdezése:
void scan_btns(void);
Bocs, ha túl hosszú lett. :)
Üdv:
Szilárd
> Elight<elight at gmail.hu> írta (2012. március 29. 9:32):
>> Sziasztok,
>>
>> valamiféle nyomogombos időzítőhalmazt lenne jó
>> hamarjában applikálnom.
>>
>> Nem tudom pl egy free RTOS bigyó megtanulása
>> könnyítené e a dolgomat.
>> Elsőre túl bonyinak találatott.
>>
>> Tulajdonképpen arra gondolok,
>> egy interruptos KEY kezelő
>> méretre szabása is kielégítő lehetne..
>>
>> Olyasmi pl mint ami a dos-os PC-é volt, van ..
>> Tehát külön kód gomb megnyomásra, és elengedésre,
>> repeat , állítható attack-al
>> getkey() ; és input();
>> Tizes bill szerűnek gondolnám,
>> de az se baj ha skálázható
>> lefele. (három - négy gombosra)
>>
>> Szóval nem is vagyok nagyigényű
>> csak ma valahogy inkább 'kissé' lusta? :)
>>
>> De gondoltam nem árt előtte körülnézni,
>> mielőtt még feltalálnám a spanyolvizet,
>> vagy felesleges körökbe kergetném magam..
>>
>> Üdv István
>>
>> -----------------------------------------
>> elektro[-flame|-etc]
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list