ROBOTICS CCFZ PIC – PROGRAMMEREN Door H. Dorst, m.m.v. Joop van Schaik. Versie 13 mei 2009 Inleiding Het programmeren van een PIC­processor gebeurt door het invoeren van instructies (opdrachten). De lijst instructies, de Code kan van diverse aard zijn. Wie al geprogrammeerd heeft voor de BoE­bot van Parallax deed dat in PBasic, een Basic­ taal van Parallax. Basic is een eenvoudig te leren programmeertaal. Voor de PIC­processors is er ook een Basic: PIC­Basic of PIC­Basic Pro. De laatste is uitgebreider. PIC­Basic en PIC­Basic Pro worden geleverd door Microchip voor respectievelijk $ 100,­ en $ 250,­. De ingevoerde code wordt door het hulpprogramma omgezet in een reeks getallen in het achttallig stelsel: een hexadecimale code, of HEX­code. Dat omzetten heet compileren en de programma’s zijn dan ook een Basic­compilers. PIC­processors worden veelal geprogrammeerd in machinetaal met daarvoor geschikte, goedkope of gratis compilers. Het voordeel van het programmeren in machinecode is een veel grotere efficiency van het programma. Je leert veel meer van het werken in machinecode, maar het vereist wel veel meer studie. Onze groep Robotics CCFZ van de Computer Club Fort­Zeekant (www.ccfz.nl) werkt met de compiler van de maker van de PIC­processors Micro Chip: MPLAB IDE, dat gratis van hun site, www.microchip.com kan worden gedownload. Om de HEX­code in het geheugen van de PIC­chip te krijgen is een aparte schakeling nodig, het Programmer Carrier Board, kortweg Programmer genoemd. Microchip levert hiervoor de EPIC­Programmer, die aangesloten wordt op het Programmer Carrier Board, waarop de PIC­processor is gemonteerd. De EPIC­ programmer kost ca. $ 60,­. Wij gebruiken de Whisp 648, verkrijgbaar bij VOTI om de HEX­code in de PIC­ processor te krijgen. Kost inc.BTW en verzendkosten ca € 40,­. Het programma, dat daarbij hoort is BumbleBee, dat van de site van VOTI gratis kan worden opgehaald. Behalve het prijsvoordeel kan deze Programmer ICP of ICSP werken. (ICP = In Circuit programmer.) Dat wil zeggen, dat de PIC­processor in de schakeling, waarin die moet gaan werken, kan blijven zitten. In de EPIC­programmer moet je de PIC steeds uit de schakeling halen en in de Programmer plaatsen. Kortom: Wij gebruiken als gereedschap: ­ voor het programmeren: MPLAB IDE van Microchip (gratis) ­ voor de overdracht van het programma naar de processor: Whisp 648 (ca. € 40,­) ­ USB­serieel­convertor (Voti)(€ 17,­) ­ Bumble Bee (Voti)(gratis). www.ccfz.nl ROBOTICS CCFZ Natuurlijk moeten ook de PIC met de benodigde eigen schakelingen worden aangeschaft. Met een breadboard om de proefschakelingen op uit te proberen. Onderdelenkeuze Robotics CCFZ organiseert jaarlijks een robot­snelheidswedstrijd, waarbij racerobots een uitgezet circuit zo snel mogelijk, eerst alleen, later allen tegelijk, moeten afleggen. De eigenaar van de robot, die het er het kortst over doet, wint de wisselprijs met een geldbedrag. Er zijn in totaal 9 prijzen te winnen. We beginnen met de PIC16F84(A) op een breadboard 450 contacten (€ 2,97), een kristal van 4 MHz met twee condensators (€ 0,86) en een spanningsreguator (€ 0,35), allemaal verkrijgbaar bij VOTI. Dit kleine board kan in de racerobot worden gemonteerd. Een vergelijkbare beschrijving als deze staat op http://home.hetnet.nl/~ba8tian/ picnodig.htm. Ook http://www.circuitsonline.net/artikelen/view/8 is interessant. Daar wordt voor deze handleiding ook gebruik van gemaakt. Maar kijk zelf ook om ook eens van een ander te horen hoe die alles aanpakt. Om met elektronica ook beter mee uit de voeten te kunnen is het boek: “Elektronica voor Dummies” best handig om als naslagwerk te dienen. Aansluitingen Een aantal aansluitpunten van de processor moet van een specifieke schakeling worden voorzien. Natuurlijk moet de stroomvoorziening worden geregeld (aarde en 5 volt op resp Vss en VDD. NB. Om de punten terug te vinden op de chip is het nuttig om het Datasheet van je processor van internet op te halen. Druk het voorblad en het aansluitschema af. Dit is het begin van jouw dossier van je chip. Alles afdrukken heeft op dit moment nog geen zin. Bouw je dossier naar behoefte op. Googelen naar bijvoorbeeld PIC 16F84 geeft een lijstje opties, waaronder het datasheet van Microchip. Klok en stroomvoorziening Eerst een aantal “huishoudelijke” gegevens over de aansluitingen. Aansluiting van het kwartskristal voor het verkrijgen van een stabiele frequentie: In plaats van 2 x 22 pF wordt ook wel 2 x 33 of 39 pF aanbevolen. www.ccfz.nl 2 ROBOTICS CCFZ Aansluiting van de 5 Volt (VDD) spanningsregeling: Als voor de spanningsbron een batterij van 9 of 12 volt wordt gebruikt, dan is C1 bijvoorbeeld 1 μF; C2 = 0,1 μF. μ is hierin de aanduiding voor “micro”, d.w.z. duizendste deel. F is de eenheid van capaciteit, Farad, voor condensators. Zonder koeling van de LM7805 kan hier max. 100 mA (= 0.1 A) stroom worden afgenomen. Vin is de niet geregelde ingangsspanning, bijvoorbeeld van een batterij, VSS is de minaansluiting, de massa of aarde. VDD is de goede 5 volt­aansluiting voor de PIC­ chip. Heb je een voeding vanuit een transformator, dan moet je nadere maatregelen nemen (gelijkrichten, grotere condensator, meer afvlakken). Denk er wel om, dat de LM7805 zelf ook nog minstens 1,5 volt gebruikt om goed te kunnen werken. MCLR Bij het begin van het laden van een nieuwe versie van het programma, of van een geheel nieuw programma moet de oude inhoud van het chipgeheugen worden gewist. Daarvoor moet kort een spanning van tenminste 11 V op de MCLR­ aansluiting worden geplaatst. Die spanning komt grotendeels uit de Whisp. Vijf volt ervan kan worden toegevoegd door via een tamelijk grote weerstand van 2 – 15 kΩ. Om te voorkomen, dat de spanningspiek uit de Whisp over deze weerstand gedeeltelijk verloren zou gaan moet een diode, bijvoorbeeld de 1N4148 worden toegevoegd. Het schema ziet er zo uit: www.ccfz.nl 3 ROBOTICS CCFZ OSC1 (16), OSC2 (15), VSS (5), VDD (14) en MCLR (4) zijn te vinden op de aansluitschema’s in het Datasheet van de PIC­processors. Op de kleuren van de Whisp komen we later terug. Hardware bouwen Het je een klein insteekbordje (“breadboard”), dan kun je de processor nu monteren met de hierboven beschreven schakelingen. Als je aan de b­poort (zie datasheet) ook nog een aantal lampjes via een weerstand (300 – 500 ohm) aansluit (groene draadjes), dan kan het geheel er uitzien als op de foto is te zien. Poorten Merk op, dat in het Datasheet de overige aansluitpunten aangeduid worden met R, gevolgd door A, B, C, etc., allemaal aparte poorten, die elk weer opgedeeld zijn in een aantal aansluitpunten, genummerd 0, 1, 2, 3, enz. Al deze aansluitpunten www.ccfz.nl 4 ROBOTICS CCFZ kunnen als ingang of als uitgang worden geprogrammeerd. Dat weer wil zeggen, dat de processor kan aflezen welke externe situatie aan de processor wordt aangeboden (ingang, 0 of 1), dan wel welke situatie aan de aansluiting door de processor naar buiten wordt gestuurd (uitgang, 0 of 1). Het door ons te maken HEX­bestand wordt bij het invoeren op de chip ingevoerd via twee aansluitingen: de programma­clock­aansluiting (Whisp­kleur groen)en de programma­data­aansluiting (Whisp­kleur blauw). Voor de meeste PIC’s, dus ook voor de PIC16F84 zijn dit aansluitpunten B6, de klok­ en B7, de data­aansluiting. Op het schema van het Datasheet kun je vinden, dat het voor de PIC16F84A de pennen 12 en 13 betreft. Kijk dat even na. De foto toont het circuit aangesloten op de programmer de Whisp 648. Buiten de foto om lopen de aansluitdraden van links naar de onderkant van de foto. De kleuren van de draden vergemakkelijken het aansluiten, zeker met het kleurenschema van de handleiding. We gaan programmeren, dat een LED­lampje even oplicht. Dat kan door de uitgangen, waarop ze zijn aangesloten, gedurende die tijd een logische 1 (5 volt) te maken. De overige tijd dienen ze logisch nul (0 volt) te zijn. Op de Whisp648 komen we verderop nog terug. In het vorige is aangenomen, dat de processor alleen digitale signalen verwerkt. Sommige processors kunnen ook analoge signalen be­ en verwerken, waarbij de spanning tussen 0 en 5 volt kan variëren. Komen we later zonodig op terug. Bij digitaal gebruik is de spanning ofwel 0 volt voor “0”, en 5 volt voor “1”. PIC MPLAB IDE­compiler Als je de Programmer, de Whisp648 al wel hebt besteld, maar nog niet ontvangen en in elkaar gezet, dan kun je toch al wel met het programmeren in MPLAB IDE beginnen. MPLAB IDE, kortweg MPLAB kan jouw programma controleren en ook simuleren. Na het ophalen van MPLAB wordt het ZIP­bestand uitgepakt. Er wordt een locatie voor het programma op de harde schijf van je computer voorgesteld, waar het programma wordt opgeslagen. Daarna wordt nog een apart programma geïnstalleerd. Alles gewoon zoals gebruikelijk is voor een dergelijk programma. www.ccfz.nl 5 ROBOTICS CCFZ Na het opnieuw opstarten kunnen we beginnen. De icoon van MPLAB IDE staat op je bureaublad. Dubbelklik maar. Haal van de site van Microchip ook de MPLAB IDE User Guide op. Op de 288 pagina’s tekst staat veel informatie. Het is niet nodig om al die bladzijden af te drukken. Volstaan kan worden met het opslaan van het .pdf­bestand, zodat het later gemakkelijk bekeken kan worden. Er is nog iets, dat voor het programmeren uitgelegd moet worden. De PIC16F84A heeft een geheugen van 8 bits. Om de waarde van elk bit te kunnen invoeren en/of uitlezen staat een combinatie van twee cijfers/letters ter beschikking: voor de eerste vier bits één combinatie en voor de laatste vier bits nog een. De waarde van elk bit kan 0 of 1 zijn. Per vier bits zijn er dan 16 mogelijkheden. Kijk maar: Bit 3 Bit 2 Bit 1 Bit 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 HEX­ aanduiding 0 1 2 3 4 5 6 7 8 9 A B C D E F Voorbeelden voor de waarde van de bits: 8F voor 10001111 of FF voor acht keer een één. Om aan te geven dat er in het achttallig stelsel geteld wordt, wordt hieraan een speciale aanduiding toegevoegd: 0x8F of 8Fh en 0xFF of FFh. Beide aanduidingen kunnen worden gebruikt in de code, de compiler begrijpt wat je bedoelt. Merk op, dat aan de bovenkant van de tabel de kolommen vanaf links Bit 3 tot rechts Bit 0 is aangeduid. Net als in het tientallig stelsel is het meest rechtse cijfer het minst belangrijk, met het meest linkse worden de grootste stappen gemaakt: het rechtse cijfer is het minst significant, het meest linkse het meest significant. Het is ook mogelijk om in het tweetallig stelsel te programmeren. Daarbij wordt geteld alsof er alleen maar 0 en 1 bestaat. Een regel in de tabel is in wezen geteld in het tweetallig stelsel 8Fh komt dus overeen met 10001111b, van binair. www.ccfz.nl 6 ROBOTICS CCFZ Programmeren Van MPLAB is het gemakkelijk om een drietal vensters beschikbaar te hebben. Het zijn: ­ het Programma Window, waarin de code kan worden ingetypt, of naar toe gekopieerd ­ Het Special Function Window ­ File Register. Soms wil je het Clock­venster bekijken om na te gaan hoe snel het programma zijn werk verricht. Klik op File New en een nieuw Window “Untitled” ontstaat. Dit is nu het beginscherm. Klik nu op File en Save as… en tik een naam in voor je eerste project. Let er op, dat de extensie .asm wordt. www.ccfz.nl 7 ROBOTICS CCFZ Sla op. Hiermee kent MPLAB jouw eerste project. Je ziet het programma­window met de naam van het project en de eerste regel al genummerd. Geef onder “Debugger” en “Settings” ook meteen de kristalfrequentie op. In ons geval is dat 4 MHz. Wil je later iets over de snelheid weten, dan is dat maar gedaan. Een programma begint altijd met een koptekst, waarin is vastgelegd met welke chip wordt gewekt en hoe de verdere configuratie, welke opbouw rond de chip, aanwezig is. Op de bovenbalk vind je “configure”. Door te kiezen voor “Select device” en onder “Device” kun je de chip uitzoeken. Stel in op “PIC16F84A”, als je die hebt. De groene mogelijkheden staan ter beschikking. Leuk is te constateren, dat MPLAB SIM groen is: de simulator kunnen we gebruiken. Een andere processor kan andere mogelijkheden hebben. Sluit dit venster. Onder “Configure” kies nu “Configuration Bits”. Verwijder vinkje van ”Configuration Bits set in code”. Klik op de regel “Oscillator” en kies daarvan “XT”. Dat is nodig, want wij gebruiken een kwartskristal om de klok te regelen. De rest laten we staan. We zien op het Adres 2007 de waarde 3FFD. Dit is de code voor de configuratie, die we gebruiken. Tegen de tijd, dat we deze informatie nodig hebben, kunnen we die even hiervandaan ophalen. Sluit ook dit venster. Nu moeten we zorgen, dat de hulpprogramma’s, de “Tools” door MPLAB terug te vinden zijn. Onder “Project” kies “Select Language Toolsuite …”. Als je het programma op de default, standaard plaats hebt opgeslagen, dan vindt MPLAB MPASM, MPLINK en MPLIB op C:\ProgramFiles\Microchip\MPASM en MPLINK en MPLIB automatisch. Anders moet je met “Browse” het juiste pad opgeven. Klik op “OK”. Als je klaar bent, sluit dan alle vensters en kijk onder “Project” en “Open..” om de gemaakte bestanden te kunnen bekijken. Allemaal voor “eerstePIC­ programma.mcp” (in mijn geval dan, want de naam “eerstePIC­programma” gaf ik aan mijn project) Nu willen we toch een keertje het proefprogramma gaan schrijven. Toch is er nog iets, dat we moeten doen. Klik op Nieuw document. Daarna via “Edit” en “Properties” www.ccfz.nl 8 ROBOTICS CCFZ naar General. Vink daarin “Use Tabbed Window”, “Enable Source Location”, “Enable Color Printing” en Alternate <Home> key action” aan. Kies “Files Type”en vink “Auto Indent”, “Line numbers”, “Repair Mismatched CR/LF on safe”, “Line wrap” en “Print Line numbers” aan. De andere instellingen kunnen ongewijzigd blijven. Als we nu naar het tekstvak kijken, dan zien we regelnummer 1 al staan. We beginnen de eerste regel met een “;“ (punt komma). Wat op een regel achter de dit teken staat wordt niet verder verwerkt, maar wel opgeslagen voor latere raadpleging. Het is verstandig om altijd hier de naam van het programma te vermelden, de datum van het maken van het programma en je eigen naam. (eventueel achter een aantal keer de “;”). Om het overzicht nog duidelijker te maken kun je ook verder op een regel achter de “;” leeg laten. Zo wordt een overzichtelijke listing bereikt. Achter elke ingevoerde commandoregel kan ook weer met de “;” informatie worden toegevoegd. Maak daar veel gebruik van om toelichtingen te geven voor later. Ook tijdens het programmeren kun je hiermee regels (tijdelijk) uitschakelen. Geprobeerd wordt om alle programmaregels duidelijk toe te lichten. In machinetaal programmeren is echt niet eenvoudig. Je zou kunnen volstaan met het overtikken van de listings. Het meeste ervan heb je maar eenmalig in te voeren. Wil je aparte delen veranderen, dan kun je daarop later je aandacht vestigen en na studie aanpassingen maken. De Koptekst, “Header” kunnen we nu intikken. Gebruik de Tab­toets om nette kolommen te maken. Ergens onderin moeten we nog met dezelfde Tab­afstand “end” schrijven om het einde van het programma aan te duiden. De header is hier dus drie regelig. (De regels , die met een ; beginnen tellen dus ook hier niet mee.) Voor de duidelijkheid: de listing: list errorlevel __config p=16F84A ­302 3FFD Achter List wordt de gebruikte processor aangegeven. Let even op de schrijfwijze. www.ccfz.nl 9 ROBOTICS CCFZ Daarna het error­level,dat kan worden ingesteld. Het programma MPLAB geeft aan welke fouten in jouw listing staan. Het betreft twee soorten fouten: minder belangrijke, zgn. schoonheidsfoutjes en kritieke fouten. Door deze regel , met ­302 worden de schoonheidsfoutjes niet weergegeven. Op de derde programmaregel wordt de configuratie, de omgeving van de processor opgegeven. De waarde 3FFD hebben we bij het Configureren gevonden. Let op, dat deze regel begint met een dubbele Underscore _. Bij de header springt de listing één tab in. De laatste regel, met end, moet op dezelfde wijze inspringen. Bij het begin van het programma moeten de poorten worden aangeduid en er kan een richtingsbit worden ingesteld. Dat wil zeggen, dat wordt aangegeven of de poorten met de aansluitpunten als in­ of een uitgang worden gebruikt. Het is verstandig dit aan het begin van het programma universeel in te stellen. Zonodig kan in de loop van het programma dit, al dan niet tijdelijk, worden veranderd. Vul de listing als volgt aan: porta portb trisa trisb equ equ equ equ 0x05 0x06 0x85 0x86 Dit vraagt om toelichtingen. porta en portb zijn de beide series aansluitpunten. Hun waarden, 05 en 06 vind je op het datasheet. Voor de PIC16f84A heeft poort A vier aansluitpunten, poort B heeft er acht. trisa en trisb geven in bitjes de richtingen aan. Equ staat voor equal, gelijk aan. De waarden vind je ook weer in het datasheet. Kijk na of je dat terug kunt vinden! De volgende keer met een andere processor moet je het zelf uitzoeken. Zo ziet het er nu uit: Om dit programma door de computer te laten controleren moeten we het opslaan. www.ccfz.nl 10 ROBOTICS CCFZ Sla het programma op. “File”, “Save as” en bijvoorbeeld Eersteprogramma.asm. De laatste toevoeging, asm, de extensie, moet je met de hand toevoegen. Dat is belangrijk. Ik doe dat onder “Mijn documenten”, “Eigenaar” en een nieuwe map PIC­ processor. Onder “Project” kies “Set active project” en kies “None (Quick built mode)”. Kijk of de MPLAB Editor IDE gekozen is (de bovenbalk gekleurd), en klik onder “Project” “Quickbuilt eersteprogramma”. Natuurlijk moet je de naam van het programma aangepast vinden aan de naam, die jij je programma gaf. Ik krijg een foutmelding: Het pad van het bestand is langer dan 62 karakters. Ik ben dus verplicht mijn project op te slaan met een korter pad, dus onder minder submappen. Het .asm­bestand sla ik nu nog maar een keertje op in een nieuwe map, gemaakt in de root van de C­schijf, die ik “PIC­programma’s noem. Nu nogmaals proberen en het blijkt, dat er geen fouten meer zijn in dit programma”. BUILD SUCCEEDED Natuurlijk kunnen er ook nog andere fouten in de code staan. Die worden ook vermeld in het Window “Output”. Kijk naar de fouten en merk op, dat bij elke fout is aangegeven op welke regel de fout optreedt. Daar kun je dan je aandacht op richten. Veel kun je hiermee nog niet, maar MPLAB IDE functioneert naar behoren. Controleer met de Verkenner of het HEX­bestand is gemaakt tijdens Quick Build. Dat bestand moet je kunnen vinden in dezelfde map als waarin je je .asm­bestand hebt opgeslagen. We moeten nu eerst aandacht besteden aan de plek in het geheugen, waar informatie wordt opgeslagen: de geheugendata organisatie: Data Memory Organisation. Zoek dat op het Datasheet en bekijk de Register File Map. Voor de PIC 16F8A bestaat die uit twee kolommen, aangegeven met Bank 0 en Bank 1. Elk van de twee bevat de registers voor allerlei algemene zaken en een deel RAM­ geheugen, dat vrij toegewezen kan worden. Bank 1 is vrij te gebruiken vanaf 0x0C tot 0x4F en Bank 2 vanaf 0x 8C tot en met 0xCF. In het programma moet je wel eerst aangeven of je in Bank 0 of Bank 1 werkt. Daarvoor geldt de regel rp0 equ www.ccfz.nl 11 5. ROBOTICS CCFZ Op die 5 komen we verderop terug. Het betreft het 5e bit van een reeks. De volgende regel, die aandacht krijgt is de Status­regel. Ook terug te vinden in de Register File map op adressen 0x03 en 0x83 voor respectievelijk Bank0 en Bank 1. Controleer of je al deze gegevens in het datasheet van de processor PIC16F84A terug kunt vinden. Heb je een andere processor, dan moet je de eigen waarden vinden. status equ 0x03 Bekijk de nadere informatie van het STATUS REGISTER en merk op, dat bit 5 RP0 bevat: het bit, dat de Geheugenbank selecteert: 0 voor Bank 0 en 1 voor Bank 1. Deze regels zijn nodig om richting van de poorten te bepalen. Zien we zo meteen. Het is te verwachten, dat we vertraging moeten bereiken, om aan de wens van de snelheid van het aan­ en uitzetten van de beide lampjes te voldoen. Een lus, of engels “loop” bereiden we voor. Dat doen we door een viertal variabelen te definiëren, te benoemen: loop0 tot en met loop3. Daarvan wordt de plaats in het vrije registerdeel vastgelegd: loop0 loop1 loop2 loop3 equ equ equ equ 0x30 0x31 0x32 0x33 Ook een tijdelijk adres voor tussenberekeningen maken we alvast: temp equ 0x34. Alle genoemde geheugenplaatsen behoren tot de vrije plaatsen van Bank0, zoals je ziet. Ons programma ziet er nu zó uit: Denk ook aan de juiste inspringingen, of tabs! Netjes de kolommen onder elkaar. Probeer nog eens met Quick Build of het nog goed werkt! Dat moet het geval zijn. Wellicht heb je tikfouten gemaakt. Verbeter die eerst. www.ccfz.nl 12 ROBOTICS CCFZ De volgende stap betreft het instellen of de a­ en de b­poorten als in­ of als uitgang worden ingesteld door trisa op ff te zetten (alle a­poorten ingang) en de trisb op 00 (alle b­poorten uitgang). Acht regels zijn daarvoor nodig: De eerste vier voor de a­poorten. bsf movlw movwf bcf status,rp0 0xff trisa status,rp0 ; of de poort in­ of uitgang is, staat in rp0 ; in het werkregister w zetten we de acht enen (1’s) ; verplaatsen van de inhoud werkregister naar trisa ; status resetten. Met de enen worden de a­poorten als ingang geprogrammeerd. bsf en bcf horen bij elkaar. bsf “set” een bit, bcf “clear”t het bit. De statusbitjes worden door te setten toegankelijk gemaakt. Door bcf weer afgesloten. Voor de b­poorten geldt ongeveer hetzelfde, alleen maken we trisb allemaal 0, dat wil zeggen, dat die poorten als uitgang worden ingesteld: bsf movlw movwf bcf status,rp0 0x00 trisb status,rp0 ; in het werkregister plaatsen we “0”­en. Alles is nu voor bereid om per poort de uitgang “0” of “1” te maken. Door het aansluiten van een lichtgevende diode, een LED, met een serieweerstand van 100 tot 400 Ω op Vss kun je nagaan of de poort “1” is. Dan staat er 5 v op de aansluiting en gaat het LED­lampje branden. (een LED­lampje moet je wel in de juiste richting aansluiten: polariteitgevoelig! Proberen of ompolen helpt!) Hieronder is te zien welke regels nodig zijn voor aansluiting 0 van poort a. list errorlevel __config porta portb trisa trisb equ equ equ equ 0x05 0x06 0x8 0x86 rp0 equ status equ 5 0x03 loop0 loop1 loop2 loop3 temp equ equ equ equ equ p=16F84A ­302 3FFD 0x30 0x31 0x32 0x33 0x34 bsf movlw movwf bcf status,rp0 0xff trisa status,rp0 bsf movlw movwf bcf status,rp0 0x00 trisb status,rp0 ; of de poort in­ of uitgang is, staat in rp0 ; in het werkregister w zetten we de enen ; verplaatsen van inhoud werkregister naar trisa ; status resetten. ; in het werkregister plaatsen we “0”­en. ; vervolg volgende bladzijde www.ccfz.nl 13 ROBOTICS CCFZ goto lus0 bsf bcf portb,0 portb,0 goto lus0 lusp0 end Tevens is te zien welke vensters gemakkelijk zijn om de werking van het programma te controleren. Output geeft het resultaat van Quickbuild. Special Function Register toont de inhoud van de registers. In het programma zijn 5 extra regels ingevoerd in de subroutine loop0. Poorten b0 en b1 worden eventjes nul gemaakt en daarna gereset. De stopwatch aanzetten geeft aan hoeveel tijd vanaf het begin van het programma verlopen is tot de laatst genomen stap. Als je, zoals wij dat ook willen, precies een bepaalde tijd wil instellen, dan is daarvoor het gebruik van de stopwatch­functie nodig. Het beeld kan er nu zo uitzien. Onder “Project” Quickbuild” moet je steeds je ingetypte programma assembleren om te controleren of je tikfaudjens hebt gemaakt. De stopwatch. Wil je de snelheid van je programma weten, of wil je bepalen hoe lang een bepaalde routine van je programma duurt, dan wordt het tijd het horloge, de stopwatch in te schakelen. Daarvoor moet weer de programmasimulator, de programma nabootser www.ccfz.nl 14 ROBOTICS CCFZ worden aangeklikt. Klik op “Debugger” en “Select tool” en kies dan nummer 3: MPLAB SIM”. Begrijpelijk is het, dat de duur van een stap afhangt van het gebruikte kwartskristal. Hoe hoger daarvan de afgegeven frequentie, des te kleinere stappen worden gemaakt. De kristalfrequentie moet voor een goede tijdmeting daarom worden ingevoerd. Klik op “Debugger: en “Settings” en toets de juiste frequentie in. Ik heb een 4 MhZ kristal. De stopwatch kan nu worden gebuikt. Wil je stap voor stap de uitvoer van je programma volgen, dan kun je dat doen met behulp van de F6­ en F7­knopen van je computer. F6 om opnieuw te beginnen, F7 voor de volgende stap te doen. Op de stopwatch kun je daarmee nagaan hoe lang een programmadeel duurt. Klik op “View” en “Special Function register” (SFR), dat de inhoud van een aantal vaste registers weergeeft. Met de F6­toets kun je aan het begin van het programma komen (eigenlijk dus resetten) en met de F7­toets stap voor stap alle programmaregels doorlopen. In de listing kun je zien aan welke stap het programma toe is. In rood wordt in het SFR en het File register aangegeven welke waarden bij de laatste stap veranderd zijn. Ons eerste programma is nu gereed en het zou interessant zijn om de HEX­code in onze processor te brengen om te zien hoe dit nu uitpakt. We gaan dus nu eerst aandacht besteden aan de Programmer, waarvoor wij de Whisp 648 van VOTI hebben gekozen. Het programma Bumble Bee, dat daarbij hoort, kunnen we gratis ophalen via de site van VOTI. www.ccfz.nl 15 ROBOTICS CCFZ De programmer hardware De Whisp648 kochten we als setje. Het bouwvoorschrift en de gebruikershandleiding hebben we opgehaald van de site van VOTI. Het is in het Engels geschreven met heel veel foto’s van de verschillende fases van de bouw. In totaal 17 pagina’s. Lijkt me niet nodig om deze te vertalen: nauwkeurig werken moet je wel. Goed lezen. Gesoldeerd en aangesloten ziet het er uit als op de foto is te zien. De PIC­schakeling, de programmer en de aansluitingen samen zijn op de volgende foto weergegeven. Je ziet het breadboard van pagina 4. Als stroomvoorziening is gebruik gemaakt van een accubatterij van een kruimeldief, waarvan de motor versleten is. Levert, afhankelijk van de laadsituatie, 7,2 – 8,5 Volt. www.ccfz.nl 16 ROBOTICS CCFZ Toch is het handiger om een spanningsbron te kiezen met een stroombegrenzing voor het geval van kortsluiting. De accubatterij is daarom later vervangen door het laadapparaat van de kruimeldief. Als de batterij wordt aangesloten knippert de LED op de Whisp 648 twee keer. Als dat gebeurt heb je enige zekerheid, dat je alles goed hebt gesoldeerd en aangesloten. Op het breadboard heb ik even gecontroleerd of de 5 volt spanning van de Whisp voor stroomvoorziening zorgt. Dat blijkt het geval te zijn De programmer software Bumble Bee 4.01 is nu, voorjaar 2008, de meest recente versie. Onder “File” zoek je je eerste programma HEX­bestand op, dat je dus gemaakt hebt (kunt hebben) met MPLAB. Mij verbaast het telkens weer, dat er zo weinig HEX­informatie overblijft van onze listing. Dit programma vereist ook weer een aantal instellingen. Allereerst de aanduiding van de USB­poort. Na proberen van een heleboel mogelijkheden bleek voor mij poort COM19, en ook wel poort 20, van mijn laptop de juiste instelling. (De laatste, die ik probeerde natuurlijk.) Target set staat bij mij op “Auto”. “Programmer identify” geeft als resultaat Whisp 628 i.p.v. de gebruikte Whisp 648. Blijkt geen probleem op te leveren. Onder “Settings” “Configure Task List” alles selecteren. Alles aangesloten? Het lampje van de programmer licht twee keer op? Dan op “Task List execute” klikken, het icoon naast de groene pijl bovenaan het schermpje. Als het goed is krijg je het volgende schermpje: www.ccfz.nl 17 ROBOTICS CCFZ Als je ook naar de hardware hebt gekeken, dan zie ja, dat op de Whisp de LED even oplicht. En ook op de breadboard brandt het lampje,dat aangesloten is op poort b0. Klopt dat met wat we kunnen verwachten? Programma aanpassen: vertraging inbouwen Wat is er mis? Wel…eigenlijk niets. Het lampje op poort b schakelt aan en uit. Maar dan wel in zo’n tempo, dat we het met ons oog niet kunnen volgen. We moeten telkens als het lampje aan is, even een vertraging inbouwen. En ook als het lampje uit is doen we dat. Wijzig het programma als volgt: lus0 bsf call bcf call portb,0 vertraging portb,0 vertraging goto lus0 end ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ vertraging ; routine met drie geneste lussen movlw 0x04 ; zet hex 04 in werkgeheugen movwf loop0 ; verplaats 04 naar loop0 twee movlw 0xff ; zet ff in werkgeheugen movwf loop1 ; zet ff in loop1 een movlw 0xff ; hetzelfde voor loop2 movwf loop2 aftellen decfsz goto decfsz goto decfsz goto return loop0, f aftellen loop1,f een loop2,f twee ; trek 1 af van inhoud loop0 tot inhoud = 0 De vertraging hebben we voorbereid door in het geheugen plaats te reserveren voor loop0, loop1 en loop2 op plaatsen 30, 31 en 32. Op elk van die plaatsen kan de inhoud telkens vanaf ff met 1 (één) worden verlaagd tot 00 (HEX, overeenkomend met 265 decimaal) met het commando decfsz. In de datasheet van de PIC16F84A kun je lezen, dat dat staat voor “decrement f tot nul. Als nul is bereikt sla dan de volgende regel in het programma over SZ = skip if zero). Een vertraging van 256 keer betekent bij ons 4 MHz kristal een vertraging van 3x265 μseconden (ongeveer een halve milliseconde.) Dat kun je controleren door gebruik te maken van de ingebouwde stopwatch. Onder “Debugger” kun je die dus vinden. www.ccfz.nl 18 ROBOTICS CCFZ Met toets F7 kun je het programma stap voor stap doorlopen. De groene pijl links toont de stap in de listing, die aan de beurt is. Met toets F6 kom je aan het begin van het programma. Op het stopwatchscherm kun je de tijdmeting resetten. Kijk in de onderbalk of de kristalfrequentie inderdaad op 4 MHz staat. Druk op F7 totdat de bovenstaande situatie is bereikt. Loop 1 is de eerste lus, die we gaan aftellen om te kijken hoe lang de vertraging van lus 1 kan duren. Klik op Zero van de stopwatch om de teller op nul te zetten. Blijf met je vinger op de F7­toets en de tijdmeting gaat wat sneller door. Na een tijdje (243 eenheden) is bovenstaande resultaat bereikt. Zie ook het File Register, waar op plaats 30 (van onze loop 1 dus) de waarde inmiddels van ff tot ae is verlaagd. We gaan door tot daar de waarde 00 verschijnt. De vertraging van deze lus blijkt 764 μs te zijn, (0,7 milliseconden ms dus). Absoluut niet met het menselijk oog te zien. Daarom hebben we een tweede lus gemaakt. Na elke keer loop1 doorlopen te hebben verlagen we de waarde van loop2 vanaf ff met 1 (één) tot 00 is bereikt. Dan slaat het programma de volgende regel over en komt in loop3 terecht. Daarvan wordt op zijn beurt ook weer de waarde weer met één verlaagd. En dat doen we nog een keertje voor zowel loop1 als loop2 (File registerplaats 31) in loop3 (File registerplaats 32). Kunnen we allemaal controleren met onze stopwatch. www.ccfz.nl 19 ROBOTICS CCFZ Om de tweede lus ook volledig te doorlopen zijn … ms nodig. Als je voor de derde lus dan 04 neemt, dan gaat het LED­lampje ongeveer 1 keer per seconde aan en uit. Dat kun je eenvoudig controleren. We moeten nog veel meer onderzoeken over de vertragingstijden. Dat doen we in de volgende beschrijving. Op de foto op bladzijde 15 kun je zien, dat er door mij vier LED­lampjes zijn aangesloten. Probeer eens portb,0 te vervangen door portb,1 2, of 3 voor zowel set (bsf) als clear (bcf). Je ziet, dat hiermee de andere lampjes kunnen worden aangestuurd. Zou je de verdere verbindingen naar LED­lampjes op 4, 5, 6 en 7 ook maken, dan kun je die ook schakelen. Natuurlijk kun je ook meer LED­lampjes tegelijk ook aan­ en uitzetten in andere volgordes: een echte kerstverlichting kan het gevolg worden. Maar er is een meer gebruikelijke manier om een combinatie van lampjes te schakelen. Van zowel poort a als poort b wordt door middel van het TRIS­commando de richting van de data aangewezen: in­ of uitgang. Op een vergelijkbare manier kan voor de uitgang van de poorten worden geregeld of die hoog (5 volt of logisch 1) ofwel laag (0 volt ofwel logisch 0) is. In onderstaande routine (dat is het woord voor een bij elkaar horend deel van en groter programma) zullen de vier LED­lampjes om en om aan en uit gaan. (Zie voor de juiste HEX­waarden de tabel op bladzijde 6 van deze beschrijving.) lusp0 movlw movwf call 0x05 portb vertraging ; plaats de waarde 05 in geheugen w ; kopieer naar portb movlw movwf call goto 0x0a portb vertraging lus0 ; plaats 0a in w ; kopieer naar portb Duidelijk is, dat in een klap alle uitgangen van poort b bediend worden. Tussenresultaat Hiermee zijn we flink opgeschoten met het onderzoek naar de mogelijkheid om een racerobot aan te sturen met een PIC­processor. Ons “gereedschap”, het programma MPLAB IDE en de Whisp 648 met Bumblebee hebben we aan de praat gekregen en de eerste schreden zijn gezet in het maken van een machinetaal code. We zijn in staat door dat programma de gewenste signalen aan de uitgang van onze PIC16F84 te sturen. Hieronder nog maar even de hele listing in normale tekst. Helaas zonder regelnummers. www.ccfz.nl 20 ROBOTICS CCFZ ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ; ; Eerste experiment ; ; Voorjaar 2008 ; ; Hans Dorst ; ; ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ; list p=16f84 errorlevel ­302 __config 3ffd porta portb trisa trisb equ equ equ equ 0x05 0x06 0x85 0x86 rp0 status equ equ 5 0x03 loop1 loop2 loop3 loop4 temp equ equ equ equ equ 0x30 0x31 0x32 0x33 0x34 bsf movlw movwf bcf status,rp0 0xff trisa status,rp0 bsf movlw tmovwf bcf status,rp0 0x00 trisb status,rp0 movlw movwf 0x00 portb goto loop0 bsf call bcf call portb,0 vertraging portb,0 vertraging goto lus0 lusp0 ; vertraging voorbereiden end ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ vertraging twee een aftellen ; routine met drie geneste lussen movlw movwf movlw movwf movlw movwf 0xff loop3 0xff loop2 0xff loop1 ; zet ff in werkgeheugen ; ff in geheugenplaats loop3 (32) ; zet ff in werkgeheugen ; waarde ff in geheugenplaats loop2 (31) ; zet ff in werkgeheugen ; waarde in loop1 (30) decfsz goto decfsz loop1,f aftellen loop2,f ; trek 1 af van de waarde van loop.1 Als 0, dan volgende regel overslaan ; ; trek 1 af van waarde loop2. Als 0, dan volgende regel overslaan www.ccfz.nl 21 ROBOTICS CCFZ goto decfsz goto een loop3,f twee ; voor loop3 aftellen return Er is nog een ding, dat het werken kan vergemakkelijken. Bij het begin van de listing is er een aantal instellingen van het Special Function Register (zie datasheet), dat telkens op dezelfde waarde moet worden ingesteld. Het betreft een veeltal waarden, waaronder de volgende regels uit de listing: porta portb trisa trisb equ equ equ equ 0x05 0x06 0x85 0x86 rp0 equ status equ 5 0x03 Deze waarden kunnen in een keer goed worden gezet met de regel #include “PIC16F84.INC” Let hierbij wel op, dat wijzigingen/ nieuwe waarden toegekend moeten worden door het overschrijven van deze instellingen met de commando’s in HOOFDLETTERS! www.ccfz.nl 22