Programmeerbare besturing Microcontrollers komen we overal tegen: in huishoudelijke apparatuur, in consumentenelektronica, in voertuigen, in meetapparatuur en zelfs in onbemande ruimteschepen. Ze doen overal dingen die door een programma worden opgedragen. Het is spannend om ook zelf eens een eenvoudig besturingsprogramma te schrijven. De eerste stap is altijd een microcontroller of processor te zoeken die zo goed mogelijk bij de gewenste opgave past.
Inhoudsopgave 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Inleiding Wisselend knipperlicht Binaire teller en PWM-uitvoer Analoog/digitaal omzetter Toevalsgenerator Pulslengtemeting Programma's uitlezen Programma's invoeren Herstellen van de voorbeeldprogramma's TPS basisinstructies Rekenen met variabelen Sprongen en vertakkingen Overzicht van de instructies Tellussen Vergelijkingen AND, OR en XOR Subroutines Schemerschakelaar LED-dimmer Cijferslot Appendix 3
1 Inleiding Het principe van de TPS controller is eenvoudig. Er zijn vier digitale ingangen E1 t/m E4 en vier digitale uitgangen A1 t/m A4. Daarnaast zijn er twee analoge ingangen AD1 en AD2 en een quasianaloge PWM-uitgang. Op de reset-ingang kan een reset-toets worden aangesloten om het programma aan het begin te resetten. De controller wordt met behulp van drie AA-batterijen voorzien van een spanning van ca. 4,5 V en kan werken in een bereik van 2,2 V tot 5,5 V.
Afb. 1: basisschakeling van het systeem Afb.
Bij levering zijn al enkele standaardprogramma's (default) in de TPS controller opgeslagen die direct kunnen worden gestart. Daarom is mogelijk om de controller stap voor stap in gebruik te nemen. Zorg dat u eerst vertrouwd raakt met de hardwarefuncties en begin daarna pas met eigen programma's. Bij de eerste tests worden kleine programma's gestart die al kant en klaar in de controller zijn opgeslagen. De bijbehorende programmalistings geven een eerste indruk van de mogelijkheden.
Gebruik de bovenste en de onderste spanningsrail op de insteekprintplaat voor de massaaansluiting GND. Hierop wordt de zwarte kabel van de batterijhouder, dus de minpool, aangesloten. De plusaansluiting VCC wordt met de rode aansluitkabel van de batterijhouder verbonden. Verkeerde polariteit moet absoluut worden voorkomen omdat de controller daardoor onherstelbaar kan worden beschadigd. Bouw een kort stukje draad in als trekontlasting.
voorbeeldprogramma's weer worden hersteld. Adres Instructie Gegevens Commentaar 20 1 1 LED 1 21 2 8 Wacht 500 ms 22 1 8 LED 8 23 2 8 Wacht 500 ms 4 Spring –4 24 3 Listing 1: wisselend knipperlicht Wanneer u niet het gewenste resultaat krijgt moet u eerst de juiste polariteit van de LED's controleren. Het is ook handig om de verschillende spanningen te meten. Maak bv. gebruik van een digitale multimeter met een bereik tot 20 V en laat de minpool aangesloten op GND.
Afb. 5: gebruik van de PWM-LED Afb.
Schakel E1 aan GND. Hiermee start, na een reset, het tweede voorbeeldprogramma. Dit programma telt de toestand van de uitgang binair omhoog. De toestanden 0000 (decimaal 0) tot 1111 (decimaal 15) worden doorlopen. Het programma gebruikt de variabele A voor een eenvoudige optelling en weergave aan de digitale uitgangen en de PWM-uitgang. De instructies 7 en 5 bezitten subfuncties die als gegevens worden geschreven.
A2: 400 ms A3: 800 ms A4: 1.600 ms Daarnaast worden de oplopende getalswaarden ook aan de PWM-uitgang (Puls Width Modulation: Pulsbreedte modulatie) uitgevoerd. Het PWM-signaal is een blokvormig signaal met een frequentie van ca. 16 kHz. De pulslengte wordt daarbij zo gestuurd dat de verhouding tussen puls en pauze de gemiddelde inschakelduur en daardoor de helderheid van de LED bepaald. De helderheid van de hier aangesloten LED wordt in 15 stappen tussen nul en de maximale helderheid aangestuurd.
Afb. 8: afgevlakte PWM gelijkspanning 4 Analoog/digitaal omzetter Met een verbinding E2 aan GND en een druk op de reset-toets start een klein voorbeeldprogramma met een analoog/digitaal omzetter (A/D-omzetter). De analoge spanning aan de analoge ingang AD1 wordt gemeten en omgezet in een digitale cijferwaarde. Omdat de TPS-controller met 4-bits waarden werkt, is het resultaat van de analoog/digitaal omzetting een getal in het bereik van 1 tot 15.
Afb. 9: aansluiten van de lichtsensor Afb.
Het voorbeeldprogramma heeft vanwege de uitvoer aan de digitale uitgangen en de PWM-uitgang grote overeenkomst met het programma uit het voorgaande hoofdstuk. Op de eerste regel staat echter de instructie om een analoge waarde om te zetten. Adres Instructie Gegevens Commentaar 2A 6 9 A = AD1 2B 5 4 Port = A 2C 5 9 PWM = A 2D 2 6 Wacht 100 ms 4 Spring –4 2E 3 Listing 3: AD-omzetter en PWM-uitgang Test het programma met verschillende belichtingen van de sensor.
Afb. 11: starten van de toevalsgenerator Afb.
Het programma maakt gebruik van een voorwaardelijke sprongopdracht. Wanneer de ingangstoestand van S1, één is, wordt de volgende instructie overgeslagen. Wanneer u dan op de toets drukt, is de toestand nul waardoor de variabele A met één wordt opgehoogd. Dit leidt tot sneller ophogen van de uitgangstoestand. Wanneer u de toets loslat blijft de laatste tellerstand staan. Vanwege de hoge telsnelheid, heeft u geen invloed op het resultaat zodat de uitkomst toevallig is.
Afb. 13: E4 aan GND Afb.
In de toestand S1 = 0, dus bij ingedrukte toets, loopt er een tijdmeting. Bij de wachttijd van 5 ms komt nog eens ca. 5 ms voor de uitvoering van de in totaal vijf instructies van de tellus. De tijdseenheid van de meting is daarom 10 ms.
Afb. 15: S1 en S2 voor de programmeermodus Afb.
• • • • • • • • • Eerste toetsdruk S2 Adres (laagste vier bits) weergeven, 300 ms Weergave uit, 300 ms Instructie weergeven Tweede toetsdruk S2 Gegevens weergeven Derde toetsdruk S2 Volgende adres weergeven, 300 ms etc. Wanneer u bijvoorbeeld een bestaand programma met vijf stappen alleen wilt bekijken en niet wijzigen, komt u met 10x indrukken van S2 aan het einde.
EEPROM. Iets vergelijkbaars kent u mogelijk van uw auto: wanneer u de motor start, gaan voor een moment het licht en de radio uit. U kunt een bestaand programma ook slechts op één plek veranderen. Met S2 bladert u dan naar de gewenste plaats en u verandert met S1 de instructie of de gegevens, die vervolgens met S2 worden opgeslagen. Voor een eerste test wordt een programma ingevoerd met slechts twee instructies. Hiermee worden drie LED's ingeschakeld en start een eindeloze lus.
gaat de controller er van uit dat er nog geen programma is ingevoerd. In dat geval wordt de EEPROM automatisch gevuld met de voorbeeldprogramma's. Deze functie is eigenlijk bedoeld om de controller bij de eerste start te voorzien van de voorbeeldprogramma's in de EEPROM maar kan ook op elk moment worden gebruikt om de oorspronkelijke toestand te herstellen.
bitmasker voor de uitvoer en de wachttijden zijn veranderd. Adres Instructie Gegevens Commentaar 00 1 1 A1–4 = 0001 01 2 7 Wacht 200 ms 02 1 4 A1–4 = 0100 03 2 7 Wacht 200 ms 04 3 4 Spring –4 Listing 9: knipperprogramma In de verkorte hexadecimale notatie ziet het programma er nu als volgt uit: 11 27 14 27 34 Op basis van de eerste drie instructies kan er al een groot aantal programma's worden geschreven, Analyseer en test de drie volgende programma's.
04 1 4 LED’s 0100 05 2 8 Wacht 500 ms 06 1 8 LED’s 1000 07 2 8 Wacht 500 ms 08 1 4 LED’s 0100 09 2 8 Wacht 500 ms 0A 1 2 LED’s 0010 0B 2 8 Wacht 500 ms 0C 3 C Spring –12 11 28 12 28 14 28 18 28 14 28 12 28 3C Listing 11: looplicht 2, heen en weer Een tijdschakelaar kan met een wachtopdracht een vertraging bevatten van maximaal een minuut. Aan het einde staat een terugsprong met een sprongsfstand 0, dus een eindeloze lus zonder inhoud die dient als einde van het programma.
11 Rekenen met variabelen Tot nu toe werden voor de parameters voor de verschillende instructies alleen constante getalswaarden gebruikt. Dat is zinvol wanneer een programma altijd op dezelfde manier moet aflopen. Complexere programma's werken daarentegen met variabele gegevens. Dan kan er bijvoorbeeld een berekening zoals A = A + B worden uitgevoerd. Afhankelijk van de inhoud van de variabele A en B zal er steeds iets anders uitkomen. Met het resultaat kunnen bv.
65: A = Din.0 66: A = Din.1 67: A = Din.2 68: A = Din.3 69: A = AD1 6A: A = AD2 71 –7A: A = uitvoer 1–10 71: A = A + 1 72: A = A – 1 73: A = A + B 74: A = A – B 75: A = A * B 76: A = A / B 77: A = A And B 78: A = A Or B 79: A = A Xor B 7A: A = Not A Een voorbeeld voor het gebruik van de variabele A vindt u bij de programmavoorbeelden in hoofdstuk 3. Het programma is hier op adres nul gezet en iets uitgebreid. Er is een gedefinieerd begin bijgekomen met de waarde 0 in de variabele A.
02 7 A A = Not A 03 5 9 PWM = A 04 2 6 Wacht 100 ms 05 3 5 Spring –5 69 54 7A 59 26 35 Listing 14: inverteren 12 Sprongen en vertakkingen Tot nu toe werd er alleen gebruik gemaakt van de eenvoudige terugsprong (instructie 3) die maximaal 15 adressen achteruit kon springen. Nu komt daar de absolute sprong (jump) bij. Omdat het doeladres voor de sprong met maar 4 bits kan worden opgegeven, is er een extra instructie beschikbaar om het high-nibble van het adres te bepalen.
C5: if Din.1 = 1 then Adr = Adr + 1 C6: if Din.2 = 1 then Adr = Adr + 1 C7: if Din.3 = 1 then Adr = Adr + 1 C8: if Din.0 = 0 then Adr = Adr + 1 C9: if Din.1 = 0 then Adr = Adr + 1 CA: if Din.2 = 0 then Adr = Adr + 1 CB: if Din.
Voer het programma in en test het. De reactietijd is nu aanzienlijk sneller. De tijdeenheid bedraagt nu ca. 5 ms. Het oorspronkelijke voorbeeldprogramma bevindt zich nog in het geheugen vanaf adres 34h omdat alleen de onderste adressen overschreven zijn. Schrijf een klein programma dat alleen een sprong naar dit adres bevat. Hier moet eerst pagina 3 worden aangewezen. De dan volgende absolute sprong met het opgegeven adres wijst dan naar het werkelijke adres 34.
1 2 3 4 A 10 2s 10 10 B 11 5s 11 5 6 7 9 A B C D A A A Din.2 = 0 A 11 B B B Din.3 = 0 B A= AD2 A = Not A 8 C 12 10 s 12 12 C C C S1 = 0 C D 13 20 s 13 13 D D D S2 = 0 D E 14 30 s 14 14 E E E S1 = 1 E F 15 60 s 15 15 F F F S2 = 1 F E 14 Tellussen Een opdracht moet bv. exact vijfmaal worden uitgevoerd. Hiervoor wordt gebruik gemaakt van een tellus. In dit geval wordt een sprongopdracht exact vijf maal uitgevoerd, daarna niet meer.
De tellus kan echter ook andersom worden gebruik, zodat niet achteruit- maar vooruit wordt gesprongen. Dit keer wordt het programma daadwerkelijk vijf maal uitgevoerd wanneer C aan het begin de waarde 5 krijgt toegewezen. Het overgeslagen adres 04 bevat dan een relatieve sprong naar zichzelf en daarmee een eindeloze lus die dient als einde van het programma.
Adres Instructie Gegevens Commentaar 03 6 9 A = AD1 04 C 1 Skip if A>B 05 9 8 Adr 08 06 1 F LED’s 1111 07 3 4 Adr 03 08 1 0 LED’s 0000 09 3 6 Adr 03 45 51 80 69 C1 98 1F 34 10 36 Listing 19: eenvoudige schemerschakelaar. Test het programma door de lichtsensor met de hand meer of minder af te dekken. U zult vaststellen dat aan de basisfunctie is voldaan.
Listing 20: toepassing van de AND-functie Verander het programma en test ook de andere logische vergelijkingen. De OR-functie (of) kan worden gebruikt om bepaalde ingangstoestanden altijd op 1 te zetten 64 51 43 78 54 35 1010 OR 0011 = 1011 Met de XOR-Funktion (Exclusive OR, 79) kunnen individuele bits worden geïnverteerd: 64 51 43 79 54 35 1010 XOR 0011 = 1001 17 Subroutines Wanneer delen van een programma meerdere keren worden gebruikt, worden die in een subroutine geschreven.
50: subroutine: geluid lang 52: subroutine: geluid kort 53: subroutine: geluid willekeurig, lengte in A 60: subroutine: wachten tot indrukken van toets aan S1 68: subroutine: wachten tot indrukken van toets aan S2 70: subroutine: getallen invoeren met S1 en S2 De subroutine vanaf adres 60 wordt nu gebruikt om een teller op te bouwen die via de toets S1 wordt aangestuurd. De teller begint op 0.
02 5 1 B=A 03 6 9 A = AD1 04 C 1 Skip if A>B 05 1 0 LED’s 0000 06 4 9 A=9 07 5 1 B=A 08 6 9 A = AD1 09 C 2 Skip if A
0C 4 0 A=0 0D 5 1 B=A 0E 6 2 A=C 0F C 1 Skip if A>B 10 9 0 Spring 00 11 C E Skip if S1 = 1 12 7 2 A=A–1 15 9 0 Spring 00 80 59 27 52 4F 51 62 C2 9B CF 71 52 40 51 62 C1 90 CE 72 90 Listing 24: helderheidsregeling 20 Cijferslot Het hier beschreven cijferslot schakelt de PWM-uitgang in wanneer de gebruiker de juiste getallen heeft ingevoerd. De invoer van de getallen moet exact volgens het geprogrammeerde patroon via de toetsen S1 en S2 gebeuren.
De invoer van een getal is ook beschikbaar als kant en klare subroutine vanaf adres 70. In plaats van de eindeloze lus in regel 08 staat hier een RET-instructie. De subroutine wordt met het resultaat van de invoer in A verlaten. Het volgende cijferslot roept de getalinvoer driemaal op en vergelijkt het resultaat met de voorgedefinieerde getallen. In dit voorbeeld luidt de correcte invoer 3, 5, 2. Daarna wordt de PWMuitgang met de waarde 15 volledig opengezet.
21 Appendix Listings van de voorbeeldprogramma's Adres Instructie Gegevens Commentaar 00 6 4 A = Din 01 5 1 B=A 02 4 E A = 1110 03 8 0 Pagina 0 04 C 3 A = B? 05 9 8 Spring 08 06 8 2 Pagina 2 07 9 5 Spring 25, “Omhoogtellen” 08 4 D A = 1101 09 8 0 Pagina 0 0A C 3 A =B ? 0B 9 E Spring 0E 0C 8 2 Pagina 2 0D 9 A Spring 2A, »AD/PWM« 0E 4 B A = 1011 0F 8 1 Pagina 1 64 51 4E 80 C3 98 82 95 4D 80 C3 9E 82 9A 4B 81 Pagina 0: Kiezen en starten van de
Adres Instructie Gegevens Commentaar 19 9 4 Spring 34, “Stopwatch S1” 1A 4 3 A = 0011 1B 8 2 Pagina 2 1C C 3 A = B? 1D 9 0 Spring 20 “Wisselend knipperlicht” 1E 8 4 Pagina 4 1F 9 0 Spring 40 “Stopwatch S1/S2” C3 94 83 90 47 81 C3 9A 83 94 43 82 C3 90 84 90 Pagina 1: Kiezen en starten van de voorbeeldprogramma's Adres Instructie Gegevens Commentaar 20 1 1 0001 “Wisselend knipperlicht” 21 2 8 Wacht 500 ms 22 1 8 1000 23 2 8 Wacht 500 ms 24 3 4 Spring –4
Adres Instructie Gegevens Commentaar 30 5 4 Port = A “Toeval” 31 C E S1 = 1? 32 7 1 A=A+1 33 3 3 Spring –3 34 2 2 Wacht 5 ms “Stopwatch S1” 35 C C S1 = 0? 36 3 2 Spring – 2 37 4 0 A=0 38 2 2 Wacht 5 ms 39 7 1 A=A+1 3A 5 4 Port = A 2B C E S1 = 1? 3C 3 4 Spring –4 3D 3 9 Spring –9 3E F F - 3F F F - 54 CE 71 33 22 CC 32 40 22 71 54 CE 34 39 FF FF Pagina 3: voorbeeldprogramma's: toevalsgenerator stopwatch S1 Adres Instructie Gegevens Commen
Adres Instructie Gegevens Commentaar 4C F F - 4D F F - 4E F F - 4F F F - 86 D0 40 71 54 23 CD 34 D8 40 54 3B FF FF FF FF Pagina 4: voorbeeldprogramma's stopwatch start/stop Adres Instructie Gegevens Commentaar 50 4 F A = 15 “Geluid lang” 51 9 3 Adr 03 52 4 5 A = 5 “Geluid kort” 53 5 3 D = A “Geluid variable” 54 1 9 A4 = 1 55 1 1 A4 = 0 56 2 1 2 ms 57 1 9 A4 = 1 58 1 1 A4 = 0 59 2 1 2 ms 5A 1 9 A4 = 1 5B 1 1 A4 = 0 5C 2 0 1 ms 5D B
Adres Instructie Gegevens Commentaar 60 2 3 Wacht 10 ms “Wacht S1” 61 C E S1 = 1? 62 3 2 Spring –2 63 2 3 Wacht 10 ms 64 C C S1 = 0? 65 3 1 Spring –1 66 E 0 Return 67 F F - 68 2 3 Wacht 10 ms “Wacht S2” 69 C F S2 = 1? 6A 3 2 Spring –2 6B 2 3 Wacht 10 ms 6C C D S2 = 0? 6D 3 1 Spring –1 6E E 0 Return 6F F F - 23 CE 32 23 CC 31 E0 FF 23 CF 32 23 CD 31 E0 FF Pagina 6: subroutine wacht S1 en wacht S2 Adres Instructie Gegevens Commentaar 70
Adres Instructie Gegevens Commentaar 7C 2 3 Wacht 10 ms 7D C C S1 = 1? 7E 3 1 Spring – 1 7F 3 C Spring –12 CC 31 40 54 23 CE 32 CF E0 CC 33 71 23 CC 31 3C Pagina 7: subroutine toetsinvoer Instructietabel 1 2 3 Port = Wait Jump – 0 0 1 ms 0 1 1 2 ms 4 5 6 7 A= ... = A A = ... A = ... B=A A=B A = A+1 0 1 1 8 9 A B C D Page Jump C* D* Skip if ...
Colofon © 2012 Franzis Verlag GmbH, 85540 Haar www.elo-web.de Auteur: Burkhard Kainka ISBN 978-3-645-10104-2 Geproduceerd in opdracht van Conrad Electronic SE, Klaus-Conrad-Str. 1, D-92240 Hirschau . Alle rechten voorbehouden, inclusief fotomechanische reproductie en opslag in elektronische media.