Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip...

6
3 Experimenteren met de PIC Dit artikel is een vervolg op de vorige Technische Notities van Marc. Destijds is de architectuur van de PIC16F84 doorge- licht. Nu is het moment aangebroken de ontwikkelomgeving MPLAB te installeren en daarna een programma te schrijven dat een LED laat knipperen. 7. Datasheets op internet Ga naar www.microchip.com en download de datasheet van de PIC16F84. Diverse mensen hebben mij gevraagd waar ze de sheet van de PIC16F84 kunnen vinden. Kies linksboven ’PIC Micro MCU’s’. Je komt dan in het gebied van de site waar alle PIC datasheets en application notes staan. Kies uit de lijst PIC16X8X. Scroll nu naar be- neden, daar staat ’PIC16F8X Family Datasheets’. Klik hier- op. Scroll naar beneden en selecteer PIC16F84 of PIC16F84A. Tenslotte laat de site een aantal servers zien waarmee je de sheet kunt downloaden. Kies een van de vier FTP-sites. De file 35007A.PDF wordt vervol- gens gedownload. Zoals eer- der vermeld: een papieren versie van deze datasheet is vereist. Microchip stelt zijn ontwikkelomgeving MPLAB gratis ter beschikking. Maak je geen zorgen om de kosten, of om een beperking in de juiste werking van de soft- ware. Geld verdienen doen ze echt wel: als je enkele PIC’s koopt of hardware om ze te programmeren (PICSTART), stromen de dollars toch wel binnen. Ik raad aan een CD- ROM van Microchip aan te vragen bij AvNet in Breda. De MPLAB software kan direct van de CD-ROM geïnstalleerd worden. Alle CD-ROM’s van Microchip die sinds 1998 zijn gemaakt zijn eigenlijk images van de Microchip website. 8. Installeren van MPLAB De PIC16F84 is een oudere telg uit de Microchip-familie. Het maakt daarom niet uit welke versie van MPLAB je gaat installeren. Alles vanaf versie 4.XX en hoger is goed. De benodigde PC-configuratie is ook niet echt schokkend: een PC met Pentium 100, 16MB RAM, Windows9X en CD-ROM. Er is 15MB schijf- ruimte nodig. Zorg ervoor dat een browser is geïnstalleerd, bijvoorbeeld Netscape of In- ternet Explorer. Doe de CD- ROM in de PC en klik op IN- DEX.HTM. De browser wordt nu gestart en laat de startpa- gina zien, net als op internet. Je kunt nu alles downloaden, waaronder de datasheet. Voor MPLAB klik je op ’Deve- lopment Tools’, ergens links middenin. De browser springt nu naar de juiste webpagina. Hieronder staat ’MPLAB-IDE’. Met IDE wordt ’Integrated De- velopment Enviroment’ be- doeld oftewel ’geïntegreerde ontwikkelomgeving’. Klik hier- op. Er wordt een nieuwe pagi- na geopend waarin verschil- lende versies worden weerge- geven. Kies de meest recente versie, bijvoorbeeld MPLAB Version 4.99.07. De browser zal naar een volgend scherm springen waarin een downlo- ad kan worden gestart vanaf CD-ROM naar PC. Meestal wordt dit aangegeven met ’MPLAB download disk 1 of 7’. De browser zal vanzelf melden dat een file opgesla- gen moet worden op hard- disk. Dump deze file voorlo- pig even op het bureaublad. De naam van de file kan va- rieren met de versie, maar het is in elk geval een *.EXE file. Als de file eenmaal op de harddisk staat, maak dan met de explorer/verkenner een di- rectory aan: C:\MPLAB. Maak hieronder de volgende subdi- rectory aan: C:\MPLAB\SOUR- CE. Sleep de *.EXE file in de SOURCE-directory. Klik op deze file en er verschijnen tientallen files die de MPLAB software bevatten, inclusief een SETUP.EXE file. Klik op SETUP.EXE en MPLAB start zijn installatiescherm. MPLAB zal vragen allerlei dingen in te stellen. Laat alles ’default’ en kies overal ’ok’. Ik heb nooit mee- gemaakt dat het dan niet werkt: MPLAB is best een goed gedefinieerde en stabie- le ontwikkelomgeving in het toch wankele Windows. MP- LAB komt terecht onder WIN- DOWS\PROGRAM FILES. Van deze directory is niks nodig: we gaan werken in onze ei- gen werkdirectory C:\MPLAB. Herstart Windows en ga naar het startmenu. Er is een pro- grammakeuze bijgekomen: Microchip MPLAB. Kies dit en MPLAB zal vervolgens starten. Wellicht zeurt MPLAB dat hij een emulator mist. Klik in dat geval op ’Editor Only’. 9. Aanmaken van een nieuw project onder MPLAB Nu MPLAB is gestart is het volgende zichtbaar: een leeg grijs scherm met enkele but- tons en de bekende keuze- balk. Allereerst maak je met explorer/verkenner onder MP- LAB een project-directory aan: C\MPLAB\LEDPIC. In de LED- PIC-directory gaan we een programma schrijven om een LED te laten knipperen. De strategie van MPLAB is dat je moet werken met projects. Elk project heeft een set van files die bij dat project horen. Elke keer als iets nieuws wordt ontworpen, doe je dat in een nieuwe directory. Kies geen lange bestandsnamen: MPLAB draait in 16 bits mode en ac- cepteert deze helaas niet. Sluit explorer/verkenner nu af. Kies onder MPLAB in de keu- zebalk voor ’project’. Selecteer vervolgens ’New Project’. MP- LAB komt nu met een menu waarin de projectnaam moet worden opgegeven, *.PJT. Type LEDPIC.PJT en klik op ok. MPLAB opent nu een box waarin diverse dingen moe- ten worden gedefinieerd. Dit gedeelte is erg belangrijk. Het resultaat van een volledig uit- gewerkt project zal een *.HEX- file zijn die je in de PIC kunt programmeren. Dit is het uit- gangspunt in dit menu: MP- LAB moet weten welke files hiervoor van belang zijn, wel- ke files naar de uiteindelijke *.HEX leiden. In ons geval is dat dus LEDPIC.HEX. Deze zie je al staan, linksboven bij ’Target Filename’. Om het project verder te definiëren moet het volgende gebeuren: a Processor kiezen b Node kiezen: welke file de bron is om tot file *.HEX te komen c Assembler van MPLAB (MPASM) instellen d Nieuwe *.ASM openen a. Processor kiezen In deze box staat ’Develop- ment Mode’ met daarachter ’Change’. Klik hierop. Er ver- schijnt een enorme lijst met PIC˛s. Wanneer je dacht dat Microchip alleen de PIC16F84 maakte, dan heb je het mis. Onder zendamateurs is dit ge- woon een populair type. Kies altijd ’Editor Only’ en kies uit de lijst de PIC16F84 of de PIC16F84A, afhankelijk van welke je hebt. Eigenlijk maakt het niets uit, de HEX-file zal er hetzelfde uitzien. Klik hierna op ’ok’. Je hebt nu vastgelegd dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van de MPLAB-ontwik- kelomgeving. Waarom ˛editor only˛? Je kunt ook een emu- lator kopen of een zoge- naamde ICD ontwikkel-kit voor bepaalde PIC’s, maar dan zul je diep in de buidel moeten tasten. Daarom voor- lopig ’editor only’. b. Node kiezen In de box staat ’Add Node’. Een node wordt hier letterlijk bedoeld als verbinding, welke file de bron is om straks om te zetten in een *.HEX-file. Klik op ’Add Node’. Zorg er altijd voor dat MPLAB de juiste di- rectory aanwijst: C:\MPLAB\LEDPIC. Type nu LEDPIC.ASM rechtsboven als filename en klik op ˛ok˛. Nu is gedefinieerd dat LEDPIC.ASM de bron is waarmee MPLAB LEDPIC.HEX kan maken waar- mee later de PIC geprogram- meerd kan worden. *.ASM staat voor een ’Assembly File’.Met de PIC schrijven we dus in Assembly. MPLAB zal deze *.ASM file omzetten in een *.HEX file m.b.v. de as- sembler. c. Assembler van MPLAB (MPASM) instellen Bij gebruik van de assembler MPASM moeten enkele din- gen worden ingesteld om te zorgen voor een juiste uit- voer. Klik in het gedeelte ˛Pro- ject Files˛ op LEDPIC[.HEX]. De clickboxjes ’Build Node’ en Technische Notities van PE1RRT

