Poslední změna: čtvrtek 2. října 2008
Napište program v jazyce C , který :
implementuje obsluhu klávesnice
na LCD displeji se průběžně zobrazuje posloupnost číslic (0-9) náležících číselním klávesám, které uživatel postupně stisknul ( 4 body )
po delším stisknutí klávesy se číslice opakovaně zobrazí (1 body)
ošetření zákmitů ( 4 body )
umožňuje editaci dekadického čísla na připojeném řádkovém displeji
musí podporovat zadávaní alespoň 5 maximálně 9 místního čísla ( 4 body )
je zadefinována libovolná volná klávesa jako funkční klávesa ODESLAT, po jejím stisknutí se ve druhém řádku displeje objeví správa ODESLANO ( 2 body )
je zadefinována libovolná volná klávesa jako funkční klávesa SMAŽ, po jejímž stisknutí se zmaže poslední číslice zadaného čísla ( 1 body )
spustí zvukovou signalizaci po zadaném čase (budík)
po stlačení klávesy ODESLANO se spustí časovač - jeho počáteční hodnota je zadané číslo a dekrementuje se po 1ms ( 5 bodů )
Krátká zvuková signalizace (max. 2 sekundový beep) se spustí, když časovač vyprší; pak uživatel může zadávat další číslo (1 body )
(Pro ty, kteří po přečtení zadání vůbec nevědí o co jde: Jednodušeno řečeno, udělejte obsluhu pro zadávaní čísel z klávesnice podobna jakou mají mobilní telefony nebo kalkulačka. :-) )
Maximálně může být úloha ohodnocena 21 body. Při hodnocení však bude brán zřetel i na kvalitu implementace.
Napište část programu - kód, který detekuje jedinou klávesu, která byla stisknuta.
Detekce klávesy se provádí pomocí řádkového (R) a sloupcového (C) registru klávesnice.
Nastavte první bit řádkového registru (R1) na 0, ostatní bity jsou 1.
Přečtěte sloupcový registr (C) a zjistěte, který bit sloupcového registru je 0.
Pokud žádný bit sloupcového registru není 0, pak žádná klávesa v příslušném řádku nebyla stisknuta. Pokračujte od bodu 1 ale tentokrát nastavte následující bit řádkového registru.
V opačném případě, dvojice nulových bitů (Rx, Cy) identifikují stisknutou klávesu ( viz. (R1, C1) v případě stisknuté klávesy A na obrázku výše)
Oba registry jsou 8 bitové. 7.bit řádkového registru zapíná (hodnota 1)/ vypíná (hodnota 0) zvukovou signalizaci.
Registry mikrokontroléru jsou namapovány do paměti , tzn. že lze k nim přistupovat zápisem do/čtením z jejich paměťových adres.
Řádkový registr je mapován na adresu 0xf89003. Zápis do registru:
*(volatile uint8_t * const) (0xf89003) = radek;
Pro usnadnění je k dispozici zadefinované makro (omk-base-skel/board/m68k/mo_cpu1/defines/system_def.h):
#define KL41_KBD_WR (volatile uint8_t * const)(0xf89003)
Pak zápis bude vypadat:
*KL41_KBD_WR = radek;
Pro nastaveni 0. bitu řádkového registru radek= 0x7E. Pro zapnutí zvukové signalizaci radek = 0x80.
Sloupcový registr je mapován na adresu 0xf89004. Obdobně je zadefinováno makro pro přístup:
#define KL41_KBD_RD (volatile uint8_t * const)(0xf89004)
Pak čtení registru bude vypadat:
sloupec = *KL41_KBD_RD;
Přiřaďte dvojicím (Rx,Cy) číselný (1,5,6, ...) nebo funkční význam (SMAŽ, ODESLAT).
Upozornění: Matice je rozměru 6x6. Ovšem fyzické rozložení kláves nezodpovídá logickému rozložení t.j. např. klávese v levém hornim rohu nemusí odpovídat 1. bit řádkového, 1.bit sloupcového registru!
Nastavení kurzoru LCD na pozici x:
kl41_lcd_wrcmd(CHMOD_LCD_POS+x);
kde
x
je z <0x00, 0x7F>.Druhý řádek začíná na pozici 0x40.
Časovač
Pro zajištění časování činností aplikace je výhodné použít periodická aktivace časovací rutiny z přerušení. K tomuto účelu se nejlépe z dostupných periferií integrovaných na mikrokontroléru m68376 hodí modul čítačů a časovačů CTM4. Tento modul nabízí dvě časové základny s nastavitelnou periodou, jednu volně běžící časovou základnu, čtyři bloky pro generování nebo měření časových průběhů a čtyři generátory PWM. Pro vyvolání periodického přerušení se nejlépe hodí jedna z časových základen/čítačů s nastavitelnou periodou, například základna MCSM2. Procesor standardně běží na frekvenci 21 MHz. Frekvenci, kterou nastaví inicializace modulu SIM zároveň ukládá do proměnné
cpu_sys_hz
.Pro pochopení problematiky je nutné si přečíst alespoň úvod a MCSM sekci v oddílu Configurable Timer Module 4 (CTM4) v manuálu k MC68376. Význam bitů jednotlivých registrů najdete zde. Definice maker jsou obsaženy v souboru ctm4.h .
Nastavení modulu CTM4
Pro to, aby bylo možné modul čítačů používat, je nutné nejdříve provést obecné nastavení jeho připojení na vnitřní sběrnici.
/* BIUMCR - BIU Module Configuration Register */ *CTM4_BIUMCR=(0*CTM4_STOP)|(CTM4_VECT&(ISR_CTM4_INTV<<5))| (CTM4_IARB&(ISR_CTM4_IARB<<8));
Toto nastavení zajistí, že blok CTM4 bude generovat přerušení od základní hodnoty dané definicí ISR_CTM4_INTV, která je nastavena na 0x80.
Dále je potřeba nakonfigurovat předděliče a povolit vstup hodinového signálu.
/* CPCR - CPSM Control Register */ *CTM4_CPCR=CTM4_PRUN|(0*CTM4_DIV23)|(CTM4_PSEL&0);
Jakou hodnotou je dělena vstupní hodnota (cpu_sys_hz) hodinového signálu?
Nastavení časovače MCSM2
Pro běh čítače MSCM2 je potřeba nastavit délku periody s využitím registru CTM4_MCSM2ML a požadovaný režim činnosti v registru CTM4_MCSM2SIC. Po uplynutí periody pak bude nastavován příznak CTM4_MCSM_COF.
Jak nastavit registr CTM4_MCSM2ML? Indicie:
Co se stane, když čítač přeteče?
Do čítače je přiveden hodinový signál z předděliče.
Chci, aby obslužná rutina časovače byla volána po 1ms.
Jak nastavit registr CTM4_MCSM2SIC? Indicie:
pro daný případ stačí nastavit bitové položky IL[2:0] a CLK[2:0]
Zaregistrování obslužné rutiny přerušení časovače
Pokaždé když časovač vyprší vyvolá přerušení procesoru. Procesor následně z tabulky adres obsluh přerušení (nebo-li tabulka vektorů přerušení) zjistí adresu obslužné rutiny přerušení, kterou pak zavolá. Proto je nutné po inicializaci časovače zaregistrovat obslužní rutinu přerušení.
Obslužní rutina přerušení (ISR - interrupt service routine) má následovní prototyp:
void example_isr(int intno, void *dev_id, struct pt_regs *regs)
Registraci můžete jednoduše provést voláním funkce add_irq_handler(MSCM2_INTV,&example_handler).
Prvním parametrem funkce je číslo vektoru přerušení MCSM(index do tabulky vektorů přerušení).
Jak zjistíte hodnotu MSCM2_INTV? Indicie:
Jaký má význam ISR_CTM4_INTV?
Podívejte se na tabulku 10-7 v CTM4.
Druhým parametrem je odkaz na registrační záznam obsluhy přerušení:
irq_handler_t example_handler={ handler: example_isr, flags: 0, dev_id: 0, devname: "example", next: 0 };
Úseku kódu je možno ochránit před přerušením následovně:
unsigned long flags; save_and_cli(flags); /* Chráněná sekce kódu */ restore_flags(flags)
Definice maker a prototypů funkcí jsou obsaženy v souboru cpu_def.h .
Obslužní rutina přerušení
Je nutné resetovat příznak daného přerušení, jinak bude obslužní rutina cyklicky volaná.
*CTM4_MCSM2SIC&=~CTM4_MCSM_COF;
Za předpokladu správného nastavení časovače, je přerušení periodicky voláno po každé milisekundě a inkrementuje se čítač milisekund, který je zadefinován jako globální proměnná přístupná v celé aplikaci.
msec_time++;
simple-led
Jednoduchá alikace, která rozsvicuje LEDky na desce. Můžete si ji stahnout zde.
omk-base-skel
Aplikace založená na OMK pravidlech (viz.OCERA Make System). (ve formáte .tar.gz)
Zdrojový strom obsahuje potřebné knihovny pro inicializaci desky MO_CPU1/2 a směrování výpisů na sériový port procesoru.
Kompletní kompilace (aplikace, knihovna, atd.) :
cd omk-base-skel make
Nahrání aplikace base_skel do modulu :
cd omk-base-skel/app/base_skel make load
Jenom kompilace base_skel :
cd omk-base-skel/app/base_skel make
Kompilace a nahrání base_skel :
cd omk-base-skel/app/base_skel make all load
Spuštění debuggeru :
ddd68
Popis adresářové struktury :
. |-- app # kód aplikací | |-- base_skel # zakladní aplikace, ze které budete vycházet | `-- mo_flashbb # podpora startu z paměti flash |-- arch # kód specifický pro architektury | |-- generic # obecný kod | `-- m68k # kód pro procesorovú rodinu m68k | |-- generic # obecný kod | | |-- defines # hlavičkové soubory | | |-- drivers # ovladače | | | `-- periph # periferie | | `-- libs # pomocná knihovna | | |-- boot | | |-- gdbstub | | `-- misc | `-- mach-68376 # kód specifický pro mikrokontroler 68376 | |-- defines | |-- drivers | `-- libs |-- board # kód pro desku | `-- m68k # architektura m68k | `-- mo_cpu1 # kód konkretne pro desku mo_cpu1 | |-- defines | `-- libs |-- doc |-- drivers # ovladače, které nejsou specifické pro daný mikrokontroler | `-- periph |-- libs4c # knihovna pro psaní programů v C | |-- flashlib | |-- misc | `-- ulut `-- rs_test
mo_cpu2-rtems-skel
Aplikace založené na exekutivě RTEMS a OMK pravidlech (viz.OCERA Make System). (ve formáte .tar.gz)
Základ vývojového stromu obsahuje pravidla a nastavení pro kompilaci kódu pro cílovou platformu m68k-rtems (elf), příklad vytvoření knihovny (libbar) a základy pro tvorbu aplikací
appfoo
minimální aplikace pro klasické RTEMS API využívající knihovnu libbar
appposix
minimální aplikace pro POSIXové API
apptest
příklad aplikace pro otestování komunikačního modulu TouCAN
Kompletní dokumentaci OMK pravidel naleznete na domovské stránce projektu.
Všechny připomínky k předmětu, obsahu stránek, objevené chyby v ukázkových programech apod. adresujte na autory:
- pisa (at) cmp.felk.cvut.cz
- molnam1 (at) fel.cvut.cz