DMA už ovšem dávno není jen doménou PC, ale stále častěji se objevuje na výkonějších jednočipech (třeba ARM). Na jednodušších verzích, jako jsou třeba AVR, tato možnost bohužel chybí. Periferie jako LCD nebo D/A převodníky lze tedy ovládat jedině přímo pomocí MCU. Obsluhu těchto periferií je ovšem možné napsat tak, aby zdánlivě probíhala bez zásahu MCU - právě proto "pseudo DMA". Nejednodušším způsobem je třeba nastavit časovač na nějakou vhodnou periodu a vyvolávat jím přerušení. V obsluze pak třeba vždy odeslat jeden byte do D/A převodníku, do LCD řadiče nebo opačně. MCU sice v průměru stále ztrácí čast výkonu na řízení dané periferie, ale děje se tak zdánlivě bez našeho přičinění, navíc v pravidelných intervalech, což by v hlavní programové smyčce nešlo. Zejména pokud jde třeba o audio D/A převodníky, tak perioda vzorkování je mnohdy kratší než některé operace. Jistým druhem Pseudo DMA je pak i příjem dat z USARTu přes přerušení, kde si přijímaná data lze ukládat do vyrovnávací paměti a až v hlavní programové smyččce je zpracovávat.
Prakticky jsem již pseudo DMA na jednočipech AVR realizoval několikrát. Nejprve v kombinaci se softwarově vytvořenou vyrovnávací pamětí (FIFO) pro ovládání sériového I2S audio D/A, dále několikrát pro LCD (grafické i znakové), ale také pár experimentů pro zápis na HDD z externí RAM (segmentovaných 512kB).
Pseudo DMA rutiny pro HD44780
Tento demonstrační prográmek ukazuje pseudo DMA refresh LCD s řadičem HD44780. Znaková paměť DDRAM se obnovuje z interní RAM AVR. Všechny texty/císla se zapisují jen do RAM, což je velmi rychlé a po dokončení zápisu se jen zinicializuje refresh LCD a o zbytek se postará přerušní timeru 2. Případně lze zapnout automatické obnovování po každém zápisu do znakové RAM. Ušetří se tak poměrně dost strojového času, protože klasické obnovení LCD 2x20 znaků by normálně trvalo přes 1,6ms v kuse a to je někdy až příliš. Rutiny jsou napsány pro ATmega32, ale změnou timeru je lze přepsat pro kterýkoliv jiný AVR.
Po vypsání pár textíků se spustí něco jako terminál. Komunikace je nastavena na 19200bd bez řízení toku. AVR přijaté znaky vypisuje na LCD a zároveň vrací terminálu. Enter maže řádek.
Po vypsání pár textíků se spustí něco jako terminál. Komunikace je nastavena na 19200bd bez řízení toku. AVR přijaté znaky vypisuje na LCD a zároveň vrací terminálu. Enter maže řádek.
Odkazy
- Domovská stránka autora - http://www.elektronika.kvalitne.cz/
Komentáře
U AVR DMA - nechyba!
Len som chcel pooprravit autora textu na vetu "Na jednodušších verzích, jako jsou třeba AVR, tato možnost bohužel chybí."
Ale jadro AVR uz ma plne hw 4 kanal DMA a ku tomu este Event module, je to cela rada Xmega na jadre AVR!
Pravda
AVR už DMA podporují... a taky jsem čekal po kliknutí na tento článek něco jiného..
Budoucnost?
Já spíš nechápu, jaký smysl má přebírání podobných amatérských článků z jiných webů, kterých je tu v poslední době až moc a tohle v nich není samozřejmě jediná chyba. Podle mě by jste se zde měli držet svých slov, uvedených kdysi v diskuzi a dospět. Tedy věnovat se profesionální elektronice a především automatizaci. Profesionální vývojáře tohle rozhodně nezajímá a amatéři si ten web najdou sami.
Proč například nepíšete víc o automatizaci a místo recenzí náhodně vybraných obvodů nepíšete spíš recenze například různých regulačních a řídících členů a podružných prvků. Myslím si, že za ty roky jste si již svou skupinu pravidelných návštěvníků získaly, tak se jim prosím věnujte i nadále a neubírejte se nyní namířeným dosti amatérským směrem.
Díky, L. Hora.
RTOS
Tohle moc společné s DMA nemá moc společné, spíše se jedná o jednoduchý RTOS system. Prostě se program rozložil na více úloh, data pro pomalé periferie se cpou do bufru. Nic nového.
Pseudo DMA?
Tento článek by se měl spíše jmenovat - obnovování videoram HD44780 na pozadí (nebo v přerušení). Nechápu, kde autor vzal odvahu k vytvoření technického novotvaru "Pseudo DMA", když obsah i forma tohoto slohového útvaru je více než amatérská. Je škoda (pro vás i pro nás), že uveřejňujete takovéto články.
Petr Černín
2N Telekomunikace