Transcript of Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip...

Page 1: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

3

Experimenteren met de PICDit artikel is een vervolg op de vorigeTechnische Notities van Marc. Destijds isde architectuur van de PIC16F84 doorge-licht. Nu is het moment aangebroken deontwikkelomgeving MPLAB te installerenen daarna een programma te schrijvendat een LED laat knipperen.

7. Datasheetsop internet

Ga naar www.microchip.comen download de datasheetvan de PIC16F84. Diversemensen hebben mij gevraagdwaar ze de sheet van dePIC16F84 kunnen vinden.Kies linksboven ’PIC MicroMCU’s’. Je komt dan in hetgebied van de site waar allePIC datasheets en applicationnotes staan. Kies uit de lijstPIC16X8X. Scroll nu naar be-neden, daar staat ’PIC16F8XFamily Datasheets’. Klik hier-op. Scroll naar beneden enselecteer PIC16F84 ofPIC16F84A. Tenslotte laat desite een aantal servers zienwaarmee je de sheet kuntdownloaden. Kies een van devier FTP-sites. De file35007A.PDF wordt vervol-gens gedownload. Zoals eer-der vermeld: een papierenversie van deze datasheet isvereist. Microchip stelt zijnontwikkelomgeving MPLABgratis ter beschikking. Maakje geen zorgen om de kosten,of om een beperking in dejuiste werking van de soft-ware. Geld verdienen doen zeecht wel: als je enkele PIC’skoopt of hardware om ze teprogrammeren (PICSTART),stromen de dollars toch welbinnen. Ik raad aan een CD-ROM van Microchip aan tevragen bij AvNet in Breda. DeMPLAB software kan directvan de CD-ROM geïnstalleerdworden. Alle CD-ROM’s vanMicrochip die sinds 1998 zijngemaakt zijn eigenlijk imagesvan de Microchip website.

8. Installeren vanMPLAB

De PIC16F84 is een ouderetelg uit de Microchip-familie.Het maakt daarom niet uitwelke versie van MPLAB jegaat installeren. Alles vanafversie 4.XX en hoger is goed.

De benodigde PC-configuratieis ook niet echt schokkend:een PC met Pentium 100,16MB RAM, Windows9X enCD-ROM. Er is 15MB schijf-ruimte nodig. Zorg ervoor dateen browser is geïnstalleerd,bijvoorbeeld Netscape of In-ternet Explorer. Doe de CD-ROM in de PC en klik op IN-DEX.HTM. De browser wordtnu gestart en laat de startpa-gina zien, net als op internet.Je kunt nu alles downloaden,waaronder de datasheet.Voor MPLAB klik je op ’Deve-lopment Tools’, ergens linksmiddenin. De browser springtnu naar de juiste webpagina.Hieronder staat ’MPLAB-IDE’.Met IDE wordt ’Integrated De-velopment Enviroment’ be-doeld oftewel ’geïntegreerdeontwikkelomgeving’. Klik hier-op. Er wordt een nieuwe pagi-na geopend waarin verschil-lende versies worden weerge-geven. Kies de meest recenteversie, bijvoorbeeld MPLABVersion 4.99.07. De browserzal naar een volgend schermspringen waarin een downlo-ad kan worden gestart vanafCD-ROM naar PC. Meestalwordt dit aangegeven met’MPLAB download disk 1 of7’. De browser zal vanzelfmelden dat een file opgesla-gen moet worden op hard-disk. Dump deze file voorlo-pig even op het bureaublad.De naam van de file kan va-rieren met de versie, maar hetis in elk geval een *.EXE file.Als de file eenmaal op deharddisk staat, maak dan metde explorer/verkenner een di-rectory aan: C:\MPLAB. Maakhieronder de volgende subdi-rectory aan: C:\MPLAB\SOUR-CE. Sleep de *.EXE file in deSOURCE-directory. Klik opdeze file en er verschijnentientallen files die de MPLABsoftware bevatten, inclusiefeen SETUP.EXE file. Klik op

