E‑ink aansturen met PIO & DMA

Eerder speelde ik met een e-ink scherm en kwam ik RAM tekort1 om het volledig aan te sturen. Maar zoiets als een RP2040 heeft RAM zat2. Ook zou ik met de PIO het scherm aan kunnen sturen, zodat de processor ondertussen wat anders kan doen dan data door draadjes duwen. Dan zet ik de data ergens klaar in het geheugen, laat DMA het naar de PIO sturen, en in de PIO maak ik een state-machine programma om het naar het scherm te sturen.

Zo gezegd, zo gedaan. Of eigenlijk: Het was aardig puzzelen en het heeft tussendoor ook nog een tijdje stilgelegen3.

Edoch4! Het is gelukt. De software is in deze git repository te vinden.

Schermverversing via PIO is nu 1 monolithisch programma. Het gebruikt 29 van de beschikbare 32 instructies. Misschien kan het met minder instructies als meerdere samenwerkende statemachine-blokjes werden gebruikt. Dat wordt dan wel ingewikkelder5.

Het inkterface bordje bevat de voeding en niveauvertalers (level translators), omdat het oorspronkelijk bedoeld was voor gebruik met een 5V systeem. Omdat de Pico net als het display met 3,3 V gevoed wordt zijn die vertalers hier nu niet nodig. Ze kunnen gelukkig ook tussen 3v3 en 3v3 vertalen 🙂

Een paar opmerkingen nog:

  • Voordat ik het scherm met de PIO aanstuurde heb ik het softwarematig aangestuurd op basis van de informatie van essentialscrap. Om mijn ED060SC7 scherm aan te sturen was het nodig CKV hoog te maken net voordat SPV laag gaat, zie afbeelding. Anders komt er niks op het scherm.CKV hoog voor SPV laag
  • Er is mogelijk nog iets niet helemaal correct qua timing:
    • Zwarte lijnen van 1 pixel breed worden niet (goed) getoond als ze op een witte achtergrond worden geschreven. De lijn blijft dan te bleek. Witte lijnen van 1 pixel breed, op een zwarte achtergrond, worden breder getoond dan 1 px.
      Wanneer de achtergrond wordt geschreven als “geen verandering” (0b11 of 0b00) worden 1 pixel brede lijntjes wel correct getekend.
      Dus door 2x te schrijven worden lijnen netjes weergegeven. De eerste schrijfactie word de achtergrond wit (of zwart) gemaakt. De 2e schrijfactie wordt de lijn op een ‘no change’ achtergrond geschreven.
    • Wanneer een pixel te lang wordt aangestuurd, loopt deze uit naar omliggende pixels.
  • Patches welkom 😉

Voortbouwend hierop zou ik meer dingen met e-ink kunnen doen. Bijvoorbeeld de vele verschillende voedingsspanningen6 van het e‑inkje ook door de RP2040 te laten verzorgen. Of gebruik makende van de wifi-mogelijkheden van de Raspberry Pi Pico W een via WIFI aanstuurbaar e‑inkje om tekst en plaatjes op te zetten. Later. Misschien. Ooit.

Voetnoten

  1. Op een STM32F103C8T6 – die heeft 10 kB SRAM. ↩︎
  2. De RP2040 heeft 264 kB RAM. ↩︎
  3. Spot de spin. ↩︎
  4. Jawel, ik bezig gaarne archaïsmen. Wellicht is “echter” evenzeer archaïsch, edoch “edoch” acht ik een mooier woord. Maar “maar” had ook gekund. ↩︎
  5. Elke statemachine moet dan op de een-of-andere manier gestart kunnen worden en een signaal geven dat ‘ie klaar is, waarna de volgende gestart wordt. Zoals de softwarematige aansturing van de e-ink ook opgedeeld is in een vscan start, hscan start, etc. Maar al dat starten en stoppen vraagt ook aandacht van de processor. In feite is het tijdrovende stuk het schrijven van data naar het scherm, dus je zou het PIO programma ook daartoe kunnen beperken en de rest softwarematig doen, als je PIO-instructies te kort komt. Of neem een RP2350, die heeft 3 PIO units, versus de 2 PIO units van de RP2040. (Met elk 32 instructies per PIO) ↩︎
  6. Dit zijn naast 3v3 voor de ‘logica’ ook een +22V, +15V, -15V en -20V en een spanning die precies tussen -2.5 V en -0.3 V ingesteld moet kunnen worden . (Dat is -0.3 V voor de ED060SC7, -1.0 V voor de ED060SC4, dus -0.3 als je allebei de schermpjes wilt kunnen toepassen) ↩︎

Posted

in

, , ,

by

Tags:

Comments

One response to “E‑ink aansturen met PIO & DMA”

  1. Jan Avatar
    Jan

    Die PIO is toch een mooie bouwsteen, leuk dat je het e-ink scherm zo aan de praat hebt gekregen.

Leave a Reply

Your email address will not be published. Required fields are marked *