Monday, January 25, 2016

NCD85 4. MUART 8256 - 8080 Interrupts

Odskúšané, famózné, úžasné, ono to fakt funguje. 8256 dokáže spracovávať INTA signál a v správnom okamihu poslať na zbernicu patričnú RST inštrukciu. Paráda. Na skúšku som spustil 16-bitový timer T24, nastavil mu 1ms takt, 5000 ako začiatočnú hodnotu a bum. Po 5s sa vyvolalo prerušenie RST 6, blikla INTA LEDka a spustila rutina na obsluhu prerušenia. V nej je potrebné znova nastaviť timeout a v mask registri zase povoliť prerušenie od T24. To preto lebo prerušenia od timerov v 8256 sú iba jednorázové, hneď sa vypne príslušný bit v mask registri, aby nedochádzalo k opakovanému spúšťaniu. Ďalšia podivná vec je, že timer dopočíta do nuly a potom pretečie a ide od FFFF .. preto treba nastaviť aj novú začiatočnú hodnotu timeoutu.

Krásne to bliká, pretože na kratulinký signál INTA je pripojená "predlžovačka" impulzov 74123. Takže v takte 5s na mňa pomrkáva LEDka. Vyskúšal som aj prerušenie od sériového portu. Podľa očakávania, pri príjme znaku sa vyvolá príslušná rutina RST 4 a samozrejme blikne INTA LEDka.

Updatol som fotky v blogu o NCD85 1. Floppy radič, teraz sú už s takmer plne osadeným NCD85.

Pri ladení a testovaní prerušení som objavil chybu popisky na NCD. Popiska pri JUM4 je naopak, v polohe RST7.5 je v skutočnosti INT a naopak. Doplnil som to aj v blogu o NCD. Uvedomil som si ešte jeden zádrhel s konfliktným pripojením INTA signálu do PCF8584.

PCF8584 totižto tiež vie prerušovať a generovať RST inštrukciu. Zatiaľ to ani najmenej nevadí, pretože PCF používam ako I2C bus mastera a v polling režime. Ale ak by som niekedy chcel aby PCF8584 fungovalo aj ako slave (zatiaľ nechcem, napadá ma iba jedno jediné praktické využitie), tak by bolo vhodné aby pri oslovení iným masterom vyvolalo prerušenie CPU. Ak by niekto mal iba PCF8584 bez osadenej 8256, tak nie je žiadny problém. Jumper JUM3 sa nastaví na PCF (popiska INT). PCF pošle žiadosť o prerušenie a pri signále INTA vygeneruje RST 0 a všetko funguje ako má.

Ale pri osadení obidvoch obvodov PCF8584 aj 8256, sa musí kaskádovať prerušenie z PCF do vstupu EXTINT na 8256. Jumper JUM3 sa prehodí na polohu 8256. Vtedy je signál INT z PCF vedený do EXTINT vstupu 8256. Následne 8256 vygeneruje signál INT ktorý je pripojený na vstup CPU. A pri prijatí prerušenia na CPU by chceli obidvaja reagovať na signál INTA. A to by bol konflikt. Pri signále INTA som na jumper nemyslel. Tak sa asi bude musieť preškriabnuť INTA do PCFka .. a v software sa pollne interrupt register 8256, aby sa detektlo že ide o externý interrupt z PCFka. Vstup INTA na PCF mal ísť na jumper a mal sa dať voliť medzi VCC a signálom INTA z CPU.

Friday, January 22, 2016

NCD85 3. MUART 8256

Z doby pozdného socíku si ešte pamätám, ako som študoval z časákov vnútornú štruktúru 8255 a 8253. Poznal som aj 8251 aj keď už menej podrobne. Sériový port bol v dobe kazeťákov a televízii ako jediných dostupných periférií dosť nepraktický. A podrobnosti o 8259 som si už nevedel nijako vybaviť, len som vedel že slúžila ako radič prerušení. No a tak sa logicky dostávame ku 8256 :-) :-). Skrátka zopár ich mám, a urobil som im miesto na NCD, pretože je to zaujímavý obvod a chcem ho preskúmať. On totiž má z každého zo spomenutých obvodov niečo. Dva 8-bitové IO porty s handshaking, ako má 8255. Päť 8-bitových časovačov, prípadne po zlúčení štyroch z nich do dvoch dvojíc, jeden osembitový a dva 16-bitové. Sériový port. A radič prerušení, ktorý môže pracovať v "normálnom" prípadne "nested" režime. Zatial som vyskúšal UART a PIO.

Brány sú dve P1 a P2. P1 je pin konfigurovateľná, každý pin môže byť nastavený na vstup alebo výstup. P2 je nibble konfigurovateľná, každá štvorica bitov môže byť nastavená ako vstup alebo výstup. P1 môže mať aj alternatívne využitie, ako riadiace signály pre handshaking spolu s portom 2, externé prerušenie, vstupy do counterov atď.

Sériový port má rovnakú štruktúru ako v UART8251. Je double buffered. Má v status registri príznaky Transmit Buffer Empty, Receive Buffer Full prípadne sa dajú využiť aj ďalšie ako Overrun Error a Parity Error. Riadenie toku dát je preto úplne jednoduché. NCB má teda na doske NCD už štvrtý sériový port, a je to druhý sériový port s prerušením. Na dosiahnutie presných normalizovaných prenosových rýchlostí je potrebné aby MUART mal hodiny 1.024, 2.048, 3.072 alebo 5.12MHz. Preto som prešiel na NCB85v2 z hodín 8MHz (kryštál 16MHz) na nižšiu rýchlosť 5.12MHz. Pre jednu z normalizovaných frekvencií je potrebné príslušne nastaviť bity v command registri 2. Dalo by sa aj pretaktovávať, kryštál 12.288MHz mám v šuflíku, niekedy možno vyskúšam. Potom by boli baud rates (s konštantou pre 3.072MHz) dvojnásobné. Existujú aj kryštály s 15.36 a 16.384MHz :-)

