[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