Váení zákazníci, dovolujeme si Vás upozornit, e na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, e ukázka má slouit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, e není dovoleno tuto ukázku jakýmkoliv zpùsobem dále íøit, veøejnì èi neveøejnì napø. umisováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura
[email protected]
6
UNIVERZÁLNÍ ROZHRANÍ USB
V této kapitole pøedstavíme konkrétní vývojovou aplikaci USB. Úkolem je existující rozhraní na RS232 (CompuLAB firmy Modul-Bus) novì vyvinout pro USB. Nejdùleitìjí kroky tohoto vývoje jsou zde dokumentovány a mohou slouit jako základ pro vlastní pokusy. Hotové zaøízení je vyrábìno firmou Modul-BUS pod oznaèením CompuLAB-USB. Také vlastní stavba je moná, protoe jsou k dispozici vechny potøebné informace. Technická data starého rozhraní CompuLAB mají být zachována nebo zlepena. Z toho vyplývají následující minimální poadavky na novì vyvinuté rozhraní: 8 digitálních výstupù, kompatibilních s TTL, 8 digitálních vstupù, kompatibilních s CMOS, s vysokým vstupním odporem, 2 analogové vstupy, rozliení 8 bitù, rozsah 0 a 5 V. Protoe obvod CY7C63000 na rozdíl napø. od øadièe svého pøedchùdce ST6 nemá ádný interní A/D pøevodník, musí se nejprve vyhledat vhodný A/D pøevodník. Nenákladný typ je TLC541 s 11 vstupy a rozliovací schopností 8 bitù. Proti tomuto pøevodníku vak hovoøí to, e vyaduje externí hodinový signál 2 MHz. Nejblií lepí pøevodník od Texas Instruments je TLC1543 s rozliením 10 bitù. Má interní generátor hodin a vyaduje pro vybuzení ètyøi nebo pìt linek portu, podle toho, je-li vyhodnocován signál End-Of-Conversion, pøípadnì se pouije jednoduchá èasová smyèka. Na tento pøevodník padla volba také proto, e má pøíznivý pomìr cena/výkon.
6.1
A/D PØEVODNÍK TLC1543
A/D pøevodník TLC1543 je integrovaný obvod CMOS se sériovì taktovaným rozhraním k pøímému buzení mikroøadièem. Digitální data se tedy objevují na jediné lince a jsou mikroøadièem naèítána postupnì. Linka hodinového signálu øídí pøenos dat jako u posuvného registru. Stejným zpùsobem se data, zde speciálnì adresa vstupního kanálu, pøenáí z mikroøadièe do pøevodníku. Napájecí napìtí je 5 V, typický proudový odbìr je asi 1 mA. Pøevodník pracuje metodou postupných aproximací se sítí z binárnì váených kondenzátorù. Obr. 6.1 ukazuje principiální schéma. Komparátor CMOS testuje kadý bit porovnáním náboje. V první fázi pøevodu se pøevezme analogová hodnota sepnutím spínaèe S-C a vech spínaèù S-T. Vechny kondenzátory se pøitom nabijí na vstupní napìtí, pøièem jejich spoleèný pøívod je na potenciálu spínacího prahu komparátoru rovného asi polovinì napájecího napìtí. Potom se spínaèe rozepnou. Komparátor pak testuje napìtí kadého kondenzátoru. Nejprve se pøipojí uzel 512 (node 512) na referenèní napìtí REF+ a vechny ostatní uzly na REF. Kdy výsledné napìtí leí pod prahovým napì-
A
B. KAINKA:
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
67
tím, bude pro bit 9 rozpoznána jednièka a kondenzátor zùstane na REF+. Tentý proces se pak bude opakovat s kondenzátorem s váhou 256, aby se získal bit 8. Pøi kadém kroku postupné aproximace se pùvodní náboj rozdìlí na vechny kondenzátory. Po celkem deseti porovnáních bude napìtí urèeno s pøesností na 10 bitù.
Treshold Detector výstup Latches
Obr. 6.1
Princip pøevodníku se spínanými kondenzátory (Texas Instruments)
Vstup pøevodníku je interním multiplexerem pøiveden vdy na jeden z 11 externích vstupù. Navíc existují tøi interní kanály, které umoòují autotest. Kanál A11 je internì pøiveden na polovinu referenèního napìtí a dává výsledek 512. Moné odchylky poskytují cenné informace o pøípadném ruení, napø. nedostateèném vyfiltrování napájecího napìtí. Obvod TLC1543 pouívá k aktivaci pøenosu dat s øadièem linku chip-select ( &6 ).
Sample and Hold 14-Chanel Analog Multiplexer
vstupní adres. Registr
Self-Test Reference Adresa
Obr. 6.2
68
10bitový Analogový digitální Convertor (switched capacitors)
Output Data Registr
10-to-1 Data Selector and Driver
Systém Clock, Control Logic, and I/O Counters
Blokové schéma obvodu TLC1543 B. KAINKA:
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
A
Obr. 6.3
Rozloení vývodù obvodu TLC1543
Pøevod A/D se provádí, pokud je &6 na vysoké úrovni, tedy neaktivní. Kadý taktovaný pøenos dat dodává souèasnì 10 datových bitù posledního pøevodu mikroøadièi a na A/D pøevodník posílá adresu kanálu následujícího pøevodu. Pøevodník jsme pro první pokus chtìli pøipojit na desku vývojového kitu s co nejmeními zmìnami softwaru. Nabízí se nahradit rutinu teplomìru rutinou AD. Odpovídajícím zpùsobem se pouijí vývody portù P0.0 a P0.4.
Access Cycle B
Sample Cycle B
Hi-Z State
Previous Conversion Data
Shift in New Multiplexer Address; Simultaneously Shift Out Previous Conversion Value
Initialize
Obr. 6.4
A/D Conversion Interval
Graf prùbìhu impulzù pøi vybuzení
Pøímá náhrada rutiny teplomìru beze zmìn na jádru programu øadièe vede k tomu, e AD rutina TLC1543a.asm øízená timerem je vyvolána kadých 1024 µs. Výsledky pøevodu se ukládají do pamìových bunìk 78h a 79h.
A0 A1 A2
UCC
A3 A4
ADDR
A5
CS REF+ REF
A6 A7 A8
Obr. 6.5
A
Initialize
B. KAINKA:
Pøipojení pøevodníku na port 0
GND
EOC CLK DOUT
P0.0 P0.1 P0.2 P0.3 P0.4 +5 V
A10 A9
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
69
; TLC1543a.asm 10 Bit 12 Chanell AD-Converter ; Anschluss an Port 0 ADPort ADMaskBits ADEOC ADClock ADDataIn ADDataOut ADCS
:equ :equ :equ :equ :equ :equ :equ
00h 1fh 01h 02h 04h 08h 10h
; ; ; ; ; ; ;
SysPort0
gbADChan gbADPortMirror gbADBitcount gbADChanIn gbADDatHi gbADDatLo
:equ :equ :equ :equ :equ :equ
31h 32h 33h 34h 78h 79h
; ; ; ; ;USBEndP1FIFO ;USBEndP1FIFO +1
P0.0 P0.1 P0.2 P0.3 P0.4
;//$PAGE ;******************************************************************************* ; ADRead() ; ;******************************************************************************* ADRead: mov a,[gbADChanIn] mov [gbADChan],a mov a,[gbPort0] and a,~ADClock or a,(ADDataOut|ADCS|ADEOC) iowr ADPort mov [gbADPortMirror],a mov a,00h mov [gbADDatHi],a mov [gbADDatLo],a mov a,[gbADPortMirror] and a,~ADCS iowr ADPort mov [gbADPortMirror],a mov a,8 ADLoop1: mov [gbADBitcount],a
70
B. KAINKA:
;read analog input ; setup port bits
;CS low
;8 bits count
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
A
mov a,[gbADDatHi] ;output data shift left asl a mov [gbADDatHi],a iord ADPort ;read one Bit from Dout and a,ADDataOut cmp a,ADDataOut jnz Ainlow1 mov a,[gbADDatHi] or a,01h mov [gbADDatHi],a Ainlow1: mov a,[gbADPortMirror] ;output one bit to Din and a,~ADDataIn mov [gbADPortMirror],a mov a,[gbADChan] and a,80h cmp a,80h jnz AoutLow mov a,[gbADPortMirror] or a,ADDataIn mov [gbADPortMirror],a AoutLow: mov a,[gbADPortMirror] iowr ADPort or a,ADClock ; set clock high iowr ADPort mov a,[gbADChan] ;input data shift left asl a mov [gbADChan],a nop nop nop nop mov a,[gbADPortMirror] and a,~ADClock ; set clock low iowr ADPort mov [gbADPortMirror],a mov a,[gbADBitcount] ; complete loop 1 dec a jnz ADLoop1 ; read the two bytes left
A
B. KAINKA:
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
71
mov a,02h ADLoop2: mov [gbADBitcount],a mov a,[gbADDatLo] left asl a mov [gbADDatLo],a iord ADPort Dout and a,ADDataOut cmp a,ADDataOut jnz Ainlow2 mov a,[gbADDatLo] or a,01h mov [gbADDatLo],a Ainlow2: mov a,[gbADPortMirror] or a,ADClock iowr ADPort nop nop nop nop and a,~ADClock iowr ADPort mov [gbADPortMirror],a mov a,[gbADBitcount] dec a jnz ADLoop2 mov a,[gbADPortMirror] or a,ADCS iowr ADPort ret Listing 6.1
;output data shift
;read one Bit from
;set clock high
;set clock low
;complete loop 2
;set CS high
Buzení TLC1543 prostøednictvím portu 0.
Program pouívá dvì smyèky s celkem 12 hodinovými impulzy. V první smyèce se ète 12 datových bitù a 8 datových bitù se posune do pøevodníku. Hlavní program pøedá v globálním bytu gbADChanIn pøísluný analogový vstup. Protoe první ètyøi pøenáené bity pøedstavují adresu pro interní multiplexer A/D pøevodníku, pøenáejí se vdy násobky 10h (tj. 16) (00, 16, 32, 48
). Rutina okopíruje èíslo kanálu do promìnné gbADChan, která se ve smyèce osmkrát posune doleva, aby
72
B. KAINKA:
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
A
se izoloval vdy jeden bit. Podobným zpùsobem se postupnì naèítá prvých osm bitù posledního pøevodu a posouvá se do gbADDatHi. Druhá smyèka zpracovává u 10bitového mìøení oba bity pøevodu s nejnií váhou. Zde ji není potøebný ádný výstup na pøevodník. Nií byte (lowbyte) se uloí na adresu 79h v nepouité pamìtí FIFO koncového bodu 1. Uivatel mùe v závislosti na poadavcích èíst jen vyí byte (highbyte) na adrese 78h a získat tak pøesnost 8 bitù nebo pouije i lowbyte, aby se pøesnost zvýila na 10 bitù. Celá rutina AD potøebuje asi 140 µs. Není nutné brát ohled na dobu konverze, protoe pøevod se spoutí jen jednou za milisekundu. Tím je k dispozici 860 µs, zatímco pøevodník vystaèí s 21 µs. Na druhé stranì byly do smyèky zaøazeny instrukce NOP (no operation), aby byla zajitìna dostateènì dlouhá fáze High hodinových impulzù. Pomìrnì velké zvyovací odpory a velmi malý výstupní proud na portu 1 vedly spolu s nevyhnutelnými parazitními kapacitami k zaoblení hodinových impulzù, co se ukázalo tolerovatelné jen pøi prodlouení hodinových impulzù. V tomto prvním pokusu byla data pøipravena pøímo ve výstupní oblasti 78/79h. Ukázalo se vak, e jistý procentuální podíl dat byl naruen. Jako pøíèina pøicházelo v úvahu jen zpracování pøeruení. AD rutina samotná bìí s pøeruením od èasovaèe 1024 µs. Mùe být pøeruena, dojde-li k události koncového bodu 0. AD rutina potøebuje asi 140 µs. Je tedy pravdìpodobnost asi 14 %, e probìhne pøístup pro ètení výsledku, kdy jetì bìí pøevod. Zlepení se dosáhne, jestlie se data pøipraví na dvou jiných pamìových místech a teprve nakonec se pøekopírují na výstup. Jiným problémem je èasové chování. Øídicí dotaz (Control request) vyaduje vdy tøi USB rámy, tedy 3 ms. Na kadý kanál je zapotøebí jeden zápisový pøístup a dva ètecí pøístupy na RAM. Tím dojdeme k èasové potøebì 9 milisekund na kanál. Naproti tomu u RS232, pøedchùdce USB, je zapotøebí jen jedna milisekunda. Zde byl jen jeden dotazovací pøíkaz na kanál. Navíc byl vyslán byte a pøijat byte odpovìdi. Pøi pøenosové rychlosti 19 200 baudù z toho vyplývala doba asi 1 ms.
6.2
SHRNUTÍ KANÁLÙ AD
Nevýhodu pomalejího dotazování na zaøízení USB je mono vykompenzovat tím, e se souèasnì naèítá nìkolik kanálù. Jedním dotazem je mono spoleènì pøenést a 8 bytù. Díky tomu je mono dotazovat se souèasnì na ètyøi kanály. Pøenos èísla kanálu není nutný, jestlie firmware automaticky inkrementuje èíslo kanálu a provádí nìkolik mìøení dohromady. Vlastní mìøení na ètyøech kanálech mùe probíhat v pøeruení od timeru, potøebuje-li výraznì ménì ne 1 milisekundu. Mìøená data pro ètyøi kanály se obnovují jednou za milisekundu. Dotaz na ètyøi kanály vyaduje jen tøi milisekundy, je-li k dispozici odpovídající funkce ovladaèe pro dotaz na osm bytù. Tím se získá malá výhoda v rychlosti oproti RS232. Koneèné vyuití portu by mìlo vystaèit s minimem souèástek. Protoe A/D pøevodník s 11 vstupními kanály nabízí víc, ne je zapotøebí, je nasnadì mylenka vyuít 8 analogových vstupù jako digitální vstupy. To vyaduje jedno mìøení na kadém z osmi kanálù a váení výsledkù mìøení. V koneèném výsledku je tímto zpùsobem mono vyuívat port 0 mikroøadièe zcela pro digitální výstupy, kdeto
A
B. KAINKA:
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
73
port 1 se svými ètyømi linkami obsluhuje A/D pøevodník. Linka EOC se nevyhodnocuje, take ètyøi linky portu staèí. Pøi vhodném uspoøádání je mono budit i LED pro indikaci pøipravenosti. Zapojení podle obr. 6.6 pouívá prvých osm vstupních kanálù jako digitální vstupy. Tím jsou k dispozici tøi vstupy jako analogové. Dodateèný vstup pøedstavuje zlepení oproti pùvodnímu rozhraní (CompuLAB = RSS232). Pøi vhodném dimenzování vstupních obvodù je nadto mono dosáhnout i toho, e vechny digitální vstupy lze volitelnì vyuívat také jako analogové vstupy. V pøípadì potøeby bychom tedy mìli vech 11 analogových vstupù. P0.0
digitální výstupy DO0 ... DO7
... P.07
digitální vstupy DI0 ... DI7
A0 A1 A2
UCC EOC CLK
A3
ADDR
A4
DOUT
A5
CS REF+ REF
A6 A7 A8
P1.0 P1.1 P1.2 P1.3
A10
GND
A9
+5 V
TLC1543
Obr. 6.6
Pøiøazení portù
analogový vstup A
analogový vstup B
Z èasových dùvodù se mají ètyøi AD kanály mìøit spoleènì. Uivatel mùe urèit poèáteèní kanál, od nìho se budou kanály poèítat. Rutina pøevodníku se k tomu úèelu musí vyvolat pìtkrát, protoe pøevedená data se mohou naèítat vdy teprve pøi následujícím volání. Mezi jednotlivými sériovými pøístupy na pøevodník se tentokrát musí dodrovat doba pøevodu 21 µs. Pøíkazy NOP pro prodlouení hodinových impulzù si vak mùeme uetøit, protoe výkonnìjí výstupy portu 1 dávají strmìjí hrany impulzù. Celkovì je pøevod proveden za 650 µs, co je jetì dostateènì daleko od mezní hodnoty 1024 µs. Zbylých 350 µs musí staèit pro jiné události vyvolávající pøeruení, zejména pro dotazy (requests) USB. ; TLC1543b.asm 10 Bit 12 Kanal AD-Converter ADPort ADMaskBits ADClock ADDataIn :equ 02h ADDataOut ADCS
74
B. KAINKA:
:equ 01h :equ 1fh :equ 01h ; P1.1 :equ 04h :equ 08h
; SysPort1 ; ; P1.0 ; P1.2 ; P1.3
USB MÌØENÍ, ØÍZENÍ A REGULACE POMOCÍ SBÌRNICE USB
A