SETUP.EXE en MPLAB startzijn installatiescherm. MPLABzal vragen allerlei dingen in testellen. Laat alles ’default’ en kiesoveral ’ok’. Ik heb nooit mee-gemaakt dat het dan nietwerkt: MPLAB is best eengoed gedefinieerde en stabie-le ontwikkelomgeving in hettoch wankele Windows. MP-LAB komt terecht onder WIN-DOWS\PROGRAM FILES. Vandeze directory is niks nodig:we gaan werken in onze ei-gen werkdirectory C:\MPLAB.Herstart Windows en ga naarhet startmenu. Er is een pro-grammakeuze bijgekomen:Microchip MPLAB. Kies dit enMPLAB zal vervolgens starten.Wellicht zeurt MPLAB dat hijeen emulator mist. Klik in datgeval op ’Editor Only’.

9. Aanmaken vaneen nieuw projectonder MPLAB

Nu MPLAB is gestart is hetvolgende zichtbaar: een leeggrijs scherm met enkele but-tons en de bekende keuze-balk. Allereerst maak je metexplorer/verkenner onder MP-LAB een project-directory aan:C\MPLAB\LEDPIC. In de LED-PIC-directory gaan we eenprogramma schrijven om eenLED te laten knipperen. Destrategie van MPLAB is dat jemoet werken met projects. Elkproject heeft een set van filesdie bij dat project horen. Elkekeer als iets nieuws wordtontworpen, doe je dat in eennieuwe directory. Kies geenlange bestandsnamen: MPLABdraait in 16 bits mode en ac-cepteert deze helaas niet. Sluitexplorer/verkenner nu af.Kies onder MPLAB in de keu-zebalk voor ’project’. Selecteervervolgens ’New Project’. MP-LAB komt nu met een menuwaarin de projectnaam moetworden opgegeven, *.PJT.Type LEDPIC.PJT en klik opok. MPLAB opent nu een boxwaarin diverse dingen moe-ten worden gedefinieerd. Ditgedeelte is erg belangrijk. Hetresultaat van een volledig uit-gewerkt project zal een *.HEX-file zijn die je in de PIC kuntprogrammeren. Dit is het uit-gangspunt in dit menu: MP-LAB moet weten welke fileshiervoor van belang zijn, wel-ke files naar de uiteindelijke*.HEX leiden. In ons geval isdat dus LEDPIC.HEX. Deze zieje al staan, linksboven bij’Target Filename’. Om het

project verder te definiërenmoet het volgende gebeuren:

a Processor kiezenb Node kiezen: welke file de

bron is om tot file *.HEX tekomen

c Assembler van MPLAB(MPASM) instellen

d Nieuwe *.ASM openen

a. Processor kiezenIn deze box staat ’Develop-ment Mode’ met daarachter’Change’. Klik hierop. Er ver-schijnt een enorme lijst metPIC˛s. Wanneer je dacht datMicrochip alleen de PIC16F84maakte, dan heb je het mis.Onder zendamateurs is dit ge-woon een populair type. Kiesaltijd ’Editor Only’ en kies uitde lijst de PIC16F84 of dePIC16F84A, afhankelijk vanwelke je hebt. Eigenlijk maakthet niets uit, de HEX-file zal erhetzelfde uitzien. Klik hiernaop ’ok’. Je hebt nu vastgelegddat je met de PIC16F84x wiltontwikkelen, met alleen deeditor van de MPLAB-ontwik-kelomgeving. Waarom ˛editoronly˛? Je kunt ook een emu-lator kopen of een zoge-naamde ICD ontwikkel-kitvoor bepaalde PIC’s, maardan zul je diep in de buidelmoeten tasten. Daarom voor-lopig ’editor only’.

b. Node kiezenIn de box staat ’Add Node’.Een node wordt hier letterlijkbedoeld als verbinding, welkefile de bron is om straks omte zetten in een *.HEX-file. Klikop ’Add Node’. Zorg er altijdvoor dat MPLAB de juiste di-rectory aanwijst:C:\MPLAB\LEDPIC. Type nuLEDPIC.ASM rechtsboven alsfilename en klik op ˛ok˛. Nu isgedefinieerd dat LEDPIC.ASMde bron is waarmee MPLABLEDPIC.HEX kan maken waar-mee later de PIC geprogram-meerd kan worden. *.ASMstaat voor een ’AssemblyFile’.Met de PIC schrijven wedus in Assembly. MPLAB zaldeze *.ASM file omzetten ineen *.HEX file m.b.v. de as-sembler.

c. Assembler van MPLAB(MPASM) instellen

Bij gebruik van de assemblerMPASM moeten enkele din-gen worden ingesteld om tezorgen voor een juiste uit-voer. Klik in het gedeelte ˛Pro-ject Files˛ op LEDPIC[.HEX]. Declickboxjes ’Build Node’ en

Technische Notities van PE1RRT

Page 2: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

4

’Node Properties’ lichten nuop aan de rechterkant. Kies’Node Properties’. Nu wordteen nieuwe box zichtbaarwaarin de instellingen van deassembler kunnen wordenveranderd. Laat alles zo staan,selecteer alleen ’Warn + Error’en klik op ’ok’. Bestudeerdeze instellingen goed. Je zieto.a. dat MPASM gevoelig isvoor verschillen in kleine engrote letters. Je moet min-stens eenmaal in dit menukomen anders voert MPLABgeen assemblage van LED-PIC.ASM uit. Klik nogmaals’ok’ om naar het hoofd-scherm van MPLAB terug tegaan. De assembler MPASM isnu klaar voor gebruik.

