Obsluha klávesnice


Poslední změna: čtvrtek 2. října 2008

1. Zadání

Napište program v jazyce C , který :

  1. 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 )

  2. 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 )

  3. 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.

2. Nápověda

  • 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.

      Obrázek 1.


      1. Nastavte první bit řádkového registru (R1) na 0, ostatní bity jsou 1.

      2. Přečtěte sloupcový registr (C) a zjistěte, který bit sloupcového registru je 0.

      3. 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++;

3. Doplňující materiály

  • Keyboard Matrix Help

  • 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: