|
|
MPOR 2009-2010 |
Obsah cvičení |
| |
|
|
-
Ověřte správnou funkčnost aplikace FLIP dle pokynů vyučujícího. Do jednočipu nahrajte aplikaci:
q:\Vyuka\Kucera\MPOR\Programy\hello_world_4x20.hex
a vyzkoušejte ji.
-
Spusťte vývojové prostředí Keil (c:\keil\UV2\uv2.exe) a vytvořte nový projekt. K vytvořenému projektu, dle pokynů vyučujícího, přilinkujte
knihovnu pro ovládání displeje 4x20 znaků:
q:\vyuka\kucera\mpor\knihovny\display 4x20\...
a na displeji zobrazte zprávu "Hello World".
Pro inicializaci displeje a zobrazení textu na displeji použijte funkce:
void disp_init(void); /* inicializace displeje */
void printf(...); /* standardní výstup je přesměrován na displej */
-
Seznamte se na vlastním příkladě s funkcemi:
void gotoxy(unsigned char x, unsigned char y);
void clrscr(void);
z knihovny disp.lib.
-
Vytvořte program pro otestování správného zápisu a čtení z připojené externí paměti dat (oblast XDATA, viz přednáška). Rozsah testování zvolte dle velikosti připojené RAM.
Na displeji zobrazte případné chybové hlášení s výpisem adresy chybné paměťové buňky nebo status, že paměť je OK. Inspirujte se aplikací test_xram_4x20.hex.
Aby došlo k otestování celé oblasti externí RAM (XRAM), vložte do deklarační části programu definici registru:
sfr AUXR = 0x8E; /* definice registru AUXR, definice je též v atmelWM\89C51RD2.h */
a po spuštění aplikace ho nastavte na hodnotu: XXX0001X, kde X znamená, že hodnotu příslušného bitu v registru NEMĚŇTE!
|
|
|
-
Navrhněte způsob čtení stavu tří tlačítek umístěných na displeji (tlačítka jsou připojená na porty CPU P1 a P3). Naprogramujte vyhodnocení stavu tlačítek pomoci funkcí techniky maskování. Cílem je zjistit,
na kterých pinech uvedených portů jsou tlačítka připojena a jakou mají logiku. Porty P0 ... P3 jsou definovány v hlavičkovém souboru reg51.h nebo atmelWM\89C51RD2.h.
-
Vytvořte program, který bude realizovat čítač v rozsahu (-32768 až 32767), jehož stav bude zobrazován na displeji. Čítač bude ovládán třemi tlačítky umístěnými pod displejem.
Po stisknutí pravého tlačítka (reakce na úroveň) se hodnota čítače samovolně inkrementuje.
Po stisknutí levého tlačítka (reakce na úroveň) se hodnota čítače samovolně dekrementuje.
Po stisknutí prostředního tlačítka (reakce na úroveň) se čítač vynuluje.
-
Vytvořte program, který bude realizovat čítač v rozsahu (-32768 až 32767), jehož stav bude zobrazován na displeji. Čítač bude ovládán třemi tlačítky umístěnými pod displejem.
Po stisknutí pravého tlačítka (reakce na hranu) se hodnota čítače zvětší o 1.
Po stisknutí levého tlačítka (reakce na hranu) se hodnota čítače zmenší o 1.
Po stisknutí prostředního tlačítka (reakce na hranu) se čítač vynuluje.
-
Modifikujte druhý příklad z tohoto zadání tak, aby čítač pracoval v rozsahu: (-332768 až 332767)
|
|
|
-
Vytvořte funkci:
void pause(unsigned int doba);
která zastaví vykonávání programu na interval doba*5 us (cca). Využijte časovač TIMER0 procesoru bez využití přerušení.
-
Vytvořte funkci:
void pause10(unsigned int doba);
která zastaví vykonávání programu na interval doba*10 ms (cca). Využijte funkci void pause(...) z předchozího příkladu bez využití přerušení.
-
Z dokumentace přípravku a nastavení jednotlivých DIP přepínačů zjistěte bázové adresy 8-mi bitových I/O portů umístěných na rozšiřující jednotce 24 binárních vstupů a 24 binárních výstupů.
-
Vytvořte program, ve kterém bude vykonáváno periodické přerušení od časovače TIMER2 s periodou 20 ms (cca). V přerušení ovládejte pole LED připojené k některému portu jednotky binárních vstupů a výstupů. V LED poli realizujte funkci světelného hada.
-
Vytvořte aplikaci, která inicializuje sériovou linku procesoru na přenosové rychlosti 9600 baud, žádná parita, 8 datových bitů, 2 stop bity. Aplikace bude realizovat funkci loopback na sériové lince s tím, že příchozí znaky bude vypisovat na displeji. Po zaplnění celého displeje se tento automaticky smaže a začne se vypisovat od začátku. Znaky po sériové lince posílejte pomocí aplikace RealTerm.
-
Modifikujte předchozí zadání tak, aby při zaplnění displeje výpis na displeji roloval.
|
|
|
-
Vytvořte funkci pro obsluhu maticové klávesnice, která je připojena k rozšiřující jednotce 24 binárních vstupů a 24 binárních výstupů. Funkci vyzkoušejte v programu, který bude aktuálně stisknutou klávesu zobrazovat na displeji.
-
Napište program, který umožní vytvoření zprávy na displeji z maticové klávesnice. Po zaplnění displeje bude jeho obsah rolovat (využijte modifikovanou funkci pro standardní výstup ze 3. zadání).
-
Modifikujte předchozí příklad tak, aby bylo možné pomocí vámi zvolených tlačítek na klávesnici:
- Smazat obsah celého displeje
- Smazat poslední zadaný znak
- Napsat prázdný znak
- Přesunout se na nový řádek
-
Modifikujte funkci pro obsluhu maticové klávesnice tak, aby obsahovala vlastnost auto-repeat, tj. opakování stisknutého znaku s periodou 200 ms, pokud je tlačítko na klávesnici drženo déle než 1 s.
|
|
|
-
Z dokumentace displeje a přípravku zjistěte, jakým způsobem je displej připojen k procesoru a na kterých portech a adresách jsou umístěny jednotlivé signály sběrnice displeje.
-
Vytvořte základní funkce pro ovládání displeje:
void ini_dsp(void); /* inicializace displeje pomocí instrukčního registru */
void clrscr_dsp(void); /* vymazání displeje */ 4
void autoscroll_dsp(int auto); /* zapnutí/vypnutí funkce scroll při výpisu na displej */
void gotoxy_dsp(unsigned char x, unsigned char y); /* přesun kurzoru na danou pozici */
Dále předefinujte funkci pro výpis znaku na standardní vystup:
char putchar(char c);
tak, aby byl standardní výstup přesměrovaný na displej.
-
Z uvedené skupiny funkcí vytvořte vlastní verzi knihovny pro displej disp.lib.
|
|
|
-
Pro obvod PCF8574 (I2C expander), který je připojen k procesorové desce pomocí sběrnice I2C linkami:
SDA - P1.7
SCL - P1.6
vytvořte funkce pro čtení a zápis dat:
void i2c_init(void); /* inicializace pinů SDA a SCL do klidové úrovně */
void i2c_clk(void); /* vygeneruje na sběrnici jeden hodinový puls */
void i2c_start(void); /* vygeneruje na sběrnici podmínku START */
void i2c_stop(void); /* vygeneruje na zběrnici podmínku STOP */
void i2c_send_byte(unsigned char data); /* vyšle na sběrnici jeden bajt se čtením ACK */
unsigned char i2c_receive_byte(void); /* přijme ze sběrnice jeden bajt a potvrdí ACK */
unsigned char i2c_receive_last_byte(void); /* přijme ze sběrnice jeden bajt a provede NOACK */
void pcf8574_OUT(unsigned char adresa, unsigned char data); /* zapíše do obvodu PCF8574 s danou adresou jeden bajt */
unsigned char pcf8574_IN(unsigned char adresa); /* přečte z obvodu PCF8574 na dané adrese jeden bajt */
-
Vytvořené funkce použijte k zobrazování stavu přepínačů připojených pomocí rozšiřující jednotky binárních vstupů a výstupů na displeji a současně jejich stav zobrazujte na sadě diod připojených k I2C expanderu s programovatelnou adresou 0x02.
-
Vytvořené funkce použijte k zobrazování stavu přepínačů připojených přes I2C expander s programovatelnou adresou 0x00 na displeji a současně jejich stav zobrazujte na sadě diod připojených k I2C expanderu s programovatelnou adresou 0x00.
|
|
|
-
Napište program, který bude posílat číselné zprávy zadávané z maticové klávesnice po sériové lince následujícím způsobem:
-
Uživatel zadává číselnou zprávu pomocí tlačítek ('0' ... '9') přes maticovou klávesnici. Aktuální obsah zprávy se průběžně vypisuje na displej, ale jednotlivé znaky se neposílají ven po sériové lince. Zadávání bude podporovat funkci auto-repeat a obsah displeje bude po jeho zaplnění automaticky rolovat.
-
Pokud zpráva dosáhne velikosti 25-ti číslic, tak se již dál nezvětšuje; tj. program na žádné další stisknuté tlačítko '0' ... '9' nereaguje.
-
Kdykoliv obsluha během vytváření zprávy stiskne tlačítko '#', tak se celá aktuální zpráva odešle po sériové lince ven, displej se vymaže a čeká se na zadání další zprávy.
-
Kdykoliv obsluha během vytváření zprávy stiskne tlačítko '*', tak se celá doposud vytvořená zpráva smaže (i na displeji) a čeká se na zadání další zprávy.
Přenosová rychlost na sériové lince je 19200 baud. Nastavení displeje proveďte tak, že kurzor bude viditelný ('_') a bude na displeji blikat.
|
|
|
|