{"id":365,"date":"2017-07-01T21:16:31","date_gmt":"2017-07-01T20:16:31","guid":{"rendered":"https:\/\/www.pmd85.cz\/?page_id=365"},"modified":"2018-08-12T20:00:52","modified_gmt":"2018-08-12T19:00:52","slug":"limitni-casovani-procesu-pomoci-obvodu-uart","status":"publish","type":"page","link":"https:\/\/www.pmd85.cz\/?page_id=365","title":{"rendered":"Limitn\u00ed \u010dasov\u00e1n\u00ed proces\u016f pomoc\u00ed obvodu UART"},"content":{"rendered":"<p><em>pozn.: \u010cl\u00e1nek byl 10.7.2017\u00a0zm\u011bn\u011bn a dopln\u011bn o poznatky, kter\u00e9 vyplynuly z koment\u00e1\u0159\u016f k \u010dl\u00e1nku. T\u00edmto d\u011bkuji zejm\u00e9na Zde\u0148kovi za podn\u011bty a ov\u011b\u0159en\u00ed cel\u00e9 \u0159ady informac\u00ed a nalezen\u00ed chyb v p\u016fvodn\u00edm \u010dl\u00e1nku a Romanovi za informace, kter\u00e9 k dan\u00e9mu t\u00e9matu nashrom\u00e1\u017edil ji\u017e d\u00e1vno p\u0159ede mnou.<\/em><\/p>\n<p>Co si pod pojmem &#8222;limitn\u00ed \u010dasov\u00e1n\u00ed&#8220; p\u0159edstavuji? Informaci o tom, \u017ee nastaven\u00fd \u010das vypr\u0161el. Nev\u00edm sice, kolik uplynulo dal\u0161\u00edho \u010dasu, ale ten nastaven\u00fd \u010das, ten zaru\u010den\u011b vypr\u0161el. Tak\u017ee takto definuji tento pojem.<\/p>\n<p>V praxi to vypad\u00e1 tak, \u017ee zap\u00ed\u0161u libovoln\u00fd znak (bajt) do vys\u00edlac\u00edho buferu obvodu 8251 a \u010dek\u00e1m (nebo pr\u016fb\u011b\u017en\u011b testuji),\u00a0kdy UART dokon\u010d\u00ed vysl\u00e1n\u00ed tohoto znaku. Ta doba je odvisl\u00e1 od po\u010dtu vys\u00edlan\u00fdch datov\u00fdch bit\u016f (5-8), p\u0159\u00edtomnosti paritn\u00edho bitu, d\u00e9lky STOP-bitu (i kdy\u017e tady je to trochu slo\u017eit\u011bj\u0161\u00ed, viz koment\u00e1\u0159e) a n\u00e1sobku vzorkov\u00e1n\u00ed (1x\/16x\/64x). Celkem to d\u00e1v\u00e1 (p\u0159i taktov\u00e1n\u00ed 1200Hz) celou \u0159adu \u010das\u016f s rozp\u011bt\u00edm 6,7ms &#8211; 693ms.<\/p>\n<p>P\u0159esnost takov\u00e9ho \u010dasov\u00e1n\u00ed je samoz\u0159ejm\u011b z v\u00fd\u0161e uveden\u00e9ho d\u016fvodu omezen\u00e1. Z\u00e1le\u017e\u00ed tak\u00e9 na zpo\u017ed\u011bn\u00ed, kter\u00e9 n\u00e1sledn\u011b\u00a0zp\u016fsob\u00ed m\u016fj program, kter\u00fd neum\u00ed s \u010dasova\u010dem regul\u00e9rn\u011b pracovat a &#8222;ignoruje&#8220; jeho informace.\u00a0Pro synchronizaci nap\u0159\u00edklad r\u00e1mce hry \u010di intervalu n\u011bjak\u00e9 signalizace to v\u0161ak bohat\u011b sta\u010d\u00ed. Prozat\u00edm v\u0161echny m\u00e9 hry mimo Arkanoid takov\u00e9 \u010dasov\u00e1n\u00ed pou\u017e\u00edvaj\u00ed. Arkanoid ale d\u011bl\u00e1 to sam\u00e9, pou\u017e\u00edv\u00e1 v\u0161ak pouze \u010dasova\u010d 8253, kter\u00fd testuje softwarov\u011b.<\/p>\n<p>A nyn\u00ed k v\u011bci. N\u00ed\u017ee uveden\u00fd v\u00fdpis programu v assembleru ukazuje p\u0159\u00edklad, jak odm\u011b\u0159ovat interval ca\u00a0jedn\u00e9 sekundy. M\u011b\u0159\u00ed se z\u00e1kladn\u00ed interval 100ms a ten se desetkr\u00e1t zopakuje. Bez ohledu na to, co program d\u011bl\u00e1 (a jak dlouho) v z\u00e1kladn\u00edm intervalu 100ms, tak ten z\u00e1kladn\u00ed r\u00e1mec trv\u00e1 v\u017edy stejn\u00fdch 100ms, kter\u00e9 jsou odm\u011b\u0159ov\u00e1ny hardwarem (obvodem UART 8251). Pokud b\u011bhem odm\u011b\u0159ov\u00e1n\u00ed t\u011bch z\u00e1kladn\u00edch 100ms bude m\u016fj program trvat \u0159ekn\u011bme 150ms, pak tento z\u00e1kladn\u00ed interval pro\u0161vihnu a ztrat\u00edm informaci o t\u011bch 100ms, kter\u00e9 jsem cht\u011bl m\u011b\u0159it. Ale jak jsem \u0159ekl v \u00favodu &#8211; obvod UART mi\u00a0d\u00e1v\u00e1 pouze informaci, \u017ee\u00a0j\u00edm odm\u011b\u0159en\u00fdch\u00a0100ms n\u011bkdy v minulosti uplynulo. A je jen na mn\u011b, jak dlouh\u00e9 kousky k\u00f3du z hlediska \u010dasu vkl\u00e1d\u00e1m do z\u00e1kladn\u00edch m\u011b\u0159ic\u00edch interval\u016f UARTu, zda k\u00f3du dovol\u00edm opravdu hrub\u011b p\u0159es\u00e1hnout dobu z\u00e1kladn\u00edho intervalu. Pokud je k\u00f3d p\u0159\u00edli\u0161 dlouh\u00fd, mohu jej rozd\u011blit na v\u00edce \u010d\u00e1st\u00ed, kter\u00e9 prolo\u017e\u00edm &#8222;hl\u00edd\u00e1n\u00edm&#8220; UARTu, zda u\u017e nastaven\u00fd \u010das uplynul.<\/p>\n<p>Ale co kdy\u017e nechci 10x 100ms? Nen\u00ed nic snaz\u0161\u00edho. Pokud se nezat\u011b\u017eujete kompatibilitou nap\u0159\u00ed\u010d v\u0161emi verzemi PMD-85, prost\u011b zm\u011bn\u00edte\u00a0d\u011blic\u00ed pom\u011br \u010dasova\u010de 8253 a t\u00edm i\u00a0taktovac\u00ed frekvenci pro UART 8251 a to s velice jemn\u00fdm krokem.\u00a0Verze 1 po\u010d\u00edta\u010de PMD-85 m\u00e1 taktov\u00e1n\u00ed UARTu hardwarov\u011b nastaveno na fixn\u00edch 1200Hz a proto stejnou frekvenci nastavuji i na kan\u00e1lu 1 \u010dasova\u010de 8253, kter\u00fd u verz\u00ed 2 a 3 vyr\u00e1b\u00ed prom\u011bnnou taktovac\u00ed frekvenci UARTu 8251 nam\u00edsto t\u00e9 fixn\u00ed 1200Hz u verze 1. Tak\u017ee zm\u011bna v\u00fdstupn\u00ed frekvence kan\u00e1lu 1 \u010dasova\u010de 8253 je sice \u0159e\u0161en\u00edm, ale pokud chci zachovat kompatibilitu opravdu pro v\u0161echny verze PMD-85, mus\u00edm pou\u017e\u00edt jin\u00e9 \u0159e\u0161en\u00ed. A t\u00edm je zm\u011bna form\u00e1tu vys\u00edl\u00e1n\u00ed znaku, co\u017e bylo pops\u00e1no hned ve druh\u00e9m odstavci tohoto \u010dl\u00e1nku.<\/p>\n<p>Doba, kterou odm\u011b\u0159uje UART, je stanovena takto:<\/p>\n<h1>T = N x V \/ f<\/h1>\n<p>kde T je doba v sekund\u00e1ch, N je po\u010det vys\u00edlan\u00fdch bit\u016f (zapo\u010d\u00edt\u00e1v\u00e1 se START bit o d\u00e9lce 1 bitu, po\u010det samotn\u00fdch datov\u00fdch bit\u016f v po\u010dtu 5-8, p\u0159\u00edpadn\u00fd paritn\u00ed bit a\u00a0STOP bit o nastaviteln\u00e9 d\u00e9lce 0-2 bity), V je koeficient p\u0159evzorkov\u00e1n\u00ed (1x, 16x, 64x) a f je taktovac\u00ed frekvence (ji\u017e zm\u00edn\u011bn\u00fdch 1200Hz). Nyn\u00ed k tomu STOP bitu a jeho d\u00e9lce. To, co nastavujeme jako d\u00e9lku STOP bitu, je z\u0159ejm\u011b pouze jeho nomin\u00e1ln\u00ed doba. Ov\u0161em z hlediska \u010dasov\u00e9ho okna na konci vys\u00edlan\u00e9ho znaku je skute\u010dn\u00e1 doba vys\u00edl\u00e1n\u00ed STOP bitu a ochrann\u00e9ho &#8222;jedni\u010dkov\u00e9ho&#8220; intervalu za n\u00edm bu\u010f stejn\u00e1 nebo o n\u011bco m\u00e1lo del\u0161\u00ed. Op\u011bt odkazuji na koment\u00e1\u0159e za \u010dl\u00e1nkem.<\/p>\n<p>Po\u010det vys\u00edlan\u00fdch bit\u016f\u00a0i koeficient p\u0159evzorkov\u00e1n\u00ed je \u00a0ur\u010den re\u017eimem, ve kter\u00e9m UART pracuje. Re\u017eim se nastavuje\u00a0z\u00e1pisem vhodn\u00e9 hodnoty do COMMAND registru na adrese portu 1Fh (adresa 1Fh plat\u00ed ov\u0161em jen pro PMD-85). P\u0159ed za\u010d\u00e1tkem pou\u017e\u00edv\u00e1n\u00ed UARTu 8251 je nutn\u00e9 jej inicializovat. Datasheet Intelu k 8251A nab\u00edz\u00ed jako vhodn\u00fd za\u010d\u00e1tek inicializa\u010dn\u00ed sekvence:<\/p>\n<ul>\n<li>00h-00h-00h-40h (synchronizace sekvenceru a n\u00e1sledn\u00fd povel RESET)<\/li>\n<\/ul>\n<p>Datasheet fy NEC k tomuto obvodu uv\u00e1d\u00ed i m\u00edrn\u011b krat\u0161\u00ed\u00a0za\u010d\u00e1tek inicializa\u010dn\u00ed sekvence:<\/p>\n<ul>\n<li>80h-80h-40h<\/li>\n<\/ul>\n<p>V obou p\u0159\u00edpadech mus\u00ed n\u00e1sledovat bajt, ur\u010duj\u00edc\u00ed re\u017eim UARTu, n\u00e1sledovan\u00fd vhodnou povelovou instrukc\u00ed pro povolen\u00ed vys\u00edl\u00e1n\u00ed a nastaven\u00ed komunika\u010dn\u00edch sign\u00e1l\u016f modemu. Zkou\u0161el jsem tedy tuto inicializa\u010dn\u00ed sekvenci, kterou jsem podrobil v\u0161em mo\u017en\u00fdm v\u00fdchoz\u00edm stav\u016fm z\u00e1pisov\u00e9ho sekvenceru obvodu 8251.<\/p>\n<ul>\n<li>80h &#8211;\u00a0form\u00e1ln\u00ed synchronn\u00ed re\u017eim\u00a0nebo 1. sync znak nebo 2. sync znak nebo jalov\u00fd povel<\/li>\n<li>80h &#8211; 1. sync znak nebo 2. sync znak nebo jalov\u00fd povel<\/li>\n<li>40h &#8211; povel RESET, za kter\u00fdm n\u00e1sleduje nastaven\u00ed re\u017eimu (m\u00f3du)<\/li>\n<li>82h &#8211; nastaven\u00ed asynchronn\u00edho re\u017eimu s dobou vys\u00edl\u00e1n\u00ed znaku 100ms<\/li>\n<li>23h &#8211; povolen\u00ed vys\u00edla\u010de + definice sign\u00e1l\u016f modemu (RTS a DTR)<\/li>\n<\/ul>\n<p>Vzhledem k dosti zna\u010dn\u00e9mu po\u010dtu mo\u017enost\u00ed (verze UARTu, typ RESETu, v\u00fdchoz\u00ed stav sekvenceru, c\u00edlov\u00e1 platforma) budu tuto sekvenci testovat i nad\u00e1le. Prozat\u00edm jede, tak ji tady d\u00e1v\u00e1m. Ale nevylu\u010duji, \u017ee tato sekvence m\u016f\u017ee p\u0159i n\u011bjak\u00e9 variant\u011b b\u00fdti nefunk\u010dn\u00ed.<\/p>\n<p>V\u0161e je uk\u00e1z\u00e1no v p\u0159ilo\u017een\u00e9m demonstra\u010dn\u00edm programu. Je pou\u017eita &#8222;\u010dasovac\u00ed&#8220; doba 100ms, kter\u00e9 odpov\u00edd\u00e1 hodnota konfigura\u010dn\u00edho bajtu re\u017eimu UARTu o hodnot\u011b 82h. A pr\u00e1v\u011b zm\u011bna t\u00e9to hodnoty m\u011bn\u00ed i &#8222;\u010dasovac\u00ed&#8220; dobu. Je p\u0159ilo\u017eena rovn\u011b\u017e tabulka v Excelu, kter\u00e1 pro ka\u017edou hodnotu konfigura\u010dn\u00edho bajtu re\u017eimu UARTu uv\u00e1d\u00ed dosa\u017eenou &#8222;\u010dasovac\u00ed&#8220; dobu.<\/p>\n<p>Mo\u017en\u00e1 je\u0161t\u011b pozn\u00e1mka, pro\u010d p\u0159ilo\u017een\u00e1 tabulka neobsahuje hodnoty, odpov\u00eddaj\u00edc\u00ed synchronn\u00edm re\u017eim\u016fm UARTu. Prost\u011b proto, \u017ee maj\u00ed jinou\u00a0inicializa\u010dn\u00ed sekvenci. A proto\u017ee &#8222;nab\u00eddka&#8220; \u010das\u016f pro asynchronn\u00ed re\u017eimy je mnohem v\u011bt\u0161\u00ed ne\u017e p\u0159\u00edpadn\u00e1 &#8222;nab\u00eddka&#8220; \u010das\u016f re\u017eim\u016f synchronn\u00edch, zvolil jsem &#8222;asynchronn\u00ed sadu&#8220;.<\/p>\n<p>N\u00e1sleduj\u00edc\u00ed tabulka ud\u00e1v\u00e1 p\u0159ehled dostupn\u00fdch \u010das\u016f dle nastaven\u00e9ho re\u017eimu UARTu.<\/p>\n<p><a href=\"https:\/\/www.pmd85.cz\/wp-content\/uploads\/timeselect8251.gif\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" class=\"alignleft wp-image-386 size-thumbnail\" src=\"https:\/\/www.pmd85.cz\/wp-content\/uploads\/timeselect8251-150x150.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.pmd85.cz\/wp-content\/uploads\/tim8251.txt\" target=\"_blank\" rel=\"noopener noreferrer\">Vzorov\u00fd program pro \u010dasov\u00e1n\u00ed proces\u016f pomoc\u00ed UARTu 8251<\/a><\/p>\n<p><a href=\"https:\/\/www.pmd85.cz\/wp-content\/uploads\/timingUART.xls\" target=\"_blank\" rel=\"noopener noreferrer\">Tabulka hodnot konfigura\u010dn\u00edho bajtu re\u017eimu UARTu dle po\u017eadovan\u00e9ho \u010dasu<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>pozn.: \u010cl\u00e1nek byl 10.7.2017\u00a0zm\u011bn\u011bn a dopln\u011bn o poznatky, kter\u00e9 vyplynuly z koment\u00e1\u0159\u016f k \u010dl\u00e1nku. T\u00edmto d\u011bkuji zejm\u00e9na Zde\u0148kovi za podn\u011bty a ov\u011b\u0159en\u00ed cel\u00e9 \u0159ady informac\u00ed a nalezen\u00ed chyb v p\u016fvodn\u00edm \u010dl\u00e1nku a Romanovi za informace, kter\u00e9 k dan\u00e9mu t\u00e9matu nashrom\u00e1\u017edil ji\u017e d\u00e1vno p\u0159ede mnou. Co si pod pojmem &#8222;limitn\u00ed \u010dasov\u00e1n\u00ed&#8220; p\u0159edstavuji? Informaci o tom, \u017ee [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":337,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/pages\/365"}],"collection":[{"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365"}],"version-history":[{"count":8,"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/pages\/365\/revisions"}],"predecessor-version":[{"id":669,"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/pages\/365\/revisions\/669"}],"up":[{"embeddable":true,"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=\/wp\/v2\/pages\/337"}],"wp:attachment":[{"href":"https:\/\/www.pmd85.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}