Timre majú voliteľný takt 1/16ms alebo 1ms, čo pri 16-bitoch dáva možnosť generovania/merania 65,536 sekundy.. Reload signál timerov prípadne vstupy do counterov sú na pinoch portu P1. Na dosiahnutie presných časových konštánt 1/16 alebo 1ms je tiež potrebné aby MUART mal hodiny 1.024, 2.048, 3.072 alebo 5.12MHz. Pri zlúčení do 16-bitových timerov T24 a T35, predstavujú registre 2 a 3 nižší byte a registre 4 a 5 vyšší byte.

Stará dobrá 8080 poznala 8 prerušení. RST0 až RST7. Rutiny prerušení majú pevnú adresu N x 8. Podľa čísla prerušenia. Malo to len jednu chybu. 8080 v skutočnosti prerušovať nevedela a preto som na PMD85 mohol o prerušeniach iba snívať. Na prerušenia bol potrebný radič 8259 ktorý na zbernicu vygeneroval patričnú inštrukkciu. A ten v PMD a podobných nebol. Tesla nevyrábala. Zo západu sa nedovážal. Potom prišla zázračná 8085 a tá už mala 5 prerušovacích vstupov. INT ako 8080 a štyri nové. RST5.5, 6.5 ,7.5 a TRAP. Pre nové prerušenia si vedela vygenerovať patričnú inštrukciu, pre staré prerušenia ostala odkázaná na radič. Nové prerušenia dostali adresy medzi pôvodnými 5,6,7.


MUART 8256 má v sebe aj radič prerušení. Prerušenia od rôznych zdrojov majú pevne danú prioritu. Priorita zároveň zodpovedá aj číslu N v generovanej RST inštrukcii.

Radič prerušení vie pracovať v dvoch režimoch: normálnom a nested. V normálnom móde je vždy rozpracované iba jedno prerušenie a ďalšie aj keď majú vyššiu prioritu musia počkať. V nested móde sa preruší aj aktuálne vykonávané prerušenie, ak príde požiadavka na prerušenie s vyššou prioritou.

Dokumentácia k 8256 je tu: MUART 8256

Saturday, January 9, 2016

NCD85 2. I2C bus

A je to hotové :-) Vianočný čas už "tradične" využívam na bastlenie a hobby. Môj odhad na rozbehanie I2C controléra PCF8584 bol 3 dni. Nakoniec to trvalo viac ako dvojnásobok. Musel som sa uchýliť k mojej obľúbenej sofistikovanej debugovacej vedeckej metóde LED. Pripojil som LED na obidva vodiče SDA aj SCL a až vizuálne som odhalil kde sa to seká. (DS1307 sa rád zatne a zablokuje celú zbernicu).

Čo je I2C? Je to zbernica od Philips určená na komunikáciu čipov. Má dva vodiče, SCL a SDA a samozrejme zem. I2C umožňuje pripojiť veľké množstvo rôznych senzorov, pamätí, prevodníkov a displayov atď. Napríklad senzor tlaku, vlhkosti, teploty, kompas, senzor zrýchlenia, senzor ..? Alebo chceme pripojiť LCD (rozšírený je I2C backpack s PCF8574), rozšíriť počet vstupných a výstupných portov? Pripojiť jednu, dve, tri 256kB EEPROM? Nie je problém :-) A najlepšie na tom je, že všetky zariadenia sa pripojujú na tie isté dva vodiče. Nie je treba žiadne ďalšie vstupy/výstupy.

Na doske NCD85 je LM75 (alebo LM75A, TMP275), DS1307 a EEPROM rady AT24C. TMP275 je teplomer s rozlíšením až 0.0625°C a presnosťou 0.5°C v rozsahu od −20°C do 100°C. Je to lepšia alternatíva k "industry standard" LM75 od TI. Lepší ako LM75 je aj LM75A od NXP. DS1307 sú hodinky a kalendár a k tomu ešte 56 byte batériou zálohovanej RAM. Na držiak CR2032 batérie je na plošáku určená plocha na priletovanie. AT24Cxx sú EEPROM obvody s kapacitami od 128 byte po momentálne 256kB a za nejaký rok to bude zase viac. A to už by bolo použiteľné aj ako virtuálny disk. Majú garantovaný milión prepisov a udržanie dát na minimálne 100 rokov.

PCF8584 podporuje rýchlosť 100kHz, čo je základná najnižšia rýchlosť. Novšie čipy fičia už aj na 400kHz a 1MHz. K zbernici je nutné pripojiť pull up odpory. Samotné zariadenia (sú open drain) len spínajú vodiče zbernice k zemi. Tým je zaručené, že pri konflikte nedôjde k zničeniu ani jedného zariadenia. Veľkosť odporov nie je kritická, ide len o to aby dostatočne rýchlo zdvíhali úroveň do 1. Prekonávať musia len parazitické kapacity na zbernici. 10, 20 kilo prípadne aj nejaká tá LED, všetko jedno ;-) 100kHz zase nie je nejaká super vysoká frekvencia.

Zdroják drivera a testovacej aplikácie je tu:
i2c fun

Takto to môže vyzerať po boote:

A to som mal otvorenú vetračku.