Bird Box 2.0 – MCU

Jeg har brukt MCUer til en rekke prosjekter opp gjennom åra. Jeg begynte med Microchip Technology sin PIC-familie og har vel vært innom de fleste eldre modellene. Multitasking kan være en tung programmeringsteknisk oppgave som de fleste som har jobbet med MCUer vet. Det var mer eller mindre en tilfeldighet at jeg i 2006 kom over en MCU som på mange måter endret hvordan jeg bygger MCU-prosjekter. Jeg snakker om Parallax Inc. sin P8X32A Propeller. Jeg har siden den gang aldri kjøpt noen annen MCU, og har for å være ærlig aldri hatt behov for noe annet heller. I august 2014 gjorde Parallax P8X32A Propeller hardwaren og verktøya om til open-source hardware og software under GNU General Public License (GPL) 3.0. Kort oppsummert så snakker vi om en MCU som er designet for å kjøre flere samtidige real-time oppgaver, uten bruk av interrupts eller et innebygget OS. Brikken har åtte 32-bit cores også kalt cog. Alle cogene har tilgang til alle de 32 I/O-pinnene og eget minne på 512 32-bit long words (2 KB) med instruksjoner og data. I tillegg har cogene tilgang til delte ressurser som minne (32 KB random-access memory (RAM); 32 KB read-only memory (ROM)) som er kontrollert via med en round-robin scheduling av en intern computer bus-kontroller kalt hub. Hver cog har også tilgang til to dedikerte hardware counter og en spesial video generator for å generere timing signaler for Phase Alternating Line (PAL), National Television System Committee (NTSC), Video Graphics Array (VGA), servo-kontroll, og annet. Propeller-brikken kan programmeres i assembly, C, eller i Spin. Spin er et  høynivå programmingsspråk laget av Parallax som generer bytecode som kjøres av en interpreter lastet inn på Propelleren. Jeg bruker selv C siden jeg kjenner det språket og det faktum at det finnes mye C-kode skrevet for andre MCUer der ute. Parallax har flere demokort ferdig med den elektronikken som kreves rundt en Propeller-brikke. Det er sjelden jeg trenger tilgang til veldig mange pinner så jeg sverger til Parallax Propeller Mini som er et lite kort (20.5 x 38.6 mm) med tilgang til 19 I/O-pinner, 64 KB EEPROM, og utbyttbar 5 MHz krystall. Kortet kan mates med 6.5 – 12 VDC @ 1A. Man trenger en Prop Plug i tillegg for å programmere Propelleren. For Bird Box 2.0-prosjektet bruker jeg en Propeller Mini. Jeg vil nå fortelle hvordan jeg bruker Propeller-brikken i prosjektet. Tanken er at hver enkelt av modulene som kobles til I/O-pinnene (bruker SPI) har programvare som kjører i sin egen cog. En cog (typisk cog 0) kjører hovedprogrammet eller det vi i C kaller main(). Dette programmet starter nye funksjoner i nye coger. Jeg kjører funksjonene som leser verdiene fra GPS-modulen i en egen cog. Jeg kan da styre hvor ofte dette skal skje helt uavhengig av resten systemet. Verdiene deles mellom cogene i globale variabeler. Funksjonen som leser signalet som kommer fra sensoren (dette var en parkeringssensor i den opprinnelige POCen) kjører også i en egen cog. Igjen oppdateres en global variabel med avstanden som sensoren måler. Og til slutt kjører funksjonene som leser verdiene i de globale variablene og presenterer informasjonen på et display i en cog. Etter at cog 0 (som kjører hovedprogrammet) har startet de andre cogene så har den egentlig ingenting mer å gjøre. Jeg kunne ha kjørt funksjonene for skjermbilde i denne cogen, men har heller valgt å sende ut verdiene på de globale variablene til et terminalvindu for lettere feilsøk. Propelleren gjør noe som egentlig er en svært komplisert multitask problemstilling om til noe veldig enkelt. Løp og kjøp folkens!

  1. Innledning
  2. MCU (det er den du leser nå)
  3. Sensor
  4. GPS
  5. Display
  6. Oppsummering