d. Nieuwe *.ASM openenAls laatste moet LEDPIC.ASMfile worden geopend omdatdeze simpelweg nog niet be-staat. Ga naar ’file’ en kies’new’. Klik daarna op ’ok’. MP-LAB opent nu een editboxmet de naam ’UNTITLED1’.Kies nu ’file’ en ’save as’. Jekunt de file nu een naam ge-ven. Geef hem de naam ’LED-PIC.ASM’ en klik op ’ok’. Allesis nu correct ingesteld voor ditproject.

10. Assembler-taalHoud de instructie-set van dePIC16F84 gereed. Met de in-structies die hierin staan kanhet functionele gedeelte vanhet programma worden sa-mengesteld. Verder kan de

assembler van Microchip ookassembly directives verwer-ken. Deze assembly directiveszijn speciale commando’s omde assembler te sturen. Eenvan deze commando’s is’LIST’. Dit commando geeftaan welke processor we ge-kozen hebben. Het comman-do ’END’ geeft aan dat de as-sembler moet stoppen metassembleren. Een andere be-langrijke assembly directive ishet commando ’#INCLUDE’waarmee vreemde files aaneen programma kunnen wor-den gehangen. De assemblerpikt deze dan gewoon mee.We komen er enkele tegenbij het schrijven van kleineprogramma’s. Probeer eventu-eel het boekje ’MPASM USERSGUIDE’ te pakken te krijgenals je meer wilt weten vandeze assembler directives.Voor wat we hier gaan doenis dit boekje niet nodig.

11. De hardwareBouw de schakeling uit figuur11.1, bijvoorbeeld op experi-menteerboard, bij voorkeurcompleet met de spanningsre-gelaar. Dan kan de PIC nietkapot gaan als een te hogevoedingsspanning wordt aan-gebracht. De conden-satoren van 100 nFzijn er ook niet voorniets: plaats C7 en C8dicht op de pootjesvan de spanningsre-gelaar, C4 dicht bijpen 14 van de PIC.

Maak ook goede verbindin-gen naar massa. De PIC heeftdrie basiselementen nodig omgoed te functioneren:1. Een kristal of resonator

met condensator van on-geveer 22 pF

2. Ordentelijk gefilterde 5 Vdc voedingsspanning enmassa

3 Een reset-circuit

RS1 is een kristal of resonatorvan 4 MHz. Dit maakt het onsstraks gemakkelijk: de Micro-chip executeert een instructiein 4 cycles. ¨ x 4 MHz =1 MHz. Voor een instructie isdus 1 microseconde nodig.Anders gezegd: per seconde1 miljoen instructies. Het re-set-circuit is opgebouwd rondR2 en C3. Met de drukschake-laar SW1 kan een externe re-set worden geven. LED D1wordt via een weerstand aan-gesloten op pin RA0. Het is debedoeling de LED te latenknipperen met een forse tijd-vertraging die wordt geschre-ven in assembly-code. Figuur11.2 toont de materialenlijstvoor dit project. Brigatti in deHobbemaStraat te Eindhovenkan indien gewenst dit pak-ketje leveren, exclusief printje.

##### Figuur 11.1 Schema van PIC met LED ##### Figuur 11.2 Benodigde materialen

12. Programmerenvan de PIC

De PIC moet worden voorzienvan een programma. De vol-gende mogelijkheden be-staan:1. Koop een PICSTART. Dit is

een programmeer-appa-raat van Microchip waar-mee alle PIC’s kunnenworden geprogrammeerd,Dit is de mooiste oplos-sing, omdat hij meteen on-der MPLAB kan wordenaangestuurd.

2. Kijk of een eventueel be-schikbaar programmeer-apparaat zoals een GALEPof een HILO de PIC16F84kan programmeren. Vaakis dit het geval.

3. Zoek op internet.

Er zijn veel ’video-ontvanger-verbeteraars’ die eenPIC16F84 gebruiken om sig-nalen te emuleren die naarkaartjes gaan die in satellie-tontvangers worden gestopt.Meestal hangen deze aan deseriele poort en kan met eenDOS programma de *.HEX file(dus ook de LedPic.HEX-file)naar de PIC worden gestuurd.Let op: vaak wordt de RS232-spanning gebruikt om de

Figuur 11.2

Page 3: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

5

FLASH van de PIC te program-meren. In veel gevallen isdeze RS232-spanning te laagwaardoor de PIC niet goedwordt geprogrammeerd.Voorkom frustraties! Als u bijzoekmachine Yahoo zoekt op’pic programmer’ is het aantalhits meer dan 8000. Enkeleinteressante sites zijn:http://www.covingtoninnova-tions.com/noppp/http://www.nottingham.ac.uk/pic84/pic84.htmlhttp://www.codepuppies.com/~ben/sens/pic/sx/http://www.jdm.homepage.dk/newpic.htm

Velen hebben ook de datas-heet in hun listing staan, erghandig. Toepassing van dezehints is uiteraard op eigen risi-co.

13. Knipperen vande LED, kop enstaart

De hardware is gereed, eenprogrammer aanwezig, MP-LAB heeft een lege editboxgenaamd LEDPIC.ASM. Watnu? Allereerst gaan we hetprogramma ’kop en staart’geven. Type het volgende in,zie listing 13.1.Dit is dus ’kop en staart’. Al-lereerst geven we met de LISTassembly directive aan datsprake is van een PIC16F84,dat we 75 tekstkarakter-ko-lommen hebben en dat LED-PIC.HEX file het formaatINHX8M zal hebben. Het__CONFIG-commando is ookeen assembly-directive en weleen speciale. Elke PIC heefteen ’configuration word’ ofte-wel een configuratie-program-meerlocatie waarin staat hoede PIC opstart. In dit gevalheb ik gezorgd dat met dewaarde 005h de PIC opstartmet de XT-oscillator en dewatchdog ingeschakeld. Dewatchdog is de waakhond diewe de vorige keer al hebben

gezien. Assembly-directiveEND is wellicht de belangrijk-ste: MPLAB moet immers we-ten wanneer de assemblermoet stoppen. Alles achtereen ’;’ wordt niet meegeno-men door MPASM. Dit is al-leen voor commentaar.Druk nu op het icoon met dezwarte diskette omLEDPIC.ASM op de hardeschijf op te slaan. Druk ookop de groene diskette: nuwordt LEDPIC.PJT opgeslagen,de project definitie-file die inhet begin is gekozen. Klik nuop de groene zandloper (ui-terst rechts) en MPASM zal defile assembleren naar LED-PIC.HEX. Er verschijnt nu een nieuwwindow waarin staat ’BuildResults’. Mochten er foutenzijn opgetreden dan staan zein dit scherm vermeld enweet je waarom de assemblergestopt is. Probeer dit: typeiets onzinnigs in LEDPIC.ASM,bijvoorbeeld voor de ’;’ waar-achter ’(HIER KOMT ONS PRO-GRAMMA)’ staat en druk opde zandloper. Je ziet dat deassembler met een foutmel-ding komt. Dubbelklik op diefoutmelding in de box van’Build Results’ en je ziet dat decursor naar de positie springtwaar deze fout gemaakt is.Na het assembleren is LED-PIC.HEX beschikbaar. Probeerdeze file te openen onder’file’. Kies ’all files’ en dubbel-klik op LEDPIC.HEX. Hierinstaat het volgende::02400E00ED00C3:00000001FF

Wat je hier ziet is de ’setting’voor de programmeer-fusesvan de PIC. Er is eigenlijk nieteens een programma maarMPLAB accepteert de assem-bly directives in elk geval wel.’Kop en staart’ is klaar, wegaan verder met het program-ma. Type in LEDPIC.ASM nuverder, zie listing 13.2.

ComponentName Pattern Value RefDes CompMake Description1N4004 DO41 D2 MultiComp 1A General Purpose Rectifier Diode78XX REG TO220 TO220-3 5V IC2 Motorola Regulator 1.5A Positive fixed voltageBOURNS PUSHB 6X6 BOURNS 6X6MM SW1 Bourns Bourns pushbutton PCB mountCKER 63V 1E CKER_1E 22p C1 AVX Multilayer Ceramic Capacitor X7R 63VCKER 63V 1E CKER_1E 22p C2 AVX Multilayer Ceramic Capacitor X7R 63VCKER 100N/63V 1E CKER_1E 100n C3 AVX Multilayer Ceramic Capacitor X7R 63VCKER 100N/63V 1E CKER_1E 100n C4 AVX Multilayer Ceramic Capacitor X7R 63VCKER 100N/63V 1E CKER_1E 100n C7 AVX Multilayer Ceramic Capacitor X7R 63VCKER 100N/63V 1E CKER_1E 100n C8 AVX Multilayer Ceramic Capacitor X7R 63VELCO 10U/63V ELCO_037_11 10u/63V C5 Philips 037-series 85-degree Radial CapacitorELCO 220U/35VLI ELCO_136_10.5MM 220u/35V C6 Philips 136-series Low ESR 105C Radial CapacitorIC-SOCKET_DIL18 IC-SOCKET_DIL18 SOCK1 Augat IC Insertion Socket machined contactsLED3MMB_HLMP_RED LED_3MM_BENDED Red 3mm D1 HP LED low current 3mm red with legs bendedMULTIFUSE 200MA MULTIFUSE 2E #1 200mA FUSE1 Bourns Multi Fuse MF-R series 60VPIC16F84-04/P DIL18 IC1RESISTOR SFR25 R SFR25 5% 1k R1 Philips Resistor Axial 250mW 5% RESISTOR SFR25 R SFR25 5% 100k R2 Philips Resistor Axial 250mW 5% RESONATOR 2PIN RESONATOR_2PIN 4MHz RES1 Murata Ceramic ResonatorTESTEYE CERAMICEYE1 9..16V EYE1 MicroVar Ceramic Test EyeTESTEYE CERAMICEYE1 GND EYE2 MicroVar Ceramic Test Eye Tabel 1 Benodigde

materialen

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor;

__CONFIG 005h ;Definieer hoe de PIC straks;geprogrammeerd moet worden,;het ˛programming;configuration word˛: Code;Protect = ON, Watchdog = ON,;Powerup Timer = ON,;Oscillator = XT;;(HIER KOMT HET PROGRAMMA);

END ; Einde van het programma

Listing 13.1

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor__CONFIG 005h ;’programming configuration

;word’ voor PIC16F84;************************

ORG 0000h ;Origin op 0000h (0000h =;hexadecimaal 0000’ enz.)

goto knipperstart ;ga naar knipperstart;************************

ORG 0100h ;Origin op 0100h, assembler;gaat vanaf hier verder

knipperstart clrwdt ;Waakhond een botje gevengoto knipperstart ;blijf in de lus hangen, ga

naar knipperstart;************************

END ;Einde van het programma

Listing 13.2

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor__CONFIG 005h ;’programming configuration

;word’ voor PIC16F84;***********************

status EQU 003h ;status-register in RAM op;positie 003h

ze EQU 2h ;zero-vlag in het;status-register, is bit 2

rp0 EQU 5h ;rp0-vlag in het;status-register, is bit 5

optreg EQU 081h ;option-register in RAM op;positie 081h, genaamd;optreg!

trisa EQU 085h ;poort A I/O;definitie-register in RAM;op 085h

porta EQU 005h ;poort A in RAM op positie;005h;************************

ORG 0000h ;Origin op 0000h (0000h is;hexadecimaal 0000’ enz.)

goto knipperstart ;ga naar knipperstart;************************

ORG 0100h ;Origin op 0100h, assembler;gaat vanaf hier verder

knipperstart clrwdt ;Waakhond een botje gevengoto knipperstart ;blijf in de lus hangen,

;ga naar knipperstart;************************

END ;Einde van het programma

Listing 14.1

Page 4: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

6

De directive ORG is belangrijk.Deze bepaalt vanaf welkeplek de assembler instructiesmoet assembleren. De eersteORG die de assembler tegen-komt staat op 0000h. Dus de’goto’-instructie staat op deze0000h. Deze ’goto’ verwijstmeteen naar knipperstart. Hetspringen naar 0100h is nood-zakelijk omdat de vector vande interrupt op 0004h staat.Daar mogen we niet in debuurt komen (zie de datas-heet van de PIC!). Bij knipperstart aangekomenkrijgt de waakhond iets teeten. Direct daarna komtweer een goto-instructie diewederom de waakhond ietste eten geeft, enz. Er is eenlus opgezet.

