Blog 7: In-Circuit Serial Programming, ofwel ICSP

ICSP
Mijn afgelopen blog ging over redundantie. Hoewel dit onderwerp vanuit technisch aspect erg interessant is, en ook als engineer belangrijk is om over na te denken, was de link naar de domotica toepassing die ik ontwerp voor mijn nieuwbouwhuis misschien wat minder zichtbaar. In deze blog ga ik een directer toepasbaar onderwerp bespreken, namelijk In-Circuit Serial Programming, ofwel ICSP.

Hoe worden microcontrollers geprogrammeerd?
Microcontrollers kun je op verschillende manieren programmeren. De eerste microcontrollers werden voornamelijk op apparaten geprogrammeerd die, hoe toepasselijk, “programmers” werden genoemd. Dit zijn losse apparaten waarin je verschillende typen uC, flashgeheugens of PROMS kunt programmeren.

Losse DIP programmer

Zoals je ziet op de foto vereist dit echter dat de chip losgehaald is van de Printed Circuit Board (PCB), zodat deze geprogrammeerd kan worden. Zodra het project is afgerond en de software klaar is, worden alle chips in de programmer geprogrammeerd en op de PCB geïnstalleerd voor de laatste kwaliteitscontroles. Het voordeel hiervan is dat er geen enkele overbodige hardware aanwezig hoeft te zijn voor het programmeren van de chip. Denk aan USB interfaces die een FTDI interface nodig hebben om met de microcontroller te communiceren (Future Technology Devices International, algemeen bekend onder de afkorting FTDI is een Schotse halfgeleiderfabrikant die zich in USB-technologie specialiseert). Dit zorgt voor zo min mogelijk extra componenten op de PCB.

Het nadeel hiervan is dat er twee fases in het productieproces van de PCB zijn. De programmeerfase van de chip, en de assembleerfase van de PCB. Het is mogelijk om chips voorgeprogrammeerd te bestellen bij een fabrikant, zodat zij dit werk voor je overnemen, maar het nadeel daarvan is weer dat enige wijzigingen van de software een hoop gedoe geven om de producten weer te voorzien van deze software. Je moet dus wel heel zeker weten dat de software 100% goed is!

ICSP, USB en Arduino Uno
Om de bovenstaande nadelen te overwinnen zijn er meerdere interfaces bedacht om het programmeren van de microcontrollers en chips uit te kunnen voeren terwijl de PCB al geassembleerd is. ICSP staat voor “In-Circuit Serial Programming” wat letterlijk betekent dat er geprogrammeerd kan worden terwijl de chip al in het circuit zit gemonteerd. Een andere methode die bij Arduino's wordt toegepast, is het programmeren via een USB poort.

Arduino Uno met USB en ICSP poorten


ICSP poort pin-out

Op de bovenstaande foto is te zien dat de prototyping chip van de Arduino Uno beide poorten aan boord heeft. De USB interface heeft, naast de USB ingang ook nog een aparte chip en wat losse hardware nodig om het USB protocol om te zetten in een communicatie vorm welke de microcontroller begrijpt en de communicatie met de PC op te zetten (virtuele COM poort). De ICSP header heeft enkel de 6 pinnen op de header die beschikbaar zijn voor de gebruiker. Omdat de Arduino (Uno) een prototyping platform is, heeft de ontwikkelaar van deze PCB beide poorten ter beschikking gesteld voor de gebruikers om maximaal gebruik te maken van de mogelijkheden tijdens de ontwikkelingsfase.

USB versus ICSP
Er zijn een aantal voordelen aan de USB interface. Zo is er directe duplex communicatie, dat wil zeggen de PC kan met de microcontroller communiceren, maar ook andersom. Zo kan de microcontroller waardes en statussen teruggeven aan de computer voor een grafische weergave. Ook is het programmeren met de microcontroller sneller via de USB poort in vergelijking met de ICSP poort. Tijdens het programmeren via de ICSP poort wordt er enkel van de PC naar de microcontoller gecommuniceerd.

De voordelen van de ICSP header is dat er, naast de header, dus geen enkele andere hardware nodig is op de PCB om de microcontroller te programmeren. Wel is er externe hardware nodig voor de USB – ICSP verbinding met de PC. De ICSP header is aangesloten op de SPI bus (SPI staat voor Serial Peripheral Interface en is de interface waarmee met de microcontroller wordt gecommuniceerd. dit wordt later nog nader uitgelegd) en maakt geen gebruik van de Tx en Rx pinnen van de Arduino Uno. Deze pinnen kun je dan voor andere doeleinden gebruiken. De SPI bus kan gedeeld worden met andere apparatuur, omdat het een seriële busverbinding is. Zo gebruik ik de ICSP header om enerzijds nieuwe software in de chip te schieten, en in operationele modus wordt de bus gebruikt om met de ethernet interface te communiceren om de MQTT berichten te ontvangen en versturen.

Eigen PCB met ICSP header en W5500 ethernet interface

Waarom gebruik ik ICSP?
Waarom heb ik op de domotica applicatie ICSP toegepast? Bovenstaande foto geeft een sneak preview van het uiteindelijke ontwerp, hoewel ik hiermee nog wel aan het sleutelen ben. Zoals je ziet heb ik de ICSP poort en de ethernetverbinding aan boord, en geen USB poort. Om eigenlijk de redenen zoals hierboven beschreven. Omdat ik nog constant code aanpas, wil ik wel een mogelijkheid om de software in circuit te kunnen wijzigen, maar een USB interface vereist weer extra hardware wat niet nodig is in dit ontwerp. Vandaar dat de ICSP poort een logische keuze is.

Volgende blog: ethernet interface
Dit was hem weer voor deze maand! Hopelijk vonden jullie het leerzaam. De volgende keer leg ik uit hoe de ethernet interface ontstond, hoe ik dit in een prototype testte en waarmee ik in het ontwerp rekening hield om deze interface te realiseren.

Tot dan!

Lees ook de eerder verschenen blogs van Jan-Jelle:
Blog 1: Nieuwe resultaten bij ROV SCADA-systeem afstudeerproject
Blog 2: Domotica en waarom ik het graag wil toepassen
Blog 3: Specificaties, prototyping en dimmen van mijn nieuwe ledverlichting
Blog 4: MQTT en de aannemer
Blog 5: Galvanische scheiding, van spartelende kikkerpoten tot brandende ledlampen
Blog 6: Beveiliging van elektronica, randapparatuur, kabels en gebruiksgemak