Návrh a vývoj LCD Textového terminálu, implementujúci VT100 sekvencie, nasadeného do systému Linux.
Doporučené preštudovať: Oživenie LCD | Prenosy | USB | Simulácia RS-232 PC(Master) - MCU(Slave)
V tejto časti si postavíme plne funkčné zariadenie LCD textového terminálu bežiaceho pod systémom Linux - Debian
Doporučený software pri vývoji: >> Terminal Software << | >> USB Software <<
Pred samotným návrhom čo-to o termináloch popíšem
Popis textových terminálov
Textové terminály sú zariadenia, ktoré poskytujú vzdialené užívateľské rozhrania. Prvé textové terminály vznikli ako jednoduché zariadenia pozostávajúce z dvoch častí : klávesnice a monitora. Používali sa ako súčasť sálových počítačov, ktoré neboli prenosné a nachádzali sa v uzavretých miestnostiach, na ktorých bežali programy. Odoslaný znak z klávesnice sa vyhodnotil ako vstup do programu bežiaceho na sálovom počítači. Ak program znak rozpoznal, odoslal ho naspäť programátorovi do monitora. Komunikácia prebiehala pomocou sériovej linky, prípadne modemu. Textové terminály vznikli ako požiadavka na vzdialenú obsluhu sálových počítačov a používajú sa dodnes. Terminály používajú štandard VT100 a jeho nadstavby.
Princíp dnešných textových terminálov sa nezmenil. Dnešné textové terminály obsahujú grafický interface, ktorými sú rôzne typy LCD displejov. Súčasťou dnešných terminálov je procesorová jednotka MCU unit obsluhujúca rôzne grafické interfaces, tak ako aj spracovanie vstupne/výstupných dát. Oproti minulosti, dnešné terminály dokážu ponúkať riešenie potrieb aj ako samostatná jednotka bez nutnosti implementácie vstupného zariadenia (klávesnice). Takéto terminály sa používajú ako informačné a prípadnú postrádateľnosť klávesnice terminálu nahradzuje klávesnica počítača.
Textové terminály komunikujú prostredníctvom :
• Sériového rozhrania:
– RS232
– RS485
– RS422
• Paralelného rozhrania:
– Terminály APT130 pre riadiace systémy:
∗ AMiRiS99
∗ AMAP99
Princíp činnosti textových terminálov
Textové terminály ako štandardizovaný celok komunikujú cez rozhranie pripojené k zariadeniu v roli master (host) prostredníctvom znakovej sady ASCII.
V našom prípade je hosťujúcim zariadením počítač. Znakové sady reprezentujú jednotlivé znaky ako hodnotu v dvojkovej sústave, podľa ASCII tabuľky.
• Terminály s klávesnicou Procesorová jednotka príjme znaky z klávesnice, odošle ich cez rozhranie hostu (počítači),
obslužný program (napr. virtuálny terminál) ich spracuje a odošle naspäť procesorovej jednotke.
• Terminály bez klávesnice Terminál komunikuje priamo s hostom. Obslužný program mu prostredníctvom rozhrania
odosiela dáta taktiež v dvojkovej sústave.
MCU textového terminálu má svoje štandardy uložené v pamäti.
Po prijatí dát MCU prijaté znaky porovná so svojím štandardom. Pokiaľ sa jedná o riadiace znaky, MCU ich spracuje podľa štandardov VT100, VT200,.. a vykoná definovanú funkcionalitu v závislosti od typu terminálu. Terminály sú schopné komunikovať s hostom obojsmerne.
Komunikácia textových terminálov
Prenos dát HOST ←→ Terminál
Najčastejším prenosom je sériový prenos realizovaný:
1 RS-232
2 RS-485
3 RS-422
Viac k prenosom v kapitole : Prenosy
Druhy textových terminálov
Terminály, v rámci aplikovania pod OS (v našom prípade LINUX) sa môžu správať ako externé "monitory" alebo ako simulácia softwarového terminálu.
V prvom prípade sa na zobrazovacom periférií zobrazuje to isté čo v softwarovom terminály - celý obsah terminalového okna je presmerovaný na výstup.
V praxi by bol na LCD výpis rovnaký ako v okne Linux terminála:
V druhom prípade je do LCD terminálu odosielaný obsah vstupu, ktorý terminál podľa štandardu upraví - naformátuje a vypíše na zobrazovacie periférium.
Pre naše zariadenie som použil tento druh terminálU a preto ho podrobnejšie popíšem.ˇ
Chovanie nášho, budúceho terminálu ukážem na príklade dvoch terminálových okien u ktorých presmerujeme zobrazenie textu z prvého do druhého. LCD terminál bude vykonávať úlohu toho "druhého", teraz len programového, terminálového okna.
1. Otvoríme prvý terminál pod oprávnením roota.
2. Do terminálu napíšeme príkaz ls /dev/pts
3. Zobrazí sa označenie všetkých, aktuálne spustených pseudo-terminálov.
4. Spustíme nové, terminálové okno .
5. Opakujeme krok 2., pričom nám do zoznamu pribudne číslo nášho, novo otvoreného okna, napríklad, označenie 3
6. Budeme pracovať s týmto označením ako napr., /dev/pts/3
7. Do prvého spusteného terminálu napíšte:
echo -e "\n\n\ndiallix.net\t---\tHomemade\fText\fTerminal" >>/dev/pts/3
Výpis v druhom (vrchnom) terminálovom okne bude:
Pri našom vyrobenom terminály budeme mať na LCD:
Štandardy terminálov & moje použité štandardy
Štandardy ako také pozostávajú zo sady dohodnutých znakov, ktoré zariadenia používajú pre svoju kompatibilitu s inými zariadeniami. Zavedením štandardov sa vybudovala jednotná komunikácia a funkcionalita pre zariadenia, ktoré štandardy používajú. Štandardy sú reprezentované v podobe binárnej sústavy. Pokiaľ znak vyhovuje, tak je prepustený na ďalšie spracovanie prípadne sa vykoná implementovaná funkcionalita pridelená práve tomuto znaku ako súčasti štandardu. Pokiaľ znak nevyhovuje danej tabuľke štandardu, zahodí sa. Podľa druhu terminálu a toho akú výstupú zobrazovaciu jednotku implementuje sa odvíja štandard, ktorý musí pre dané zobrazenie na LCD a funkčnosť zodpovedať. Textové terminály majú implementovaných väčšinou viacero štandardov.
Znakový štandard
ASCII
Riadiace štandardy VT
VT05
VT50, VT52, VT55, VT62
VT100, VT101, VT102, VT103, VT105, VT110, VT125, VT131, VT132
VT200, VT220, VT240, VT241
VT300, VT320, VT330, VT340
VT420
VT500, VT510, VT520, VT525
VT LAN40
ASCII
ASCII obsahuje aj riadiace znaky. Zoznam implementovaných ASCII riadiacich inštrukcií použitých vo výslednom zariadení.
Sekvencia BELL sa v termináloch používa pre vyvolanie upozornenia prostredníctvom buzzeru (piezo meniča). V práci je sekvencia BELL implementovaná na uspatie/vypnutie LCD bez stráty údajov.
Sekvencia BS nahradí posledný znak prvého textu prvým znakom druhého textu:
echo -e „Hello\bWorld“ → „HellWorld“
Sekvencia HT posunie kurzor na ďalšiu tabulátorovú pozíciu:
echo -e „Hello\tWorld“ → „Hello World“
Sekvencia LF posunie kurzor na nový riadok. Ak je riadok zaplnený, tak ho vyčistí.
Sekvencia FF stránkový posun:
echo -e „Hello\fWorld“ → „Hello
World“
Sekvencia CR posunie kurzor na začiatok riadku:
echo -e „Hello\rIla“ → „Ilalo“
VT 100 štandard
Počet riadiacích inštrukcií štandardu VT100 je mnoho. Pri implementácií som zvolil najpoužívanejšie a najužitočnejšie riadiace sekvencie pre prácu s textom na LCD. Zoznam implementovaných VT100 escape sekvencií, ktoré sú použité vo výslednom zariadení:
• <ESC>[1J - zruší text na všetkých riadkoch pred aktuálnym riadkom.
• <ESC>[2J - vyčistí text zo všetkých riadkoch.
• <ESC>[7h - povolí automatické zalomenie do nového riadku v prípade, že sa text do jedného nezmestí.
• <ESC>[7l - zruší automatické zalomenie do nového riadku. Text pretečie po 16. pozícií.
• <ESC>[{R};{C}f - premiestni text na zvolený riadok R a zvolený stĺpec C.
Ak číslo -riadok/stĺpec sú mimo rozsah, kurzor sa nastaví na posledný riadok a poslednú pozíciu.
• <ESC>[5m - povolí blikanie kurzoru.
• <ESC>E - presunie kurzor do nového riadku. Na poslednom riadku skroluje do prvého.
• <ESC>c - resetuje všetky zmeny nastavené sekvenciami na defaultné hodnoty.
• <ESC>[C - posunie kurzor o jednu pozíciu vpred.
• <ESC>[H - nastaví kurzor na domovskú pozíciu - prvý riadok, nultá pozícia.
• <ESC>[?25l - zobrazí kurzor
• <ESC>[?25h - vypne kurzor
Použitý Display
Je použitý display z článku : Oživenie LCD
Spôsob zapojenia zberníc:
Prenos Dát
Na obrázku je modifikované príjímanie dát upraveného firmware pre náš druh MCU:
Princíp mnov upravenej implementácie firmware pre MCU PIC24FJ64GB002 je
v článku: >> Connecting - Simulation RS-232 <<
Princíp vetvenia dát je na diagrame aktivit:
Spracovanie Dát
Implementácia spracovania vstupných dát závisí od faktu čo najúspornejšieho prístupu a porovnávania.
Je nutné si uvedomiť, že píšeme automat slov. Každá sekvencia je v podstate vstup, ktorá má aspň jeden výstup.
V opačnom prípade o hľadanú sekvenciu nejde.
Je jasné, že ide o Deterministický Konečný Automat.
Pre hľadanú sekvenciu <ESC>[1J navrhnem DKA:
––––––––––––––––––––––––––––––––––––––––––––
Q = {1, 2, 3, 4, 5}
Ʃ1 = {ESC, [, 1, J}
Ʃ2 = {0x1B, 0x5B, 0x31, 0x4A}
q0 = 1
F = {1, 5}
L(A) = {w ∈ Ʃ1* | w = ESC[1J Ʌ w != ESC}
––––––––––––––––––––––––––––––––––––––––––––
f ∈ F
f1 (1) = vypíše znaky na LCD
f2 (5) = zmaže LCD od riadka nahor
Navrhnutý DKA na obrázkov príjíma jazyk L(A).
Vidíme, že nami vybraná sekvencia končí \e[1J v koncovom stave 5.
Ostatné nepodporované sekvencie končia v koncovom stave 1 ktorý je zároveň aj príjímací.
Všimnime si, že znak reprezentujúci ESC nikdy neskončí samostatne v koncovom stav 1 a nikdy nebude na LCD vypísaný.
Návrh zariadenia
Schéma zapojenia LCD terminálu je na obrázku: SCHÉMA_1
Schéma zapojenia zdroju pre LCD terminál je na obrázku: SCHÉMA_2
Riadiaca jednotka U1 je pinmi 2, 3 ako PGED3/PGEC3 pripojená na ISP rozhranie. PGED sa využíva ako dátový vstup/výstup, PGEC ako vstupný hodinový impulz Clock programátora. Reset MCU MLRC je na rozhranie ISP privedené ako VPP. Napájanie ISP je pripojené na lokálne napájanie VDD2. Tlačidlo BTN1 je pripojené k MCLR procesora ako reset privedené ku GND rezistorom R1. Na odpore R1 vznikne úbytok napätia a zabráni sa poškodeniu programátora. Rezistor R3 je zapojený ako pull-down rezistor na udržanie log. 0 na porte MCLR. Ako filtračný člen medzi VDD2 a GND je použitý kondenzátor C1. Dátové vodiče USB rozhrania D+ a D- sú privedené na I/O procesora RB10/RB11.
Procesor U1 má na týchto portoch implementované vnútorné pull-down rezistory, preto ďalšie použitie pull-down rezistorov nie je potrebné.
Displej LCD1 je pripojený pomocou dátovej zbernice na dátových vstupov D0 - D7 k I/O portom procesora RB1, RB2, RB3, RB7, RB8, RB9, RB13, RB14. Na dátovej zbernici sú použité pull-down rezistory na udržanie napäťovej úrovne log. 0 pri stave neaktivity, v podobe rezistorového poľa RP1. Riadiace vstupy LCD1 RS, E sú pripojené na I/O porty procesora RA0, RA2. Riadiaci pin R/W, môžeme pripojiť na GND, nakoľko pri zápise dát na LCD musí byť na ňom log. 0 a čítanie z LCD nevyžadujeme. Riadiace piny E, RS sú pomocou rezistorov R2, R4 privedené na GND na udržanie log. 0 pri neaktivite. Trimrom RV1, pripojeného medzi GND a VEE LCD1, regulujeme úroveň jasu displeja. Signalizačná dioda D1 je pripojená na port procesora RB0. Piny 8, 27 procesora U1 sú pripojené na GND, piny 28, 13 k napájaciemu napätiu VDD2. LCD1 je pripojený k napätiu VDD1 5 V.
Zdroj LCD terminálu, schéma 2, je tvorený dvomi stabilizačnými modulmi Q1 a Q2, ktoré sú zapojené do série. Vstupné napájacie napätie stabilizátor Q1 ustabilizuje na VDD1 5V, ktoré je použité na napájanie LCD1. Stabilizátor Q2 ustabilizuje napätie VDD1 na napätie VDD2 2V, ktoré napája procesorovú jednotku. Kondenzátory C2, C3 sú zapojené ako filtračné prvky napätí VDD1 a VDD2. Signalizačná dioda D2 je v sérii s rezistorom R5 zapojená paralelne medzi VDD1 a GND. Ako zdroj napájania je použitý spínavý zdroj 5.9V, 375mA.
Zoznam súčiastok
Downloads
Firmware 1
---------------------------------------------------------------------
Názov programu: RS-232_Terminal_1
Autor: Diallix
Posledná revízia: 1.9. 2018
Jazyk: C
Licencia: trial
! Trial verzia umožňuje zobrazenie len 10 znakov naraz !
V prípade záujmu full verzie posielam naprogramovaný procesor dobierkou.
Cena dobierky je 600 kč + poštovné a balné. V prípade samotného firmwaru, bez procesora, je cena 480kč.
Firmware je naprogramovaný pre novší LCD (MC21605A6WD-BNMLW) - Online obchod a pre LCD s LCM HD44780 - Online obchod
---------------------------------------------------------------------
Oživenie zariadenia
Po zrealizovaní zapojenia napojíme LCD terminál na zdroj el. napätia. V prípade, že displej nereaguje, nastavíme mu trimrom RV1 požadovanú hodnotu jasu. Na ISP konektor pripojíme programátor Presto, ktorým mcu naprogramujeme. Po úspešnom naprogramovaní sa mcu resetuje. Pri štarte programu v mcu sa všetky moduly a periféria inicializujú. Pri správnom inite signalizačná dioda D1 raz blikne. Pokiaľ došlo k chybe inicializácie LCD, D1 dva krát na 1s blikne. Ak došlo k nesprávnemu inicializovaniu USB rozhrania, D1 blikne tri krát. Pri inite sa na LCD vypisujú názvy modulov, ktoré sa aktuálne inicializujú spolu s informáciou o stave inicializovania. Po načítaní všetkých modulov, mcu vypíše na LCD blikajúcu správu „READY“ po ktorej je možné pripojiť zariadenie do USB. Pokiaľ je zariadenie z USB odpojené, na displej sa vypíše „PC - Odpojeny !“. Po zapojení zariadenia do USB sa na displej vypíše správa „PC - Pripojeny !“ a po necelej sekunde sa obsah displeja vyčistí. Pokiaľ je terminál zapojený a pripravený prímať dáta, signalizačná D1 bliká.
Nasadenie do systému LINUX
Terminál bol nasadený a testovaný pod operačným systémom DEBIAN.
Pokiaľ používame systém DEBIAN z virtuálneho prostredia (Virtual BoX), musíme terminál pripojiť do USB rozhrania:
Zariadenie sa po pripojení do USB správa ako zariadenie pripojené prostredníctvom RS-232 a pod systémom DEBIAN je viditeľné ako /dev/ttyACM0 .
Vylistovanie pripojeného zariadenia urobíme príkazom : dmesg | grep tty .
Vo výpise sa objaví „cdc_acm 2-2.2 :1.0: ttyACM0: USB ACM device“ .
Ďalšie vylistovanie (zobrazenie) pripojeného zariadenia môžeme vykonať prostredníctvom scriptu:
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do ( syspath="${sysdevpath%/dev}" devname="$(udevadm info -q name -p $syspath)" [[ "$devname" == "bus/"* ]] && continue eval "$(udevadm info -q property --export -p $syspath)" [[ -z "$ID_SERIAL" ]] && continue echo "/dev/$devname - $ID_SERIAL" ) done |
Vo výsledku sa nám zobrazí výpis:
Po pripojení není nutné terminál konfigurovať v „ /etc/inittab“
Po pripojení stačí odoslať dáta prostredníctvom terminálu v DEBIANE.
Napríklad:
echo -e ’Ahoj ’ > /dev/ttyACM0
echo -e ’AhojSvet\rCau’ > /dev/ttyACM0 echo -e ’\e[1;8fAhoj ’ >/dev/ttyACM0 |
Program na zobrazenie zaťaženia RAM a CPU
Aby sme simulovali ďalšie využitie, napíšem program v jazyku Bash, ktorý na LCD bude vypisovať zaťaženie RAM alebo zaťaženie CPU počítača.
Výsledky budú transformované ako percentá + program bude vypisovať v prvom riadku hodiny.
Program 1
---------------------------------------------------------------------
Názov programu: time
Autor: Diallix
Posledná revízia: 21.8 2014
Jazyk: Bash
Licencia: freeware
---------------------------------------------------------------------
Program 2
---------------------------------------------------------------------
Názov programu: time2
Autor: Diallix
Posledná revízia: 22.8 2018
Jazyk: Bash
Licencia: freeware
---------------------------------------------------------------------
Stiahnite súbor v Debiane a uložte ho do zložky vášho konta pod adresárom "home", napríklad : "/home/diallix"
Do terminálu (pod rootom) napíšte a po jednom odentrujte tieto príkazy:
cd /home/<adresar_s_nazvom_tvojho_uziv_konta>
touch time chmod +x time |
Po pripojení terminálu program spustite píkazom na zobrazenie zaťaženia RAM:
./time start_ram
|
Pre zobrazenie zaťaženie CPU, použite príkaz:
./time start_cpu
|
Obrázok terminálu: