Author:
Adam Folts is senior applicatie-engineer voor Pic32-producten bij Microchip.
Reading time: 4 minutes
Pieter Edelman
Microcontrollers werken in de regel met een grafische controller voor het weergeven van de gui. Maar wanneer de mcu beschikt over dma, is dat niet nodig, waardoor kosten en complexiteit van een systeem omlaag kunnen, legt Adam Folts van Microchip uit.
Op microcontrollers gebaseerde systemen gebruiken in de regel een interne of externe grafische controller voor de grafische gebruikersinterface. Maar vaak is deze component helemaal niet nodig voor een eenvoudige gui; een standaard microcontroller is zonder al te grote invloed op de performance te hergebruiken als virtuele grafische controller. Daarmee kan flink worden bespaard op de kosten en de complexiteit van het ontwerp.
Op het eerste gezicht lijkt dit een onmogelijke optie. Een controllerloos systeem moet er immers zelf zorg voor dragen dat er continu frames van pixels met een specifieke frequentie – doorgaans 60 Hz – naar een display worden gestuurd. De gui zou daardoor het grootste deel van de cpu-capaciteit in beslag nemen. De truc is om peripherals voor dma en parallelle-poortcommunicatie in te zetten. Veel moderne mcu’s zijn uitgerust met deze functionaliteit. Een virtuele grafische controller blijkt hiermee niet meer dan vijf procent van de cpu-tijd op te slokken.
Het verkeer naar een tft-lcd-display bestaat hoofdzakelijk uit de kleurenwaarden van elke pixel. Die worden rij voor rij doorgestuurd via acht tot vierentwintig parallelle datakanalen, afhankelijk van de gebruikte kleurdiepte. Daarnaast zijn er vier additionele kanalen om de data te synchroniseren en een stabiel beeld te krijgen: hsync, vsync, den en pclk. Het pclk-signaal dient als de hoofdklok voor het systeem, de twee sync-kanalen laten het lcd-paneel weten wanneer een nieuwe lijn (hsync) of nieuw frame (vsync) begint. Het den-kanaal signaleert het display wanneer er daadwerkelijk pixelgegevens worden verstuurd.
In een controllerloos systeem kunnen we voor het verzenden van de pixeldata gebruikmaken van dma-transfers vanuit een vluchtig geheugen waarin we het beeld opslaan. Dma (direct memory access) is bedoeld om zonder tussenkomst van de cpu data van de ene naar de andere geheugenlocatie te sturen. Via een parallelle-poortinterface, zoals de Parallel Master Port (PMP) in Pic-mcu’s, kunnen we hiermee pixeldata naar het display sturen zonder de cpu te belasten. Door de PMP automatisch de lees- en/of schrijf-strobes te laten produceren voor elke pixeloverdracht, verkrijgen we het plck-synchronisatiesignaal.

Met een simpel interruptmechanisme kunnen we de opeenvolgende transfers uitvoeren totdat een hele pixellijn is verzonden. Zodoende hoeft de cpu alleen even in actie te komen voor de hsync-, vsync- en den-signalen als een volledige lijn pixelgegevens is doorgestuurd. Met een paar kleine wijzigingen is de methode ook te gebruiken voor cstn- of mstn-displays.
Factor drie
We kunnen zowel intern als extern sram-geheugen inzetten als framebuffer. Bij externe opslag moeten we echter rekening houden met het verkeer tussen de cpu en de framebuffer. Deze communicatie gebruikt dezelfde datalijnen als de dma-transfers, dus die moeten worden opgeschort wanneer de framebuffer wordt bijgewerkt. De verversingssnelheid van het display gaat daardoor omlaag.
Om waarneembare variaties te voorkomen, moet het aantal pixel-updates per frame dus worden beperkt. Dit kan simpelweg met een counter in de virtuele grafische controller, die oploopt bij elke pixelupdate en gereset wordt bij elke dma-interrupt.
Ook kunnen we een mcu met een ebi-peripheral (external bus interface) inzetten. Door de ebi te gebruiken om naar het geheugen te schrijven, hoeven de controleregisters voor de parallelle poort niet meer gedeeld te worden met de dma en verloopt de communicatie met het sram een stuk efficiënter.

Hoewel sommige microcontrollers relatief veel geheugen aan boord hebben, kan het vanuit het oogpunt van kosten en stroomverbruik interessant zijn om alleen intern geheugen te gebruiken. De kleurdiepte is hier een handige parameter voor. De geheugenvereisten voor een standaard 24 bit display zijn bijvoorbeeld met een factor drie te reduceren door toepassing van het 8 bit 332rgb-kleurformaat, dat twee bits gebruikt voor het blauwkanaal en drie voor elk van de rood- en groenkanalen. Als er wat meer geheugen beschikbaar is, kunnen we het 16 bit 565rgb-formaat toepassen.
Deze formaten zijn gebaseerd op de karakteristieken van het menselijk oog, dat minder gevoelig is voor variatie in de kleur blauw dan in de andere kleuren. In beide methodes kunnen de ongebruikte kleurkanalen van het display simpelweg worden ingesteld op de meest significante bit van de respectievelijke kleur. Hiermee is het volledige palet van compleet zwart tot compleet wit beschikbaar.