Het doel van deze serie artikelen is om je kennis te laten maken met de Parallax Propeller 2. In dit artikel zullen we onze mogelijkheden uitbreiden om strings te versturen, zoals je dat op je Arduino systemen doet met print. In deze eerste opdracht versturen we op de klassieke manier wat debuginformatie. Om samen te vatten waar we zijn: Onze code is in staat om een enkel karakter te verzenden met 115200 baud, 8 databits, geen pariteit en een stop bit. De volledige code staat in figuur 1 en kan worden gedownload op [1].

Propeller 2: code for sending a character
Figuur 1: Code voorbeeld voor het versturen van een karakter.

Als we nu "Code alive" willen verzenden, zoals getoond in Figuur 2, zal dit resulteren in een heleboel aanroepen naar onze tx()functie, voor elk karakter één. Zodra we zich herhalende coderegels zien, denken we natuurlijk direct aan het veralgemenen van de taak. Gekopieerde delen van codefragmenten in een project kun je beter vermijden, vooral als je later iets moet toevoegen of de code moet repareren. We zullen een functie bouwen die een string als argument neemt, deze in losse karakters knipt en deze één voor één naar onze tx()functie stuurt. Dit klinkt eenvoudig, en als je genoeg gecodeerd hebt, zou het dat in theorie ook moeten zijn. Maar als je SPIN2 -of SPIN in het algemeen- voor het eerst gebruikt betekent dit wat meer lees- en knutselwerk.

Send text character by character
Figuur 2:Karakter voor karakter tekst versturen.

Strings versturen

Omdat strings eigenlijk bestaan uit een opeenvolgende serie geheugenplaatsen die alle karakters na elkaar bevat, afgesloten door een binaire nul ("\0"), zal geprobeerd worden om het startadres van dit geheugen door te geven aan een functie. Als we C/C++ gebruiken, doen we dat met de &-operator in combinatie met het eerste element. In SPIN2 wordt dit qua syntaxis een beetje anders aangepakt, maar het werkt grotendeels hetzelfde. Wat anders is, is de manier waarop we de functie en het argument zelf declareren. Het type variabele dat aan onze functie wordt doorgegeven is niet gespecificeerd. Als we geen type specificeren zal SPIN2 aannemen dat het een lang type is (32 bits). In sommige gevallen kan het handig zijn om deze automatische aanname in SPIN2 te gebruiken voor variabelen die aan een functie worden doorgegeven, maar het kan ook enkele ongewenste neveneffecten hebben. In ons geval is het het geheugenadres voor onze string en zal het prima werken. Wat anders is, is de manier waarop we lokale variabelen declareren. Het is duidelijk te zien dat alle variabelen, hier c, gedeclareerd moeten worden in de kop van de functie. Dit wordt gedaan met een | na het haakje aan het einde van die regel. Als we meer dan één variabele nodig hebben, zetten we ze in die regel en scheiden we ze met ,. Figuur 3 toont hoe de functiekop eruit zal zien.

Function head
Figuur 3: Functie-kop.

Binnen de functie (zie figuur 4) moeten we de gegevens zorgvuldig lezen, byte voor byte. We hebben de c := byte[s++] opdracht die wat uitleg behoeft. Onze variabele c heeft momenteel geen type, of beter, een standaardtype. Zonder de byte[] te gebruiken zouden we 32 bits (uint32_t variable) in één keer lezen; door nu byte[s++] te gebruiken, lezen we één byte op de locatie van 's', op het geheugenadres waar de string begint. De combinatie van s++ met de byte[] zal ervoor zorgen dat het adres slechts met één byte wordt verhoogd. Als we dit niet doen, zullen alle operaties 32 bits breed zijn. Omdat er nu voor gezorgd is dat we byte voor byte lezen, gaan we kijken naar het repeat-while statement. Zolang c ongelijk (<>) is aan binair nul zal alles binnen de repeat-while loop worden herhaald.

Convert types
Figuur 4: Typen converteren.

Binnen de lus, getoond in figuur 5, hebben we onze tx() functie die één byte zal versturen waarna in de volgende regel het volgende byte wordt opgehaald en opgeslagen in onze variabele c. Daarna gaat de lus verder en begint te controleren of nog steeds ongelijk binair nul is.

 tx() function
Figuur 5: Byte voor byte wordt de tx() functie aangeroepen.

Dit betekent dat we nu onze prints() op zijn plaats hebben en in staat zijn om strings via UART naar een aangesloten PC of logic analyzer te sturen. Het volgende is het lezen van de status van I/O pinnen en deze uitvoeren via de UART. Lees de status van een I/O pin. Hoe moeilijk kan het zijn? Wel, in theorie is het heel gemakkelijk. Soms maken de leuke extra's het verschil en tonen de machtige hoeveelheid mogelijkheden die in de slimme pinnen zijn verpakt


Meer over de Propeller 2 en Verwante Onderwerpen

Wilt u meer weten over onderwerpen als Parallax' Propeller 2 en SPIN2? Abonneer u vandaag nog op Elektor en mis nooit meer een artikel, project of tutorial.