14. Knipperen vande LED, instellenvan belangrijkeregisters

Er moeten nog enkele dingengebeuren alvorens het pro-gramma verder kan wordenuitgewerkt:a. De waakhond instellenb. Zorgen dat pin 17 van de

PIC bereikbaar isHiervoor worden allereerstenkele belangrijke registersgedefinieerd. Breid het pro-gramma uit zodat het volgen-de in LEDPIC.ASM komt testaan. Vergeet niet af en toeop te slaan. Zie listing 14.1.

Hier vindt in feite vertalingvan datasheet naar assemblyplaats. Als je in de datasheethet gedeelte van de ’registerfile map’ opzoekt, zie je datEQU een assembly-directive isdie zorgt voor een verwijzingnaar een RAM-positie in de’register file map’. (Geheugen-steuntje: bij de PIC is een ’file’een geheugenlocatie in RAM)Probeer deze regels te verge-lijken en verifieer of de RAM-locaties in PICLED.ASM over-eenkomen met die in de da-tasheet. De ’ze’ en de ’rp0’ zijn uitzon-deringen: dit zijn verwijzingennaar een bit in een ’registerfile locatie’. De ’ze’ is de zero-flag en de ’rp0’ is de ’registerpage select 0’ van het status-register. De ’ze’ is het 2e biten de ’rp0’ is het 5e bit in hetstatus-register. (Kijk dit na inde datasheet) We moetendeze registers allemaal defi-nieren omdat MPASM andersniet begrijpt wat we willen:we kunnen namen niet zo-maar uit de lucht laten vallen.Vervolgens worden enkelebelangrijke registers ingesteld:’optreg’ en ’trisa’. Zie hiervoorlisting 14.2 en type deze aan-

vullingen in de PICLED.ASMbox. De eerste instructie ’bsf’staat voor ’bit set file’ en zalhet gekozen bit in de ’file’hoog maken. We maken ’rp0’ in het status-register hoog. Reden? Wemoeten naar hoger gelegenRAM (RAM1) om bij ’optreg’en ’trisa’ te kunnen komen.Dit zie je ook meteen: we la-den binair 00001111 in hetW-register en bewaren hemin ’optreg’ d.m.v. de instructie’movwf’. Als je weet dat met’file’ een RAM-locatie wordtbedoeld is het duidelijk: moveW to file. Hiermee is ’optreg’geladen met binair00001111. Waarom met deze waarde?Bekijk de datasheet: de laat-ste 3 bits zetten de prescalerop maximale delay. Bit 3 is detoewijzing van de prescalernaar de waakhond. Dat is al-les. Het resultaat is dat dewatchdog ingesteld is opmaximale tijd, en deze is on-geveer 2,3 seconden (ga ditna). Vervolgens gaan we hetregister ’trisa’ laden om pin17 van de PIC te kunnen ge-bruiken als uitgang voor deLED. De inhoud van de regis-ters ’tris’ bepaalt of de desbe-treffende I/O-pin ingang ofuitgang is. Als in zo’n ’tris’-re-gister een bit 0 wordt ge-maakt, komt dat overeen meteen uitgang. Een bit 1 staatvoor een ingang. Alleen bit 0van het ’trisa’-register is uit-gang: We laden 11111110 inW en bewaren hem in het ’tri-sa’-register. De instructie daar-na is een ’bcf’ (bit clear file)die zorgt dat weer in lager ge-legen RAM (RAM0) kan wor-den gewerkt.Wat je ook kan zien is dat delus in stand gehouden wordt.Waarom ook niet? Alleswordt netjes opnieuw gedefi-nieerd, telkens als de luswordt doorlopen. In de prak-tijk is deze redenering heelbelangrijk. Teveel program-meurs denken: „och, als heteenmaal is ingesteld zal hetwel loslopen”.De praktijk is helaas vaak an-ders: ’hangende’ apparatuurmoet dan even spanningsloosworden gemaakt voordat dewerking weer correct is.

15. Knipperen vande LED: LED aanen LED uit

Nu volgt het echte werk: hetknipperen van de LED zelf. Ditzijn eigenlijk maar twee in-structies. Voeg ze toe in LED-PIC.ASM, zie listing 15.1. Deinstructies ’bsf’ en ’bcf’ zagenwe al eerder. Bit 0 van ’porta’is eerst hoog en daarna weer

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor__CONFIG 005h ;’programming configuration

;word’ voor PIC16F84;***********************

status EQU 003h ;status-register in RAM op;positie 003h

ze EQU 2h ;zero-vlag in het;status-register, is bit 2

rp0 EQU 5h ;rp0-vlag in het;status-register, is bit 5

optreg EQU 081h ;option-register in RAM op;positie 081h, genaamd;optreg!

trisa EQU 085h ;poort A I/O;definitie-register in RAM;op 085h

porta EQU 005h ;poort A in RAM op positie;005h;************************

ORG 0000h ;Origin op 0000h (0000h is;hexadecimaal 0000 enz.)

goto knipperstart ;ga naar knipperstart;************************

ORG 0100h ;Origin op 0100h, assembler;gaat vanaf hier verder

knipperstart clrwdt ;Waakhond een botje gevenbsf status,rp0 ;Naar RAM bank 1, noemen we

;ook wel RAM1movlw. B’00001111’ ;Waakhond krijgt de

;prescaler met max.;delaytijd

movwf optreg ;bewaar in file ˛optreg˛movlw B’11111110’ ;laatste bit is een 0,

;wordt dus een uitgangmovwf trisa ;want we bewaren hem in

;˛trisa˛,is pin17, de;RA0-pin

bcf status,rp0 ;terug naar RAM0goto knipperstart ;blijf in de lus hangen, ga

;naar knipperstart;************************

END ;Einde van het programma

