Atmel se zpožděním asi 5 let taky vydal miniaturní 6-pinový kontrolér, konkrétně ATTINY10, který vydává jako náhradu řady 10F a přizpůsobil tomu jak pinout tak programovací protokol. Je to trochu osekaná (ale stále pěkná) architektura AVR, ale stejně má bohatší výbavu než starší PIC, ovšem je taky dražší. Už jsem si s ním trochu hrál, ale nenašel jsem nějaké dobré použití, snad kromě elektronické kostky. Jako nevýhodu bych označil, že z programu nelze žádným způsobem permanentně uložit ani bajt. Tj. nemá EEPROM a flash není z programu zapisovatelná, což je s podivem, protože vlastní programovací mechanismy to má včetně speciálních registrů.
Jeste bych dodal, ze diky docela velke ROM je mozne, aby ta regulace analog->PWM (takze vlastne taky analog :-) byla hodne nelinearni, proste mit naprogramovane nejake podminky i mensi prevodni tabulky. To se s „klasickou“ technikou, tj. operacnim zesilovacem dela o dost hur, nehlede na to, ze ten zesilovac mnohdy vyjde i draz nez tyto PICprckove :-)
UART je sice hezký, ale pokud vůbec, pak je z počítače vyveden v úrovních ±12V, takže se nevyhnete přinejmenším MAX232.
SPI a I2C jsem zatím na zadním panelu počítače vyvedené neviděl (i když by se mi to líbilo).
USB znamená trochu kódován, ale na druhou stranu 0–1 externích rezistorů, jeden filtrační kondenzátor, levný konektor, a jinak v podstatě nic. USB navíc poskytne i napájení, takže nároky na příkon vás pálí jen u opravdu malých počítačů.
Stavíte-li periférii pro běžný počítač, USB je často nejmenší zlo, a to i s tím kusem kódu, který s ním komunikuje.
Zprasené sériáky jsou zlo. Propojíte dvě zařízení s podobně zpraseným sériovým portem, a divíte se, proč to nechodí.
Už jsem viděl i zařízení, kde je výstup z procesoru PXA270 vedený bez diody nebo jakékoliv ochrany rovnou na vstup sériového portu (příklad: http://www.penguin.cz/~utx/hardware/Sharp_CE-170TS/ ). Od té doby při každém zasouvání sériového konektoru trnu, kdy to vyhoří.
Rezistor zničení při výboji statické elektřiny nezabrání, a průrazu, pokud se při zasouvání vlivem náhodného pořadí pinů při spojování objeví záporné napětí, také nemusí.
Buď náročnější předělání PCB (kondenzátory, diody), anebo před spojováním konektorů obě zařízení galvanicky propojit, a pak nejdříve zapojit RS-232 stranu, pak teprve nízkonapěťovou.
Tak jsem se schválně podíval, jaké jsou mezní hodnoty pro PXA270:
Mezní napětí na vsupu: –0.3V-+4V
Mezní proud na vstupu: 5mA
Mezní ESD ochrana: 2kV, nejvýše 3 rázy
Pracovní výstupní napětí na zmíněném kabelu: 0V-3,3V
Naproti tomu řešení pomocí MAX3245E nabízí:
Mezní napětí na vsupních pinech: –25V-+25V
Mezní napětí na výsupních pinech do trvalého zkratu: –13,2V-+13,2V
Mezní ESD ochrana (vzdušný výboj nebo lidské tělo): 15kV
Mezní ESD ochrana (kontaktní výboj): 8kV
Pracovní výstupní napětí při napájení 3,3V: –5V-+5V
No on sice vysilac by skutecne mel dodavat ±12V, jak spravne pisete, ale prijimac by jiz mel rozeznavat hladiny ±3V, takze na mnoha zakladovkach ve skutecnosti je na seriaku jen 5V, treba na spouste notebooku. A to se jiz da s par diodama prakticky primo na MCU propojit.
Ale ze SPI nebo I2C na kazdem pocitaci by bylo pekne, s tim souhlas, je skoda ze to v prvnich PCckach nebylo (ale tam zas byla paralelni linka s TTL, tam se to dalo odsimulovat).
Nejvetsi problem s USB neni v signalovych charakteristikach (tam je to rekl bych kvuli diferencnimu prenosu lepsi nez RS-232C), ale v tom, kolik pameti sezere program v MCU na to, aby byl skutecne USB-compliant. To uz je mozna i Ethernet jednodussi :-)))
Naimplementovat ethernet je složitější. Kdyby to bylo jednodušší, měli bychom už před 15 lety ethernetové myši a klávesnice a USB by nikdy nevzniklo.
USB bylo navrženo přesně proto, aby většinu práce odvedl host a jeho řadič (OHCI, EHCI) nebo CPU (UHCI), a v periférii mohl být hloupý a levný čip. Až na poněkud složitější kódování (vyžádané jedinou datovou linkou) a identifikaci zařízení (vyžádané uživatelskou přítulností) to není o mnoho složitější než sériový port.
To, že se to časem zvrtlo, a spousta USB zařízení má uvnítř USB<->UART, USB<->I2C, USB<->SPI, USB<->(S)ATA nebo USB<->SCSI (= nejběžnější protokol pro mass storage), to už je jiná.
Je to o dost složitější než sériový port! To vám říkám jako člověk, který se tím 6 let zabývá. RS-232 je naprosto primitivní asynchronní point2point rozhraní, které specifikuje v podstatě jen komunikační rychlosti a základní, velmi primitivní protokol (start/stop bity, parita, datové bity…). USB je synchronní sběrnice hvězdicového typu s různými dedikovanými typy zařízení pro její realizaci, s jasně definovaným povinným protokolem, jehož komplexnost, robustnost a universálnost se nedá s primitivitou RS-232 v žádném případě srovnávat.
Pokud stavíte zařízení, které má mít USB host, tak souhlasím: USB je podstatně složitější. (Zvlášť Mass Storage je chuťovka, kdy USB flash může komunikovat několika různými protokoly, a vám nezbývá než implementovat všechny.)
Pokud stavíte USB klienta (oč asi šlo v diskusi), stačí, aby zareagoval na pár povelů, a zbytek řešit nemusí.
A ještě bych doplnil – obzvláště, když článek je o PICech – že Microchip dělá i MCU s podporou USB – např. PIC18F2550, PIC18F4550… Vyvedeny má pro tyto účely diferenciální D+/D- (jiné MPU to nemívají a nevyhovují tak ani z elektrického hlediska) a USB stack se realizuje čistě softwarově. Potřebný ovladač v C Microchip nabízí zdarma ke stažení a zakomponování do uživatelova projektu v MPLAB. Výhodou je, že to narozdíl od různých po domácku flikovaných řešení splňuje USB specifikaci. Zdrojáky v C (včetně implementace HID protokolu) mají cca 300 KB.
Atmel také vyrábí jednočipy s nativním USB. Nejnižší model AT90USB82 s 8kB flash se dá koupit pod $4.
Bastlíři, které USB specifikace nezajímá, často používají místo D+ a D- obyčejné GPIO. USB v nejnižší rychlosti zvládnou už vyšší modely AT Tiny za 40Kč, a navíc mají (narozdil od AT90USB) DIP pouzdro. Stačí oželet 1kB paměti.
U SPI a IIC to není nijak. Jsou to lokální sběrnice – mají pouze specifikované rozhraní a vzorkování v závislosti na hodinovém signálu a jeho polaritě; IIC má ještě specifikovány 3 různé protokoly, frekvence hodinového signálu a maximální kapacitu sběrnice (400 pF). USB je externí sběrnice.
1) Nepleťte si RS-232 a UART. Jsou to dvě různé věci.
2) SPI i IIC jsou lokální sběrnice. Nemají specifikované elektrické charakteristiky, proto je není možné vyvést mimo DPS – resp. postrádalo by to smysl.
3) Realizovat softwarově USB řadič neznamená „trochu“ kódování, ale hodně kódování – aby to vůbec nějak fungovalo. Aby to fungovalo tak, jak požaduje standard, bude to chtít ještě několikrát tolik kódování. :-)
1) Vím. Chtěl jsem říci, že výstupy UART typicky vyvedeny nebývají, pouze RS-232. A k jeho použití potřebujeme mít v periférii převodník úrovní, který je někdy dražší, než samotný mikrokontroler.
2) Pro bastlíře by bylo skvělé mít možnost přípojit malou destičku s libovolným integrovaným obvodem s SPI nebo I2C. Kdyby existovala rozumná standardizace, mohly by mít počítače minisloty pro I2C nebo SPI zařízení. Dnes u každé hlouposti s jedním I2C obvodem musí být často mnohem dražší převodník z USB nebo PCI Express.
Bastlíř zpravidla není tím mainstreamovým cílovým zákazníkem, na něhož by se zaměřoval marketing výrobců PC. ;-) Navíc – „rozumná standardisace“ by znamenala to, že by přestalo být možné připojit malou destičku s integrovaným obvodem s SPI nebo IIC, protože pro výrobce IO jsou tyto jednoduché lokální sběrničky zajímavé právě kvůli té jednoduchosti a specifikaci elektrických paramterů stylem „viz specifikaci TTL/LVTTL/CMOS – dle potřeby“. Pokud bych to chtěl vytáhnout ven a standardisovat, začnou v tom lítat napěťové a proudové úrovně, jejich tolerance, impedance, přenosové rychlosti, specifikace konektorů, kabeláže… SPI a IIC je zkrátka vymyšleno a určeno k něčemu jinému, než aby se to používalo místo externích sběrnic, jako je RS-232, RS-485, CAN, USB apod. V průmyslové branži se běžně používá ta RS-485, takže nějak „externalisovat“ SPI/IIC nemá smysl, pro PC je SPI/IIC zase příliš výkonnostně omezené. Při návrhu nějak rozšiřitelného embedded zařízení (např. možnost přicvaknutí nějakého modulu pomocí přímého konektoru, headeru apod.) se SPI a IIC používá velice hojně jako takový do jisté míry standard místo dřívějšího vyvádění sběrnice procesoru.
do I2C se da treba lezt skrz VGA a DVI vystup na nvidia kartach, dokonce je to registrovany jako nativni I2C bus driver v linuxu http://us.download.nvidia.com/XFree86/Linux-x86/256.35/README/i2c.html
Neni to uplne pravda. USB je komplikovanejsi, ale je treba si uvedomit i vyhody. Mensi konektory (a dobre popsane), jasne definovane napajeni (5V/500mA), rozsireni mezi ruznymi platformami (PC, Apple, atd), moznost retezit vice zarizeni (USB hub) a take moznost vyssich prenosovych rychlosti.
Take SW implemnetace USB v MCU ATMEL AVR navrh amaterskych konstrukci s USB znatelne zjednodusila, podobne jako dostupnost FTDI cipu…
Muzete poslat nejaky odkaz, ktery Vase tvrzeni podporuje? USB, potrebuje presny zdroj hodinoveho kmitoctu a take vice RAM, nez ma tento pidi MCU… Ano, AVR procesory zvladnou SW implementaci USB, ale jedna se o lepsi MCU, nejnizssi je snad ATtiny2313, ktery ma 128B RAM a moznost pripojit externi zdroj hodin (krystal 12MHz).
Záleží na tom, co považujete za přesné hodiny. Interní RC oscilátor lze kalibrovat pomocí samotné USB komunikace (detaily neznám) a přesnost je dostačující. Zatím nejmenší USB-schopné AVR co znám je ATtiny25, shodou okolností jsem ho využil na programování onoho šestipinu ATtiny10 :) 2KB paměti, což je 1K instrukcí, není opravdu mnoho. USB implementace je orčitě dost očesaná jen na nejdůležitější věci a standardu to neodpovídá ani náhodou.
Když už někdo chce malý levný kontrolér s USB tak určitě bych se neohlížel na SW implmentace, ale na srovnatelně drahé brouky, které to mají zabudované. Microchip nebo Cypress mají nabídku širokou. Vlastně dnes už kdejaký low-end ARM má USB a hromadu dalších věcí.
OK, presvedcil jste me, treba tady je to zdokumentovane (ATtiny25):
http://www.bobhobby.com/2008/04/22/usb-physical-hit-counter-based-on-avr-attiny25/