Listing 14.2

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor__CONFIG 005h ;’programming configuration

;word’ voor PIC16F84;***********************

status EQU 003h ;status-register in RAM op;positie 003h

ze EQU 2h ;zero-vlag in het;status-register, is bit 2

rp0 EQU 5h ;rp0-vlag in het;status-register, is bit 5

optreg EQU 081h ;option-register in RAM op;positie 081h, genaamd;optreg!

trisa EQU 085h ;poort A I/O;definitie-register in RAM;op 085h

porta EQU 005h ;poort A in RAM op positie;005h;************************

ORG 0000h ;Origin op 0000h (0000h is;hexadecimaal 0000’ enz.)

goto knipperstart ;ga naar knipperstart;************************

ORG 0100h ;Origin op 0100h, assembler;gaat vanaf hier verder

knipperstart clrwdt ;Waakhond een botje gevenbsf status,rp0 ;Naar RAM bank 1, noemen we

;ook wel RAM1movlw B’00001111’ ;Waakhond krijgt de

;prescaler met max.;delaytijd

movwf optreg ;bewaar in file ˛optreg˛movlw B’11111110’ ;laatste bit is een 0,

;wordt dus een uitgangmovwf trisa ;want we bewaren hem in

;trisa, is pin17, de;RA0-pin!

bcf status,rp0 ;terug naar RAM0bsf porta,0 ;LED aanbcf porta,0 ;LED uitgoto knipperstart ;blijf in de lus hangen, ga

;naar knipperstart;************************

END ;Einde van het programma

Listing 15.1

Page 5: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

7

laag. Pin 0 van ’porta’ is pin17 van de PIC. MPLAB kan ditassembleren tot een werkendprogramma. Programmeer de PIC enplaats hem in de schakeling.Wat je dan ziet? Ach, de LEDis gewoon continu aan. Maardat kan toch niet? Inderdaad.Meet met een oscilloscoop oppin 17. Je zult zien dat de PICde LED heel snel in- en uit-schakelt. Zo snel dat je datniet kunt zien: meer dan100000 keer per seconde!Hoe lossen we dit op? Er iseen stukje programma nodigwaarmee een vertraging ge-maakt wordt, zodat we hetknipperen van de LED metonze eigen ogen kunnenwaarnemen. Dit stukje pro-gramma is bij voorkeur her-bruikbaar en wordt een sub-routine of gewoon routine ge-noemd. De PIC heeft een in-structie om zo’n routine aante roepen, de instructie ’call’.Kijk dit na in de datasheet.Tevens heeft de PIC een in-structie om van de routine te-rug te keren, de instructie ’re-turn’. Hoe werkt dit nu? Alsde PIC een ’call’ tegenkomt,neemt hij het huidige adres,de PROGRAM COUNTER dus,telt daar 1 bij op en bewaartdit op de STACK. De STACK isin de vorige Technische Noti-ties besproken. Lees dit e.v.t.nog een keer na. De PIC doetnu een ’call’ naar het labeldat achter de ’call’-instructiestaat: hij springt naar dat la-bel. De PIC vervolgt zijn pro-gramma vanaf dat label. Eenpoosje later is het de bedoe-ling dat de instructie ’return’wordt gebruikt. De STACKwordt aangesproken en hetoriginele adres verhoogd met1, wordt uit de STACK ge-haald en in de PROGRAMCOUNTER gezet. Het program-ma vervolgt zijn weg net ach-ter de plek waar eerder de in-structie ’call’ plaatsvond. Hetis tijd voor een volgende lis-ting. Voeg deze instructiesook toe aan PICLED.ASM, zielisting 15.2.Direct nadat de LED is inge-schakeld met ’bsf porta,0’vindt een ’call’ naar het label’wachtmaar’ plaats. De PICspringt hier dus heen. Ter illu-stratie heb ik een ’nop’-in-structie gebruikt. Deze instruc-tie doet niets. Meteen achterdeze ’nop’ volgt ’return’ waar-door bij de volgende instruc-tie de PIC zijn programmavervolgt bij ’bcf porta,0’.

16. Knipperen vande LED metroutine’wachtmaar’

De routine ’wachtmaar’ moet

nu worden ingevuld. De PICheeft hier een handige in-structie voor: decfsz. Deze in-structie staat voor ’decrementfile and skip if zero’. Dat ’skipif zero’ wil niks anders zeggendan dat de PIC over de eerst-volgende instructie springt alshet register dat bij de instruc-tie hoort gelijk aan 0 is. Be-kijk het volgende stukje as-sembly, zie figuur 16.1.Register ’wacht1’ wordt metde instructie ’clrf’ 0 gemaakt.Een poosje later komt de PICde instructie ’dezfsz’ tegen.Register ’wacht1’ wordt ver-laagd met 1 en de PIC kijkt ofhij 0 geworden is. Helaas, re-gister ’wacht1’ is net van 00hnaar FFh gegaan en is dusnog lang geen 0. De PIC zaldus in de loop ’blijfhier’ blij-ven. Probeer dit mechanismezelf te doorgronden. De PICherhaalt deze ’decfsz’ exact256 maal voordat ’wacht1’ 0geworden is. De PIC springtover de instructie ’goto’ waar-na het programma wordt ver-volgd. Dit is dus de basis vooreen tijdvertraging: een wacht-lus, een delay-routine. Omdeze strategie te kunnen toe-passen voor het programmaLEDPIC moeten eerst enkelenieuwe registers worden ge-definieerd, zie figuur 16.2.

Zie figuur 16.3 voor de delay-routine.

Wat in de nieuwe delay-routi-ne ’wachtmaar’ gebeurt is eenbeetje gemeen: het is een lusbinnen een lus geworden. Pasna 256 keer is ’wacht1’ 0 ge-worden is en pas daarnawordt ’wacht2’ aangesproken.Ga zelf na dat dit 256 x 256 x3 instructies x1 ms per in-structie duurt, oftewel bijna200 ms. Dit is goed bruikbaarom de LED zichtbaar te latenknipperen. Een aantal lezers zal zich ver-bazen over de loop ’knipper-start’ die zo groot is en dathet wellicht een fout geeft inhet knipperen van de LED.Deze fout is niet merkbaaromdat met de 196600 in-structies van delay-routine’wachtmaar’ een zodaniggroot beslag op de PIC wordtgelegd dat je hier niets vanmerkt. Het enige gevolg is datna 100 jaar de PIC de LEDnog steeds laat knipperen.Telkens wordt alles netjes op-nieuw geïnitialiseerd en inge-steld. Bij deze geef ik de laat-ste listing (listing 16.1) waarinalle aanvullingen verwerktzijn. Het is voor elkaar, deLED knippert! Nu voorzichtigzelf verder. De volgende keerpakken we iets heftigers.

LIST P=16F84,C=75,F=INHX8M ;Definieer type processor__CONFIG 005h ;˛programming configuration

;word’ voor PIC16F84;***********************

status EQU 003h ;status-register in RAM op;positie 003h

ze EQU 2h ;zero-vlag in het;status-register, is bit 2

rp0 EQU 5h ;rp0-vlag in het;status-register, is bit 5

optreg EQU 081h ;option-register in RAM op;positie 081h, genaamd;optreg!

trisa EQU 085h ;poort A I/O;definitie-register in RAM;op 085h

porta EQU 005h ;poort A in RAM op positie;005h;************************

ORG 0000h ;Origin op 0000h (0000h is;hexadecimaal 0000 enz.)

goto knipperstart ;ga naar knipperstart;************************

ORG 0100h ;Origin op 0100h, assembler;gaat vanaf hier verder

knipperstart clrwdt ;Waakhond een botje gevenbsf status,rp0 ;Naar RAM bank 1, noemen we

;ook wel RAM1movlw B’00001111’ ;Waakhond krijgt de

;prescaler met max.;delaytijd

movwf optreg ;bewaar in file ˛optreg˛movlw B’11111110’ ;laatste bit is een 0,

;wordt dus een uitgangmovwf trisa ;want we bewaren hem in

;trisa, is pin17, de;RA0-pin!

bcf status,rp0 ;terug naar RAM0bsf porta,0 ;LED aancall wachtmaarbcf porta,0 ;LED uitcall wachtmaargoto knipperstart ;blijf in de lus hangen, ga

;naar knipperstart.;************************;WACHTROUTINE ˛wachtmaar˛

wachtmaar nop ;doe een instucie niks, ter;illustratie. Later;invullen

return ;terug naar hoofdprogramma,;de ˛knipperstart˛-loop;************************

END ;Einde van het programma

Listing 15.2

clrf wacht1 ;0 => wacht1;

blijfhier decfsz wacht1 ;verlaag wacht1 en spring;als 0

goto blijfhier ;indien niet 0 naar;˛blijfhier’;;programma wordt vervolgd

Figuur 16.1

clrf wacht1 ;0 => wacht1wacht1 EQU 020h ;wachtroutine-teller 1wacht2 EQU 021h ;wachtroutine-teller 2

Figuur 16.2

;************************; WACHTROUTINE ˛wachtmaar’

wachtmaar clrf wacht1 ;0 => wacht1clrf wacht2 ;0 => wacht2

blijfhier decfsz wacht1 ;verlaag wacht1 en spring;als 0

goto blijfhier ;indien niet 0 naar;˛blijfhier’

decfsz wacht2 ;verlaag wacht2 en spring;als 0

goto blijfhier ;indien niet 0 naar;˛blijfhier’

return ;terug naar hoofdprogramma,;de ˛knipperstart’-loop;************************

Figuur 16.3

Page 6: Technische Notities van PE1RRT - jancorver.org · versie van deze datasheet is vereist. Microchip stelt zijn ... dat je met de PIC16F84x wilt ontwikkelen, met alleen de editor van

8

LIST P=16F84, C=75, F=INHX8M ;Definieer type processor.__CONFIG 005h ;’programming configuration

;word’ voor PIC16F84;***********************

status EQU 003h ;status register in RAM op;positie 003h

ze EQU 2h ;zero-vlag in het;status-register, is bit 2

rp0 EQU 5h ;rp0-vlag in het;status-register, is bit 5

optreg EQU 081h ;option-register in RAM op;positie 081h, genaamd;optreg!

trisa EQU 085h ;poort A I/O;definitie-register in RAM;op 085h

porta EQU 005h ;poort A in RAM op positie;005h

wacht1 EQU 020h ;wachtroutine-teller 1wacht2 EQU 021h ;wachtroutine-teller 2

;************************ORG 0000h ;Origin op 0000h (0000h is

;hexadecimaal 0000’ enz.)goto knipperstart ;ga naar knipperstart

;************************ORG 0100h ;Origin op 0100h, assembler

;gaat vanaf hier verderknipperstart clrwdt ;Waakhond een botje geven

bsf status,rp0 ;Naar RAM bank 1, noemen we;ook wel RAM1

movlw B’00001111’ ;Waakhond krijgt de

;prescaler met max.;delaytijd

movwf optreg ;bewaar in file ˛optreg˛movlw B’11111110’ ;laatste bit is een 0,

;wordt dus een uitgangmovwf trisa ;want we bewaren hem in

;trisa, is pin17, de;RA0-pin!

bcf status,rp0 ;terug naar RAM0bsf porta,0 ;LED aancall wachtmaarbcf porta,0 ;LED uitcall wachtmaargoto knipperstart ;blijf in de lus hangen, ga

;naar knipperstart;************************; WACHTROUTINE ’wachtmaar’

wachtmaar clrf wacht1 ;0 => wacht1clrf wacht2 ;0 => wacht2

blijfhier decfsz wacht1 ;verlaag wacht1 en spring;als 0

goto blijfhier ;indien niet 0 naar;’blijfhier’

decfsz wacht2 ;verlaag wacht2 en spring;als 0

goto blijfhier ;indien niet 0 naar;’blijfhier’

return ;klaar, terug naar;hoofdprogramma, de;’knipperstart’-loop;************************

END ;Einde van het programma

Listing 16.1