Voorwoord
Gedurende het afstudeerjaar kiezen alle laatstejaarsstudenten een eindwerk. Doorheen het jaar is de donderdag voorzien om dit eindwerk tot een goed einde te brengen. In januari is er tevens een week voorzien om hieraan te werken. Dit technisch rapport moet een duidelijke en volledige uitleg geven over de verschillende aspecten van dit eindwerk. Deze verhandeling wordt tevens naar voor gebracht waarbij een jury de inhoud beoordeelt. Een eindwerk tot een goed einde brengen is niet vanzelfsprekend, zeker niet zonder de hulp van een aantal mensen. Ik zou graag iedereen bedanken die me theoretisch, praktisch of moreel gesteund heeft om te slagen in dit project. Dit zijn in de eerste plaats mijn mentoren: Dhr. Windels Marc en Dhr. Samyn Benjamin. Zonder hen was er van dit eindwerk geen sprake. De interesse die ze toonden doorheen dit eindwerk was een drijfveer tot slagen. Op de steun van de docenten en assistenten van de afdeling elektronica kon ik ook steeds rekenen. Een speciaal dankwoord aan Dhr. Vantomme Wim en Dhr. Vanhoutte Xavier. Deze twee mensen waren steeds bereid mij te helpen wanneer ik het wat moeilijker had met praktische zaken. Ten slotte wil ik ook nog mijn ouders, klasmakkers en vrienden bedanken, die een grote steun waren doorheen dit project en mijn studies in het algemeen.
Dubrul Stijn, 30 mei 2007
I.
Inhoudsopgave Voorwoord.....................................................................................I Inhoudsopgave ............................................................................ II Gebruikte symbolen en afkortingen.................................................. V Lijst van figuren ...........................................................................VI Lijst van tabellen .........................................................................VII Lijst van formules ...................................................................... VIII Lijst van programmacodes.......................................................... VIII Inleiding......................................................................................IX 1 Opdrachtomschrijving ................................................................. 1 1.1 Onderzoek EasyPIC3 ............................................................. 1 1.2 Vermogentoepassing............................................................. 2 2 De PICmicro............................................................................... 3 2.1 Wat is een microcontroller?.................................................... 3 2.2 Microchip Technology en andere fabrikanten ............................ 4 2.4 Types & naamgeving ............................................................. 5 2.5 Inwendige opbouw................................................................ 7 2.5.1 Architectuur..................................................................... 7 2.5.2 Datageheugen: SFR & GPR ................................................ 9 2.5.3 Modules en I/O .............................................................. 11 2.5.4 Speciale functies ............................................................ 11 2.6 Minimale randcomponenten ................................................. 12 2.7 Het programmeerproces ...................................................... 13 2.8 Assembleerprogramma........................................................ 15 3 Development bord EasyPIC3 ...................................................... 17 3.1 Beschrijving ....................................................................... 17 3.2 Mogelijkheden EasyPIC3 ...................................................... 18 3.3 Mogelijkheden 16F877A....................................................... 21
II.
4 Software EasyPIC3.................................................................... 22 4.1 Gevolgde strategie.............................................................. 22 4.2 Digitale I/O ........................................................................ 23 4.2.1 Doel ............................................................................. 23 4.2.2 Instellen en lezen/schrijven van een pin............................ 23 4.2.3 Wachtroutines................................................................ 24 4.2.4 De 7-segment displays.................................................... 26 4.2.5 Externe interrupt op pin RB0 ........................................... 29 4.4 LCD .................................................................................. 31 4.4.1 Doel ............................................................................. 31 4.4.2 Werking ........................................................................ 31 4.4.3 Routines........................................................................ 32 4.4.4 Voorbeeldprogramma’s ................................................... 33 4.5 RS232 ............................................................................... 34 4.5.1 Doel ............................................................................. 34 4.5.2 De module..................................................................... 34 4.5.3 Lezen en versturen......................................................... 36 4.5.4 Voorbeeldprogramma ..................................................... 37 4.5.5 Een volledige zin versturen via een macro ......................... 38 4.6 A/D-conversie .................................................................... 39 4.6.1 Doel ............................................................................. 39 4.6.2 Werking ........................................................................ 39 4.6.3 Voorbeeldprogramma ..................................................... 40 4.6.4 Voorbeeldprogramma via interrupt ................................... 42 4.7 Timers............................................................................... 45 4.7.1 Doel ............................................................................. 45 4.7.2 Vergelijking ................................................................... 45 4.7.3 De WDT ........................................................................ 46 4.7.4 Timer 0 ......................................................................... 46 4.7.5 Timer 1 ......................................................................... 46 4.7.6 Timer 2 ......................................................................... 48 4.8 PWM ................................................................................. 49 4.8.1 Doel ............................................................................. 49 4.8.2 Werking ........................................................................ 49 4.8.3 PWM met vaste duty-cycle............................................... 50 4.8.4 PWM met variabele duty-cycle ......................................... 51 4.9 Data EEPROM ..................................................................... 53 4.9.1 Doel ............................................................................. 53 4.9.2 Routines........................................................................ 53 4.9.3 Voorbeeldprogramma ..................................................... 53 4.10 Reset-condities ................................................................. 55 4.10.1 Doel............................................................................ 55 4.10.2 Werkwijze.................................................................... 55 4.10.3 Voorbeeldprogramma.................................................... 56 4.10.4 Opmerkingen ............................................................... 57 4.11 Ervaringen met EasyPIC3................................................... 58
III.
5 Vermogentoepassing ................................................................. 59 5.1 Keuze van de toepassing ..................................................... 59 5.2 Enhanced PWM................................................................... 60 5.3 Hardware........................................................................... 62 5.3.1 Elektrisch schema .......................................................... 62 5.3.1.1 Opbouw .................................................................... 62 5.3.1.2 De voeding ............................................................... 62 5.3.1.3 De sturing................................................................. 63 5.3.1.4 De H-brug................................................................. 64 5.3.2 Printontwerp (PCB)......................................................... 67 5.3.3 Stuklijst ........................................................................ 68 5.4 Software............................................................................ 69 5.4.1 Testprogramma halve brug.............................................. 69 5.4.2 Meetresultaten halve brug ............................................... 69 5.4.3 Gemoduleerde sinusgolf .................................................. 73 5.4.4 Implementatie in het programma ..................................... 75 5.4.5 Hoofdprogramma H-brug ................................................ 77 5.4.6 Meetresultaten H-brug .................................................... 79 6 Algemeen besluit ...................................................................... 83 Literatuurlijst .............................................................................. 84 Bijlagen...................................................................................... 85
IV.
Gebruikte symbolen en afkortingen µC ADC ASCII BOR CCP CPU DIP DSC EEPROM FET GPR HSB I/O IC ICD ICSP IDE ISR LCD LSB LVP MCLR MSSP OST PC PCB PGD PGC PIC POR PSP PWM PWRT RAM RISC ROM SFR TTL USART WDT
MicroController Analoog Digitaal Converter American Standard Code for Information Interchange Brown-Out Reset capture, compare & PWM Central Processing Unit Dual Inline Package Digital Signal Controller Electrical Erasable Programmable Read Only Memory Field Effect Transistor General Purpose Register highest significant bit Input/Output Integrated Circuit In-Circuit Debugger In-Circuit Serial Programming Integrated Development Environment Interrupt Service Routine Liquid Crystal Display least significant bit Low-Voltage Programming Master clear Synchronous Serial Port Oscillator Start-up Timer Program Counter Printed Circuit Board, printplaat ProGram Data ProGram Clock microcontroller van Microchip Power-On Reset Parallel Slave Port puls width modulation PoWeR-up Timer Random Acces Memory Reduced Instruction Set Computer Read Only Memory Special Function Register Transistor Transistor Logic Universal Synchronous/Asynchronous Receiver Transmitter Watch Dog Timer
V.
Lijst van figuren Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur
1: een µC in DIP-behuizing ................................................... 3 2: fabrikanten die µC's produceren ........................................ 4 3: de Harvard-architectuur ................................................... 7 4: blokschema van de PIC16F84A .......................................... 8 5: geheugenmap van de 16F877A........................................ 10 6: pinaansluiting van de 16F877A ........................................ 11 7: randcomponenten van een PIC ........................................ 12 8: the Microchip design circle .............................................. 13 9: MPLAB ICD2 programmer ............................................... 14 10: het programmeerproces................................................ 14 11: het EasyPIC3 ontwikkelbord .......................................... 17 12: EasyPIC3-driver in het Windows apparaatbeheer ............. 19 13: PICflash 2 programmer................................................. 19 14: elektrisch schema van de onboard programmer ............... 20 15: de PIC16F877A............................................................ 21 16: flowchart wachtroutine ................................................. 24 17: aansluitingen van de 7-segment displays ........................ 26 18: adresbepaling bij een computed goto ............................. 27 19: flowchart computed goto .............................................. 27 20: flowchart 7-segment sturing.......................................... 28 21: flowchart van een ISR .................................................. 29 22: flowchart instructie naar LCD......................................... 32 23: flowchart data naar LCD ............................................... 32 24: flowchart initialiseren LCD ............................................. 32 25: tekst op het scherm van de LCD .................................... 33 26: elektrisch schema LCD met 8-bits databus ...................... 33 27: elektrisch schema LCD met 4-bits databus ...................... 33 28: Elektrisch schema RS-232............................................. 34 29: flowchart initialiseren RS-232 ........................................ 35 30: flowchart ontvangen van een char.................................. 36 31: flowchart versturen van een char ................................... 37 32: flowchart A/D-conversie................................................ 40 33: werking van de PWM-module......................................... 50 34: instellen van de PWM-module ........................................ 51 35: opwekken van een periodiek signaal............................... 51 36: Output van de EEPROM................................................. 53 37: geheugendump van de EEPROM..................................... 54 38: flowchart achterhalen oorzaak reset ............................... 56 39: uitvoer van het reset-programma .................................. 57 40: H-brug d.m.v. PWM met de PIC16F690........................... 59 41: voorstelling van een magische sinusgolf.......................... 60 42: blokschema van de enhanced PWM-module..................... 61 43: forward en reverse mode .............................................. 61 44: elektrisch schema van de voeding .................................. 62 VI.
Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur
45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73:
elektrisch schema van de vermogenspanning .................. 63 elektrisch schema van het stuurgedeelte......................... 64 elektrisch schema van een halve brug ............................ 65 inwendige van de driver IR2113 .................................... 65 foto van de vermogenprint ............................................ 67 de halve brug belasten ................................................. 69 oscilloscoopbeeld PWM-stuursginalen ............................. 70 oscilloscoopbeeld dode tijd ............................................ 70 oscilloscoopbeeld gate-source spanningen....................... 71 oscilloscoopbeeld drain-source spanningen...................... 71 oscilloscoopbeeld output 1 ............................................ 72 oscilloscoopbeeld output 2 ............................................ 72 magische sinusgolf met 7 pulsen per kwadrant ................ 73 spectrum van een magische sinusgolf............................. 73 screenshot van de magic sinwave calculator .................... 75 vertrekpunt programma................................................ 75 ophalen volgende duty-cycle ......................................... 76 flowchart initialisatie .................................................... 77 flowchart ISR .............................................................. 77 flowchart hoofdprogramma ........................................... 78 voorstelling lookup-tables ............................................. 78 oscilloscoopbeeld stuursignalen ..................................... 79 oscilloscoopbeeld detail van de stuursignalen .................. 80 oscilloscoopbeeld uitgangssignaal .................................. 80 oscilloscoopbeeld detail van het uitgangssignaal .............. 81 oscilloscoopbeeld spectrum van het uitgangssignaal ......... 81 RC-filter...................................................................... 82 oscilloscoopbeeld gefilterde uitgangsspanning ................. 82 oscilloscoopbeeld detail gefilterde uitgangsspanning ........ 82
Lijst van tabellen Tabel Tabel Tabel Tabel Tabel
1: 2: 3: 4: 5:
naamgeving bij PICs.......................................................... 5 jumper en dipswitch-instellingen op de EasyPIC3 ................ 18 mogelijkheden van de PIC16F877A ................................... 21 de timer-modules............................................................ 45 stuklijst vermogenprint .................................................... 68
VII.
Lijst van formules Formule Formule Formule Formule Formule Formule Formule Formule Formule Formule Formule
1: de tijdsduur van een instruction cycle ............................ 24 2: het berekenen van de baudrate bij seriële communicatie.. 34 3: bittijd en conversietijd van de ADC ................................ 39 4: berekenen van de tijd tot timer 0 interrupt..................... 46 5: berekenen van de tijd tot timer 1 interrupt..................... 47 6: berekenen van de tijd tot timer 2 interrupt..................... 48 7: formules voor PWM ..................................................... 50 8: spanningsval over de stuurcondensator.......................... 66 9: een puls in het Fourier-spectrum................................... 74 10: harmonischen van een puls ........................................ 74 11: stelsel van harmonischen ........................................... 74
Lijst van programmacodes Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code Code
1: assembler template ......................................................... 15 2: instellen van digitale poorten ............................................ 23 3: wachtroutine van 250µs ................................................... 24 4: knipperlicht..................................................................... 25 5: computed goto routine bin2seg ......................................... 27 6: interrupt-programma INT/RB0 .......................................... 30 7: initialiseren van RS-232 ................................................... 35 8: ontvangen van een char ................................................... 36 9: versturen van een char .................................................... 37 10: voorbeeldprogramma loopback RS232.............................. 37 11: macro om een string te versturen via RS232..................... 38 12: schema A/D met uitvoer via LED's ................................... 41 13: A/D-conversie met vaste samplefrequentie ....................... 42 14: ADC-module met interrupt: variabel looplicht .................... 44 15: initaliseren van timer 1................................................... 47 16: periode update in ISR voor timer 1 .................................. 47 17: PWM-signaal met variabele duty-cycle.............................. 52
VIII.
Inleiding Ik heb gekozen voor het onderwerp ‘Onderzoek en ontwikkeling van de Microchip PICmicro 16F-reeks’. Microcontrollers hebben een breed toepassingsveld en krijgen steeds meer interne mogelijkheden en interfaces met de omgeving. Omdat ze overal aanwezig zijn, lijkt het me een boeiende en leerzame ervaring om deze eens van dichter te bekijken. Met deze gedachte heb ik besloten om dieper in te gaan op dit onderwerp. Dit is een intern eindwerk en bestaat hoofdzakelijk uit onderzoek en softwareontwikkeling voor de PICmicro van Microchip. Docent Marc Windels is van plan om de resultaten van dit eindwerk te gebruiken in de toekomstige labozittingen van het vak microcontrollers en vermogenelektronica. Hierbij wordt er geprogrammeerd in assembler. Een meer gedetailleerde opdrachtomschrijving volgt in het volgende hoofdstuk. Voor de duidelijkheid is dit rapport opgesplitst in een aantal deelaspecten die nader uitgewerkt zijn. In het eerste hoofdstuk wordt de precieze opdracht omschreven. Daarna volgt er een beknopte theoretische uiteenzetting omtrent de PICmicro. Het volgende deel vertelt wat meer omtrent het ontwikkelbord EasyPIC3, gevolgd door de ontwikkelde software voor dit bord. De vermogentoepassing wordt uitgebreid besproken in het daaropvolgende hoofdstuk. De resultaten worden geëvalueerd om zo te eindigen met de conclusies.
IX.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
1 Opdrachtomschrijving 1.1 Onderzoek EasyPIC3 In eerste instantie wordt er gewerkt met de EasyPIC3, een low-cost ontwikkelbord van de firma Mikroelektronika dat beschikbaar is in het labo. De 16F877A-microcontroller wordt hier als kern gebruikt. Alle interessante mogelijkheden van deze microcontroller worden uitvoerig onderzocht met behulp van het ontwikkelbord. In dit deel wordt er dus geen overkoepelend eindproduct ontwikkeld of iets totaal nieuws gemaakt. De bedoeling is hier dat de basismogelijkheden van de combinatie van de 16F877A en het ontwikkelbord onderzocht worden. Er wordt hier dus enkel software ontwikkeld, in de assembleertaal. De resultaten van deze opgave kunnen in volgende academiejaren als referentie of als naslagwerk gebruikt worden om verdere toepassingen te ontwikkelen. Om bepaalde routines en programmeerwijzen te verduidelijken wordt er gedocumenteerd a.d.h.v. flowcharts. De uitwerking van deze programma’s is later in deze scriptie opgenomen. Concreet worden de volgende mogelijkheden bestudeerd: -
-
digitale I/O o inlezen van drukknoppen en aansturen van LED’s o aansturen van 4 gemultiplexte 7-segment displays o aansturen LCD-display d.m.v. een 4 of 8 bits databus interrupts A/D-conversie seriële communicatie opzetten (RS232) timers pulsbreedte modulatie (PWM) EEPROM reset-condities
Dubrul Stijn
Master Elektronica-ICT
1.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
1.2 Vermogentoepassing In het tweede deel van dit eindwerk wordt afgestapt van het ontwikkelbord en wordt er een concrete toepassing uitgewerkt voor het labo vermogenelektronica. Hier wordt er gebruik gemaakt van een andere microcontroller, namelijk de 16F690, die enkele verbeterde (enhanced) functies bevat. Vooral de ‘enhanced capture and compare PWM-module’ wordt van dichtbij bekeken. Via pulsbreedte modulatie is het mogelijk om FETs gecontroleerd en precies te schakelen. Zo kun je vanuit een gelijkspanning (DC) een wisselspanning (AC) vormen, via de nodige PWM-signalen. Voor deze toepassing moet vanzelfsprekend een printplaat (PCB) ontwikkeld worden met de nodige randcomponenten. De precieze werking en opbouw van deze schakeling en de ontwikkelde software wordt later in deze scriptie besproken.
In bijlage 1 is de projectfiche terug te vinden waar de opdracht en de beperkingen ervan besproken worden. Een concrete planning met mijlpalen is er ook in terug te vinden. Bijlage 2 bevat een informatieposter met een korte voorstelling van deze thesis. Een samenvatting van dit eindwerk is terug te vinden in bijlage 3.
Dubrul Stijn
Master Elektronica-ICT
2.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
2 De PICmicro 2.1 Wat is een microcontroller? Een microcontroller (µC) is een informatieverwerkend systeem in 1 enkele chip dat gebruikt wordt om elektronische apparatuur te besturen. In tegenstelling tot een microprocessor die je in een PC terugvindt zijn deze chips op enkele randcomponenten na volledig op zichzelf werkend. Je vindt deze componenten terug in: magnetrons, wasmachines, telefoons en zelfs speelgoed. Een typische µC is onderaan deze pagina afgebeeld. De µC is ontworpen om toegewijde, specifieke taken uit te voeren (CPU), die hij uit zijn niet-volatiel programmageheugen (ROM) ophaalt. De nodige bewerkingen worden uitgevoerd (RAM) om zodoende gepast te reageren via een interface of via periferie (I/O). Een µC is (her)programmeerbaar, waardoor het een flexibele component is. Het zijn relatief goedkope IC’s, waardoor ze wijdverspreid zijn. De meerderheid van de computersystemen die gebruikt worden vandaag zijn ‘embedded systems’. De µC valt ook onder deze categorie en is waarschijnlijk het eenvoudigste voorbeeld van een ingebed of geïntegreerd systeem. Ingebedde systemen hebben meestal minimale eisen qua geheugen en programmalengte, wat hen compact maakt. Deze systemen ondersteunen simpele, maar op het eerste zicht ongewone I/O. Een monitor, harde schijf of een printer van een PC kan niet zomaar aangesloten worden. Voorbeelden van I/O waar deze componenten wel goed mee overweg kunnen zijn: een relais, een schakelaar, een LED of zelfs een spanning. Deze systemen vindt je vanzelfsprekend terug in elektronische sturingen of regelkringen.
Figuur 1: een µC in DIP-behuizing
Dubrul Stijn
Master Elektronica-ICT
3.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
PIC’s zijn bijzonder populair bij ontwikkelaars en hobbyisten door de volgende redenen: -
lage kostprijs (enkele euro’s per component) hoge beschikbaarheid en ruim varianten aanbod uitgebreide collectie van toepassingsnotities lage kostprijs van de ontwikkeltools, veel software en compilers zijn gratis gebruiksgemak omdat ze herprogrammeerbaar zijn, en dit in circuit
Een PIC heeft heel wat mogelijkheden aan boord. Dit uit zich al wanneer je de datasheet van een willekeurige PIC bekijkt. Deze bedraagt een paar honderd bladzijden aan informatie. Merendeel van deze pagina’s beschrijft de werking van de inwendige modules. Deze complexe en uitgebreide hardware is dan ook goed gedocumenteerd. De instructieset om deze modules aan te sturen is echter beperkt. We hebben dan ook te doen met een RISC-processor.
2.2 Microchip Technology en andere fabrikanten Er zijn heel wat fabrikanten die µCs vervaardigen. Bijna elke firma die halfgeleiders produceert, maakt ook µCs. In deze thesis worden enkel de PICs van Microchip bestudeerd. Voor de volledigheid is er hier een opsomming van de belangrijkste fabrikanten van µCs opgenomen: -
Microchip Technology: de PICmicro en dsPIC-reeks Intel: MCS-reeks Ubicom: snelle PIC-klonen Atmel: AVR en 8051 Dallas Maxim: low-power 16 bits RISC Motorola: 68HC-reeks Philips: 8051 Parallax: BASIC stamps
Figuur 2: fabrikanten die µC's produceren
Dubrul Stijn
Master Elektronica-ICT
4.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Een hele lange tijd geleden produceerde de afdeling Microelectronics van de firma General Instruments een chip genaamd de PIC1650. Deze chip werd beschreven als een ‘Programmable Intelligent Computer’. Deze component is de moeder van alle PICmicro-chips. Zijn functionaliteit is vergelijkbaar met de huidige PIC16C54. Deze controller werd ingezet als randapparaat voor de CP1600-microprocessoren. Daarom wordt de afkorting PIC vaak ingevuld als ‘Peripheral Interface Controller’. In het jaar 1989 werd Microchip Technology opgericht door een groepering van gedurfde kapitalisten die de afdeling verworven van General Instruments. Er is echter geen informatie te vinden hoe Microchip tegenwoordig de afkorting PIC invult. Onlangs zijn ze gestart met een nieuwe benaming: ‘PICmicro MCU’, wat staat voor ‘PICmicro Multi-Chip Unit’. De benamingen PIC en PICmicro worden zowat door elkaar gebruikt en meestal weggelaten. Nog even opmerken dat Microchip op 8 november 2006 de verzending van zijn 5 miljardste PIC Microcontroller aankondigde.
2.4 Types & naamgeving De naamgeving van een PIC is gekoppeld aan het type maar is niet altijd even eenduidig of eenvoudig om te achterhalen. Er bestaan dan ook heel wat uitzonderingen.
De volgende patronen zijn echter opmerkbaar:
hoofdtype
prefix
PIC
10 12 16 18
programma geheugen
(L) (L)
F C
type
(R) (E) xxx
revisie
(A) (B) …
temp.
-
(I) (E)
freq.
(04) / (20)
behuizing
PDIP SSOP …
Tabel 1: naamgeving bij PICs
Voor de 8-bits MCUs wordt het hoofdtype aangeduid door de 3 letters: PIC. Er bestaan momenteel nog 2 hoofdtypes: de 16-bits MCUs (ook aangeduid als PIC) en de 16-bits DSCs (aangeduid als dsPIC). Deze letteraanduidingen worden echter vaak weggelaten.
Dubrul Stijn
Master Elektronica-ICT
5.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
De prefix van een PIC bestaat uit 2 cijfers en heeft betrekking op het volgende: • • • •
prefix 10: PICs met een 12-bits programmawoord en 6 of 8 pinnen prefix 12: 12 en 14-bits programmawoord met 8 pinnen prefix 16: 12 en 14-bits programmawoord met meer dan 8 pinnen prefix 18: 16-bits programmawoord
Vervolgens wordt het type programmageheugen aangeduid: • • • • •
een L duidt aan dat het om een low-voltage variant gaat type F: flash, elektronisch herprogrammeerbaar type C : EPROM, slechts 1 maal programmeerbaar (OTP) of met een window type CR: in dit geval is de ROM voorgeprogrammeerd in de fabriek type CE: in dit geval is er een aparte EEPROM aanwezig in de chip
Het type duidt alle varianten van de PICs aan en daarmee wordt de aanwezige inwendige hardware bedoeld. Het bestaat steeds uit 3 cijfers maar er is geen logica in terug te vinden. Na het type volgt er eventueel een letter die de revisie van de chip aanduid. Hierna volgt er eventueel een temperatuursaanduiding: I staat voor industrial en E staat voor extended. Deze kan ook gevolgd worden door een aanduiding van maximum klokfrequentie. Deze 2 aanduidingen worden enkel vermeld wanneer er van dezelfde PIC varianten zijn qua temperatuur of klokfrequentie. Als laatste volgt er informatie over het type behuizing (package). PICs komen in zowat alle types behuizingen voor. Deze structuur geldt voor het overgrote deel van de PICs maar zeker niet voor allemaal. Om maar een paar uitzonderingen op te noemen: • • • •
PIC14000: dit is een mixed-signal PIC omdat het analoge functies aan boord heeft PIC16C85: heeft een EEPROM aan boord, vergelijkbaar met flash, toch staat er een C in zijn typenummer PIC16HV540: deze PIC heeft een ingebouwde spanningsregelaar de PIC17-reeks waren de voorlopers van de PIC18-reeks, ze zijn echter zonder succes uit productie gehaald
Dubrul Stijn
Master Elektronica-ICT
6.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Natuurlijk kun je alle soorten PICs op veel manieren gaan catalogeren. Hier werd geprobeerd om d.m.v. de naamgeving ze te catalogeren. Maar er zijn nog andere mogelijkheden: -
grootte van het programmageheugen grootte van de aanwezige RAM/ROM aantal I/O-pinnen interne mogelijkheden: ADC, timers, PWM, interne oscillator, max. klokfrequentie,… interfaces: USART, USB, CAN, ethernet,…
Meestal zal een combinatie van parameters uitmaken welke PIC het meest geschikt is voor een bepaalde applicatie. In deze thesis wordt met 2 types gewerkt. De 16F877A is een leuke PIC om mee te starten door het grote aantal pinaansluitingen. De 16F690 is gekozen om wat dieper in te gaan op de verbeterde mogelijkheden van de PWM-module. Eenmaal je het programmeren van 1 type PIC onder de knie hebt, is het makkelijk om over te stappen naar een ander type.
2.5 Inwendige opbouw 2.5.1 Architectuur Alle PICs volgen de Harvard-architectuur zoals in onderstaande figuur. Dit wil zeggen dat het geheugen voor de programmacode en het geheugen voor de data gescheiden zijn. Er wordt ook geen gebruik gemaakt van pipelining, De meeste instructies zullen dus 1 klokcyclus (4 klokpulsen) duren. Er kan geen extern programmageheugen gebruikt worden bij een PIC want er is geen externe geheugenbus aanwezig. Er zijn hier echter een paar uitzonderingen op te vinden in de PIC18-reeks.
Figuur 3: de Harvard-architectuur
In volgende figuur is het blokdiagram van de inwendige opbouw van de PIC16F84A weergeven. Deze opbouw is voor alle PICs gelijkaardig maar soms nog een groot stuk uitgebreid met modules of I/O-pinnen. De belangrijkste delen zijn aangeduid met cijfers en worden verder besproken.
Dubrul Stijn
Master Elektronica-ICT
7.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
1 4 2
5
3
9
6
7 10
8
Figuur 4: blokschema van de PIC16F84A
Op de figuur is duidelijk zichtbaar dat programmacode (1) en datageheugen (4) gescheiden opgeslagen worden. We zien hier ook duidelijk dat de instructies 14-bits breed zijn. Het geheugen en de databussen zijn 8-bits breed. De instructies worden geselecteerd door middel van de programcounter (2). De programcounter is beïnvloedbaar door een aantal SFRs die in het datageheugen aanwezig zijn. Er is tevens een hardware stack (3) van enkele niveaus diep die vanzelfsprekend dezelfde breedte heeft als de programcounter. De stack houdt terugkeeradressen bij wanneer er gesprongen wordt naar een subroutine. De 2 belangrijkste onderdelen in dit blokdiagram zijn het W-register en de ALU (8). De data, waar bewerkingen op uitgevoerd moeten worden, wordt opgeslagen in het W-register. De bewerkingen zelf worden uitgevoerd door de ALU. Het resultaat is terug beschikbaar in het Wregister.
Dubrul Stijn
Master Elektronica-ICT
8.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
2.5.2 Datageheugen: SFR & GPR Het datageheugen (4) bevat 2 types registers: -
-
Special Function Registers (SFR): Deze registers bepalen de werking van de inwendige apparatuur of geven informatie over de werking weer. De configuratie van de PIC vindt dus in deze registers plaats. General Purpose Registers (GPR): Deze registers zijn vrije geheugenplaatsen en kunnen gebruikt worden om 8-bits variabelen op te slaan.
Het datageheugen van een PIC is onderverdeeld in banken. Dit wil zeggen dat eerst de juiste bank geselecteerd moet worden vooraleer een register toegankelijk is. Deze selectiebits zijn aanwezig in het STATUS-register (6), dat over alle banken toegankelijk is. Naast deze directe methode is er ook een indirecte adresseermethode, die echter nog steeds de huidige waarde van de bankselectbit(s) gebruikt. Deze methode plaatst het adres (een pointer) van het te selecteren register in het FSR (file select register). De data is dan beschikbaar in het INDFregister (indirect file register). Merk op dat toegang tot de interne EEPROM (5) van een PIC ook via een aantal SFRs verloopt. Hier moet er dus ook indirect geadresseerd worden. De routine hiervoor is verder in deze thesis uitgewerkt. Een voorbeeld van een geheugenmap is op de volgende pagina opgenomen. Het gaat hier om de geheugenmap van de 16F877A. Deze heeft 4 geheugenbanken (0 t.e.m. 3). Bepaalde geheugenlocaties zijn niet geïmplementeerd of gereserveerd door het systeem (zwart). Sommige registers overlappen alle banken (geel). Voorbeelden van overlappingen zijn: STATUS, INTCON en het laatste deel van de GPRs. Registers kunnen overlappend zijn omdat ze steeds toegankelijk moeten zijn (zoals STATUS waar de bank gewijzigd kan worden) of omdat ze snel toegankelijk moeten zijn (zoals INTCON waar de interrupt-werking geregeld wordt). Een deel van het GPR-geheugen is ook overlappend. Deze variabelen zijn dus ook snel toegankelijk. Deze locaties zullen meestal gebruikt worden tijdens een ISR. Waarvoor elke bit uit elk register precies dient kan vanzelfsprekend teruggevonden worden in de datasheet van de PIC. Het heeft dan ook geen zin om dit over te nemen. De registers kunnen wel ingedeeld worden volgens hun functie. Veel van deze functies hebben rechtstreeks te maken met de modules die de PIC inwendig aan boord heeft. Dit is te zien op de volgende pagina.
Dubrul Stijn
Master Elektronica-ICT
9.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 5: geheugenmap van de 16F877A
-
algemeen: I/O-poorten: timer0/1/2: interrupts: CCP1/2:
Dubrul Stijn
wit rood oranje lichtgroen donkerpaars
-
USART: MSSP: EEPROM: ADC: GPR:
Master Elektronica-ICT
donkergroen bruin donkerblauw lichtblauw lichtpaars
10.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
2.5.3 Modules en I/O Een PIC heeft altijd hardwaremodules aanwezig die eventueel verbonden zijn met bepaalde I/O-pinnen. De 16F87 heeft er maar 2: een timer (9) en een digitale I/O-port (10). Er kunnen er echter veel meer zijn. Hieronder een lijst met wat een PIC zo allemaal aan boord kan hebben: -
digitale I/O-pinnen interne klokoscillatoren 8/16-bits timers interne EEPROM USART MSSP (I²C en SPI)
-
PSP (Parallel Slave Port) CCP: capture, compare en PWM A/D-converters USB CAN ethernet
Deze lijst wordt in de toekomst zeker nog uitgebreid. Door het grote aantal modules die soms aanwezig zijn in één chip worden I/O-pinnen vaak gemultiplext. Tijdens de initialisatie van de PIC wordt dan daadwerkelijk bepaald wat de functie van een bepaalde pin is. Een voorbeeld daarvan zie je in de pinaansluitingen van de 16F877A in volgende figuur.
Figuur 6: pinaansluiting van de 16F877A
2.5.4 Speciale functies Een PIC heeft enkele speciale functies aan boord (7). Een groot deel ervan dient ingesteld te worden via het configuratiewoord van de PIC. Een opsomming van mogelijke speciale functies: -
-
oscillator selectie: intern, extern, high speed of RC-kring resetcondities: power-on (POR), brown-out (BOR), oscillator start up timer (OST) en power-up timer (PWRT). De oorzaak van een reset kan ook gedetecteerd worden. meerdere interrupts
Dubrul Stijn
Master Elektronica-ICT
11.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
-
-
watchdog-timer (WDT): controlemechanisme die de PIC kan reseten na een bepaald tijdinterval sleep-mode: de PIC in een energiezuinige toestand brengen Codeprotectie in-circuit serial programming (ICSP): De PIC programmeren terwijl hij nog aanwezig is in de schakeling low-voltage programming (LVP): de PIC programmeren d.m.v. een lage spanning (een eenvoudigere programmer kan gebruikt worden) in-circuit debugger: de PIC kan gedebugged worden in de schakeling.
2.6 Minimale randcomponenten De volgende figuur toont een aantal componenten rondom de PIC die noodzakelijk zijn.
Figuur 7: randcomponenten van een PIC
-
-
-
-
een voeding: Zonder spanning kan een PIC vanzelfsprekend niet werken. De meeste PICs werken op 5V, sommige op 3,3V. Een ontkoppelcondensator is noodzakelijk. een klok: meestal wordt een kristal gebruikt maar een RC-kring is ook mogelijk. Sommige PICs hebben intern een RC-kring aanwezig, deze zijn echter temperatuursafhankelijk reset-circuit: een pull-up weerstand volstaat om de PIC te resetten bij het opkomen van de voedingsspanning. Er kan ook een schakelaar naar massa bijgeplaatst worden. een RJ12-connector die toelaat om de PIC in zijn schakeling te programmeren is ook aangewezen. Deze aansluiting is gestandaardiseerd door Microchip en neemt slechts 5 draden in. Via de /MCLR-pin wordt de programmeerspanning aangebracht. PGD en PGC zijn respectievelijk de data en de klok. De voedingsspanning dient ook aangesloten te worden en kan eventueel geleverd worden door de programmer.
Dubrul Stijn
Master Elektronica-ICT
12.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
2.7 Het programmeerproces Het programmeerproces start bij het kiezen van een programmeertaal. Er kan gekozen worden voor een high-level language zoals: C, BASIC, PASCAL of JAL. Kies je echter voor de assembleertaal sta je een stuk dichter bij de hardware. Assembler wordt dikwijls ook machinecode genoemd. Alle PICs hebben een gereduceerde instructieset (RISC). Concreet varieert het aantal instructies tussen de 35 à 70. In een korte tijdspanne zul je een uitgebreider programma met meer functionaliteit kunnen maken met een hogere programmeertaal. Een assembleerprogramma zal, indien voldoende tijd om het te programmeren, altijd sneller, kleiner in omvang zijn en efficiënter werken. De volgende stap is natuurlijk het programmeren zelf. De datasheet van de PIC met de beschrijving van de hardware en de instructieset zijn onmisbaar in deze stap. Een programma zal nooit in 1 keer van begin tot einde geschreven worden. Het is veeleer een opbouwend proces: een routine of een deel van de code schrijven, controleren, indien nodig wijzigen en implementeren in het geheel. Dit wordt mooi geïllustreerd in de ‘design circle’ van Microchip.
Figuur 8: the Microchip design circle
Vervolgens wordt het programma gecompileerd naar machinecode waarna het gesimuleerd kan worden of geprogrammeerd in de PIC. Het volledige programmeerproces kan plaats vinden in de MPLAB IDE. Deze ‘Integraded Development Enviroment’ bevat zowel: een editor, een assembler, een simulator en heel wat ondersteuning voor debuggers, emulators en programmers. Voor een handleiding omtrent MPLAB verwijs ik naar bijlage 4: Microchip MPLAB IDE user’s guide.
Dubrul Stijn
Master Elektronica-ICT
13.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
De laatste stap is de PIC programmeren. Deze stap wordt ook dikwijls ‘burnen’ genoemd omdat de code als het ware in de PIC gebrand wordt. Hiervoor is een hardware tool nodig die we ook een programmer noemen. Er bestaan heel wat varianten op vlak van programmers en hun mogelijkheden (en kostprijs). Sommige kunnen naast programmen ook debuggen zoals de ICD2 van Microchip die hieronder afgebeeld is. Voor meer informatie omtrent deze programmer verwijs ik naar bijlage 5: MPLAB ICD2 In-Circuit Debugger User’s Guide. Er zijn heel wat lowcost varianten en klonen beschikbaar maar de meeste programmers zijn voorzien om in-circuit te programmeren.
Figuur 9: MPLAB ICD2 programmer
Deze stappen worden mooi weergeven in de volgende figuur. Namelijk het omzetten van een assembler programma naar machinecode, om het vervolgens in de PIC te programmeren. Ik ga in deze scriptie niet in op locatieonafhankelijke code en linkers om het niet nodeloos ingewikkeld te maken. Deze mogelijkheden worden voornamelijk gebruikt bij hogere programmeertalen.
Figuur 10: het programmeerproces
Dubrul Stijn
Master Elektronica-ICT
14.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
2.8 Assembleerprogramma Een programma geschreven in assembler heeft zowat altijd dezelfde opbouw. Daarom gebruiken we een sjabloon om te starten aan een nieuw programma. Het volgende stuk code is de sjabloon die ook gebruikt wordt in de andere programma’s in deze scriptie. Hierin komen voornamelijk ‘directives’ voor en bijna geen instructies. Directives geven instructies door aan de compiler. Op de volgende pagina worden deze wat nader uitgelegd. TITLE PROCESSOR
"template" 16F877A
#include
__CONFIG _HS_OSC & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF ;Disable message: Register in operand not in bank 0 ERRORLEVEL -302 ;RAM-variabelen CBLOCK 0x20 var1 var2 ENDC ;vectors ORG GOTO ORG GOTO
0x0000 init 0x0004 isr
;reset ;isr
;includes subroutines #include <subroutines.inc> ;initialiseren init
;start programma start GOTO
start
;interrupt routine isr RETFIE
;return from interrupt
END Code 1: assembler template
Dubrul Stijn
Master Elektronica-ICT
15.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
1. TITLE De title van het programma. 2. PROCESSOR Deze directive geeft aan welke PIC er gebruikt wordt. 3. #include De include-directive zorgt ervoor dat de code aanwezig in een ander bestand hier ingevoegd wordt. Dit heeft hetzelfde effect al zou deze code echt op deze plaats staan. Op deze manier kunnen ook subroutines uit een ander bestand beschikbaar gesteld worden. 4. __CONFIG Hiermee worden de configuratiebits van de PIC ingesteld. Dit is een combinatie van verschillende instellingen. Onder andere de oscillator wordt hier gekozen. 5. ERRORLEVEL -302 Dit is geen noodzakelijke directive maar heeft als doel om de berichten die de assembler genereert omtrent bankswitching te onderdrukken. Deze berichten zijn geen errors of warnings maar messages. 6. CBLOCK Door middel van CBLOCK kunnen we een naam geven aan bepaalde locaties in het RAM-geheugen. Dit gebruiken we dus om GPRs een naam te geven en gemakkelijk te kunnen gebruiken in ons programma. Dit kan ook verwezenlijkt worden d.m.v. de directive: EQU. 7. commentaar Er kan steeds commentaar in het programma gevoegd worden zolang er maar een puntkomma voor staat. 8. ORG Via ORG kan code op een bepaalde geheugenlocatie geplaatst worden. De code die volgt na deze instructie start dan op dit adres. De locaties die zeker ingevuld moeten worden, zijn de resetvector op aders 0x0000 en de resetvector op locatie 0x0004. 9. label Een label wordt steeds in de eerste kolom geplaatst. Deze labels kunnen dan aangeroepen worden d.m.v. een GOTO of een CALL. Instructies worden steeds in de 2e kolom geplaatst. Operanden hoeven niet in de 3e kolom geplaatst te worden, het zorgt echter voor een grotere leesbaarheid van de code. Labels zijn hoofdlettergevoelig. 10. END Hiermee wordt het einde van het programma aangeduid. Dubrul Stijn
Master Elektronica-ICT
16.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
3 Development bord EasyPIC3 3.1 Beschrijving Mikroelektronica is een officiële ‘third-party’ partner en consultant van Microchip. Deze firma ontwikkelt o.a. low-cost ontwikkelborden en compilers voor verschillende soorten µCs. Het EasyPIC3 ontwikkelbord, zoals hieronder afgebeeld, is een bord met een groot aantal functies die speciaal ontwikkeld is om te werken met de Microchip PIC. Het is ontwikkeld om studenten en ingenieurs te laten oefenen en de mogelijkheden van PICs te bestuderen. Het laat toe om een PIC te interfacen met externe circuits. De gebruiker hoeft zich geen zorgen te maken omtrent deze externe circuits zodat deze zich kan concentreren op de ontwikkeling van de software. Dit bord wordt samen met de PIC16F877A en een kristal van 8 MHz geleverd. Het EasyPIC3 ontwikkelbord van deze firma is aangekocht door het labo elektronica. De kostprijs bedraagt ongeveer € 100 wanneer het aangekocht wordt zonder extra compiler (C, PASCAL of BASIC). Ondertussen is er al een nieuwe versie van dit bord beschikbaar: de EasyPIC4. Dit is een geüpdate versie van dit bord met enkele kleine verschillen: -
de onboard-programmer is nu ook een ICD ondersteuning voor meer PICs (o.a. de 20-pins DIP wordt nu ook ondersteund) kleine aanpassingen aan het bord zelf, voornamelijk instelmogelijkheden
Figuur 11: het EasyPIC3 ontwikkelbord
Dubrul Stijn
Master Elektronica-ICT
17.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
3.2 Mogelijkheden EasyPIC3 Het grote voordeel van dit ontwikkelbord (of van eender welk ontwikkelbord) is dat de volledige tijd gespendeerd kan worden aan het ontwikkelen van software. De volgende voorzieningen zijn getroffen qua hardware. De mogelijkheden die met een asterisk (*) aangeduid zijn, worden niet bestudeerd in deze thesis. -
on-board USB 2.0 programmer volgens het ICSP-principe ondersteuning voor PICs met volgende behuizingen: DIP8, 14, 18, 28 en 40 spanning kan via de USB-poort geleverd worden of via een externe AC of DC-voeding het kristal kan verwisseld worden 2 potentiometers voor A/D-conversie LEDs op alle PORT-pinnen schakelaars op alle PORT-pinnen alle PORT-pinnen kunnen ook extern benaderd worden 4 gemultiplexte 7-segment displays LCD-connector, aansturen d.m.v. 4 of 8-bits met regelbaar contrast RS232-communicatie (TX en RX) 1-wire temperatuurssensor DS1820(*) GLCD (grafische LCD)(*) USB-connector(*) PS/2-connector voor een toetsenbord(*)
Er zijn ook een aantal jumpers en DIP-switches aanwezig waarmee het volgende ingesteld kan worden: JP1 JP2,3 JP4 JP5 JP6 JP7,8,9 JP10 JP11 JP12 SW1 SW2
voeding via USB of extern JP13 pull-up/down PORTA & E selectie DIP-socket JP14 temperatuursensor: RA5 of RE2 selectie van PGM-lijn JP15 A/D-lijn aan RA2 RX: RB1, RB2 of RC7 JP16 A/D-lijn aan RA3 TX: RB2,RB5 of RC6 JP17 contrast LCD of GLCD USB aan/uit JP18 klokselectie voor DIP8 en DIP14 (omezijde) pull-up/down PORTB JP19 pull-up/down PORTC drukknoppen: actief hoog of JP20 actief laag pull-up/down PORTD pull-up/down weerstanden van PORTA en POR E aan of uit PORT LED’s aan of uit + display selectielijnen aan of uit Tabel 2: jumper en dipswitch-instellingen op de EasyPIC3
De on-board programmer is een USB-apparaat en moet geïnstalleerd worden. De drivers hiervoor zijn aanwezig op de meegeleverde CD, maar kunnen ook gedownload worden op de website van MikroElektronica, www.mikroe.com.
Dubrul Stijn
Master Elektronica-ICT
18.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Eenmaal het bord aangesloten is, kan er gecontroleerd worden of de correcte drivers gebruikt worden in het Windows apparaatbeheer. Onderstaande figuur toont dit. Indien dit niet het geval is, zal er een ‘onbekend apparaat’ gedetecteerd worden.
Figuur 12: EasyPIC3-driver in het Windows apparaatbeheer
Naast een driver is er ook nog een software nodig om het gecompileerde programma naar de PIC te sturen, via de on-board programmer. Een screenshot van het programma is hieronder opgenomen. Deze software noemt ‘PIC flash 2 programmer’ en is jammer genoeg niet rechtstreeks toegankelijk vanuit MPLAB. Het hexbestand moet geopend worden en dan wordt via ‘write’ het programmeren gestart. Wanneer er opnieuw gecompileerd is geweest in MPLAB kan via ‘file>reload’ de nieuwe versie opgehaald worden. Een andere mogelijkheid om via 1 toets te programmeren is een nieuwe snelkoppeling aan te maken met wat extra parameters. Volgende regel opent de software, leest de file “C:\PIC\test.hex” in en programmeert deze direct naar de PIC. "C:\...\PICFLASH2\PICFLASH2.exe" -w -f"c:\pic\test.hex"
Figuur 13: PICflash 2 programmer Dubrul Stijn
Master Elektronica-ICT
19.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Hieronder is het elektrisch schema van de on-board programmer opgenomen met zijn verbindingen naar het 40-pins socket. Zoals te verwachten loopt de PGD, de PGC en de /MCLR-lijn naar de PIC. Lowvoltage programmeren is ook mogelijk door de PGM-lijn. Opmerkelijk is echter dat de reset niet rechtstreeks aan de PIC aangesloten is maar via de programmer verbonden is. Dit is een industriële schakeling nooit het geval omdat de programmer niet aanwezig is op de print.
Figuur 14: elektrisch schema van de onboard programmer
Dubrul Stijn
Master Elektronica-ICT
20.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
3.3 Mogelijkheden 16F877A De 16F877A, die gebruikt wordt als kern in de hierop volgende programma’s, is een uitgebreide PIC met veel mogelijkheden. Het is een handige PIC om mee te starten door het grote aantal I/O-pinnen en de grote hoeveelheid inwendig geheugen. Deze PIC voorziet dus veel vrijheid. Hieronder worden de belangrijkste mogelijkheden opgesomd. algemeen device PIC16F877A package 40-pin DIP max. klokfrequentie 20 MHz (200 ns instuctie cycle) werkingsspanning 2 -5,5 V instructieset 35 instructies geheugen programmageheugen 8kb x 14-bits (8192 instructies) datageheugen (SRAM) 368 x 8 bytes EEPROM 256 x 8 bytes modules interrupt-bronnen 15 I/O-ports A,B,C,D,E = 33 pinnen timers 3 capture/compare/PWM 2 seriële communicatie MSSP & USART parallele communicatie 1 PSP A/D-module 10-bits, 8 kanaalen speciale functies ICSP & ICD-compatible ja reset-condities & timers POR, BOR, PWRT & OST watchdog timer WDT ja code protectie ja low-power sleep ja Tabel 3: mogelijkheden van de PIC16F877A
De geheugenmap van deze PIC kan teruggevonden worden in punt 2.5.2. Gedetailleerde informatie is terug te vinden in de datasheet die een 200-tal pagina’s dik is en opgenomen is in bijlage 6. Een afbeelding van deze 40-pins controller is hieronder opgenomen (niet op ware grote).
Figuur 15: de PIC16F877A
Dubrul Stijn
Master Elektronica-ICT
21.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4 Software EasyPIC3 4.1 Gevolgde strategie Om een bepaald probleem op te lossen heb je als eerste de datasheet van de PIC nodig waar alle informatie omtrent een bepaalde module terug te vinden is. Het schema van de EasyPIC3 is ook onmisbaar om te weten hoe alle elektrische verbindingen lopen, m.a.w. hoe alles precies aangesloten is aan de PIC. Voorbeelden van bepaalde routines zijn ook te vinden op internet. Op het forum van Microchip, http://forum.microchip.com en de codedatabase van Piclist, http://www.piclist.com is heel wat informatie terug te vinden. De overkoepelende datasheet van de mid-range architectuur van Microchip bevat ook heel wat gedetailleerde informatie. Deze datasheet is opgenomen in bijlage 7. De volgende programma’s zijn allemaal onafhankelijke problemen en staan dus ook los van elkaar. Soms kan er echter gebruik gemaakt worden van een vorige programma om bepaalde output te visualiseren. Dit zal meestal gedaan worden door gebruik te maken van RS232output. Concreet wordt er per onderdeel aangegeven wat precies het doel is. De programmacode wordt steeds uitgelegd en waar nodig aangevuld met elektrische schema’s en flowcharts. Er is gekozen om steeds met subroutines te werken en deze in aparte bestanden op te nemen, dit verhoogt de porteerbaarheid naar andere programma’s. Alle programma’s maken echter gebruik van het bestand registers.inc. In dit include bestand zijn alle GPR-registers (RAM-variabelen) opgenomen die gebruikt worden door de subroutines. Dit bestand voorzag dus de porteerbaarheid van routines binnen dit eindwerk. De broncode (asm) en de gecompileerde bestanden (hex) van de uitgewerkte programma’s zijn steeds terug te vinden op de CD, in de map EasyPIC3, die bij dit eindwerk is bijgevoegd. Een overzicht van alle programma’s en subroutines die gemaakt zijn is opgenomen in bijlage 8.
Dubrul Stijn
Master Elektronica-ICT
22.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.2 Digitale I/O 4.2.1 Doel -
digitale I/O instellen om knoppen in te lezen en LEDs te sturen enkele wachtroutines maken om bijvoorbeeld een knipperlicht aan te sturen de 4 gemultiplexte 7-segment displays aansturen een eerste programma met interrupt maken
4.2.2 Instellen en lezen/schrijven van een pin De 16F877A heeft 5 poorten met in totaal 33 pinnen die elk afzonderlijk als input of als output ingesteld kunnen worden, indien deze pinnen niet voor een andere functie gebruikt worden. Alle pinnen bevinden zich tijdens het opstarten van de PIC in de hoog impedantie mode en zijn dus als input geschakeld. Uitzondering hierop is PORTA en PORTE: deze pinnen zijn tijdens het opstarten als analoge inputs geschakeld en moeten nog ingesteld worden als digitale I/O via het ADCON1-register. Een pin wordt als in- of output ingesteld door zijn corresponderende TRIS bit te setten (input=1) of te clearen (output=0). Het lezen of schrijven van een pin gebeurt via zijn PORT-register. Wanneer een PORT ingesteld wordt als output is zijn corresponderende uitgangswaarde steeds 0 (laag) bij initialisatie. Je kan geen waarde op voorhand opgeven doordat deze pinnen als input staan. Het stukje voorbeeldcode hieronder stelt de pinnen van PORTA in als input en de pinnen van PORTB in als output. De waarde van PORTA wordt steeds gelezen en op PORTB geplaatst. InitPortA BANKSEL MOVLW MOVWF BANKSEL MOVLW MOVWF InitPortB CLRF
ADCON1 0x06 ADCON1
;PORTA en PORTE ;instellen als ;digitale I/O
TRISA 0xFF TRISA
;PORTA = input
TRISB
;PORTB = output
Copy BANKSEL MOVFW MOVWF GOTO
Dubrul Stijn
PORTA PORTA ;PORTA waardes kopiëren naar W PORTB ;W kopiëren naar PORTB Copy ;loop naar Copy Code 2: instellen van digitale poorten
Master Elektronica-ICT
23.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.2.3 Wachtroutines Wachtroutines zijn noodzakelijk om de PIC even bezig te houden tussen een paar instructies in. Wanneer je bijvoorbeeld een LED wilt laten knipperen dient er gewacht te worden tussen het aan- en afleggen en tussen het af- en aanleggen van de LED zodat deze een bepaalde tijd opgelicht en een bepaalde tijd niet opgelicht blijft. Wachten doen we door de PIC instructies te laten uitvoeren. De precieze uitvoeringstijd van een instructie (1 instruction cycle) is gekend zodat we kunnen berekenen hoeveel instructies er gewacht moet worden om een tijdsperiode te overbruggen. Bijna alle instructies duren 1 instruction cyle, branches nemen er steeds 2 in. Merk op dat de tijd die een instructie inneemt rechtstreeks afhankelijk is van de snelheid van het de gebruikte klokfrequentie zoals te zien in onderstaande formule. Tinst = 4 ⋅
1 1 = 4⋅ = 4 ⋅ 125ns = 500ns klokfrequentie 8MHz
Formule 1: de tijdsduur van een instruction cycle
Wachtroutines zijn steeds opgebouwd rond één of meerdere DECFSZinstructies. Door een register te laden met een waarde kunnen we het programma steeds laten aftellen tot dit register op 0 komt te staan. Pas dan wordt verder gegaan met de rest van het programma. Hieronder is de flowchart en routine opgenomen om 250µs (500 instruction cycles) te wachten met het kristal van 8 MHz. De DECFSZ-instructie is aangeduid d.m.v. een stippellijn. delay250us
MOVLW MOVWF
;1x2IC ;(CALL) D'163' d1
;1x1IC ;1x1IC
delay250us_loop
DECFSZ
d1,1
;166x1C ;(165->0)
GOTO
delay250us_loop
;1x2IC
RETURN Figuur 16: flowchart wachtroutine
Dubrul Stijn
;1x2IC
Code 3: wachtroutine van 250µs
Master Elektronica-ICT
24.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
We werken op dezelfde manier verder om langer te wachten. We gebruiken een 2e register samen met een DECFZ om deze wachtroutine een aantal keren te laten uitvoeren. In het bestand delay.inc zijn er wachtroutines uitgewerkt voor 250 µs, 1 ms, 10 ms, 50 ms en 1 sec. Onderstaand voorbeeldcode knipper.asm laat een LED knipperen aan een snelheid van ½ Hz (periode van 2 sec) door gebruik te maken van een wachtroutine. Init CLRF
INTCON
;geen interrupts
InitPortB BANKSEL CLRF
TRISB TRISB
;PORTA = output
BANKSEL CLRF
PORTB PORTB
;PORTB=O
BANKSEL BSF CALL BCF CALL GOTO
PORTB PORTB,0 delay1s PORTB,0 delay1s start
start ;LED aan ;wacht 1sec ;LED uit ;wacht 1sec Code 4: knipperlicht
Opmerking: een wachtroutine houdt geen enkele rekening met eventuele interrupts die kunnen optreden. Bij het gebruik van geneste wachtroutines zal er ook altijd wel ergens wat tijd verloren gaan door CALLs of andere branches. Bij tijdskritische toepassingen zullen we dan ook eerder kiezen om met timer-modules te werken.
Dubrul Stijn
Master Elektronica-ICT
25.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.2.4 De 7-segment displays Op het oefenbord zijn 4 gemultiplexte 7-segment displays aanwezig. Ze kunnen elk afzonderlijk geselecteerd worden door middel van PORTA[0:3]. De segmenten zelf zijn verbonden met de volledige PORTB zoals te zien op onderstaand schema.
Figuur 17: aansluitingen van de 7-segment displays
Het aansturen van de displays is op zich niet moeilijk. We moeten echter een stuk code voorzien die een binaire waarde omvormt naar de respectievelijke 7-segmentscode. We doen dit via een computed goto (ADDWF PCL), ook wel een lookup-table genoemd. Het doel is om de program counter (PC) te manipuleren. Door middel van een offset (hier de binaire waarde die we willen weergeven) springen we naar de juiste regel in een tabel (hier de respectievelijke 7-segmentscode). We moeten echter oppassen met paging. Wanneer we een offset bij PCL tellen passen we maar de laagste 8-bits van de volledige PC aan (die 13-bits breed is). Het PCH-register moet dus vooreerst aangepast worden, zij het dan indirect via het PCLATH-register omdat het PCH register niet gemapped is. De volgende figuur geeft grafisch weer wat er precies gebeurd bij een computed goto. Merk op dat deze pagingproblemen zick ook kunnen voordoen bij een CALL of een GOTO.
Dubrul Stijn
Master Elektronica-ICT
26.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 18: adresbepaling bij een computed goto
Dit probleem duikt dus enkel op wanneer onze tabel zich bevindt op de grens van een 256-bytes blok programmageheugen (PCL is 8-bits breed). Hieronder is de flowchart en de programmacode van de lookuptable voor het omvormen van binair naar 7-segment opgenomen. Deze routine is terug te vinden in het bestand segment.inc. bin2seg MOVLW MOVWF
high segment PCLATH
;msb
MOVLW ADDWF
low segment index,w
;lsb ;offset
BTFSC INCF
STATUS,C PCLATH,f
;overflow? ;ja: PCLATH++
MOVWF
PCL
;spring
0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7C 0x07 0x7F 0x67 0x77 0x7C 0x58 0x5E 0x79 0x71
;nul ;een ;twee ;drie ;vier ;vijf ;zes ;zeven ;acht ;negen ;A ;B ;C ;D ;E ;F
segment RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
Figuur 19: flowchart computed goto
Dubrul Stijn
Code 5: computed goto routine bin2seg
Master Elektronica-ICT
27.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Er is een voorbeeldprogramma 7segment.asm die de 4 displays aanstuurt met een vaste waarde. Dit programma stelt eerst de nodige poorten in als output waarna het 4 binaire waardes in het RAM laadt. Om beurten wordt een display geselecteerd. Om data op het display te tonen wordt eerst de binaire code omgevormd naar 7-segmentscode en deze wordt op PORTB geplaatst. Het display wordt geselecteerd en er wordt even gewacht. Het display wordt terug uitgeschakeld om zo over te gaan naar het volgende display. De volgende flowchart toont de werking van het programma. Een meer dynamisch programma dat de displays aanstuurt is opgenomen bij de timers.
START
stuur display
PORTA[0:3] (selectie) en PORTB[0:7] (7-segmentcode) = output
W = offset index
4 binaire waardes (0-15) naar RAM (var0:var3)
bin2seg
PORTB = W (7 segmentcode)
display0
selecteer display (bit PORTA[0:3])
display1
delay display2
leg display af display3
volgend display
Figuur 20: flowchart 7-segment sturing
Dubrul Stijn
Master Elektronica-ICT
28.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.2.5 Externe interrupt op pin RB0 De eerste pin van PORTB is voorzien als externe interrupt. Deze interrupt reageert op een stijgende of dalende flank. Ideaal dus om te experimenteren met interrupts. Bij elke interrupt zijn er minimum 3 bits van belang: -
-
GIE ofwel Global Interrupt Enable: met deze bit kun je alle (geselecteerde) interrupts doorlaten of tegenhouden. Deze bit zal gereset worden tijdens de initialisatie van de PIC. In een interruptroutine wordt deze vanzelf gereset om te verhinderen dat er een nieuwe interrupt komt. Deze bit zal geset zijn tijdens de normale werking van het programma. de specifieke interrupt enable bit: deze bit zal een individuele interrupt doorlaten of tegenhouden de interrupt flag: deze bit zal hoog worden wanneer een bepaalde interrupt zich voordoet. Deze vlag moet meestal zelf gereset worden op het einde van de interrupt service routine (ISR).
Wanneer deze 3 bits hoog zijn wordt er automatisch naar de ISR gesprongen. Het adres van deze routine dient ingevuld te worden bij de interrupt-vector op adres 0x0004 d.m.v. een GOTO. De routine kan eventueel direct hier geplaatst worden. Deze routine staat los van het hoofdprogramma maar kan eventueel wel dezelfde registers gebruiken (registers zoals W en STATUS). Het is daarom gebruikelijk dat deze registers opgeslagen worden in het RAMgeheugen aan het begint van de ISR (PUSH). Op het einde worden ze dan terug geplaatst (POP of PULL). Indien er meerder interrupts kunnen optreden dient ook bepaald te worden wat de bron van de interrupt is d.m.v. de interruptvlaggen (er is maar 1 ISR aanwezig) pas dan kan de eigenlijke verwerking beginnen van de interrupt. Een ISR wordt ook altijd zo kort mogelijk gehouden zodat het hoofdprogramma niet te lang hoeft te wachten. De flowchart hiernaast geeft een algemeen beeld van een ISR. Figuur 21: flowchart van een ISR
Dubrul Stijn
Master Elektronica-ICT
29.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Het volgende programma INT.asm stelt INT/RB0 interrupt in op een stijgende flank. De ISR is uitgewerkt met alle stappen zoals hierboven omschreven. De PUSH en POP zijn puur illustratief omdat er hier niets uitgevoerd wordt in het hoofdprogramma. Er wordt binair geteld op PORTC om aan te tonen hoeveel maar de interrupt zich voorgedaan heeft. TITLE "demo INT/RB0" PROCESSOR 16F877A #include #include __CONFIG _HS_OSC & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF ERRORLEVEL -302 ;Register in operand not in bank 0 ORG GOTO ORG GOTO
0x0000 Init 0x0004 Isr
;reset vector ;interrupt vector
Init CLRF InitPORTC BANKSEL CLRF BANKSEL CLRF InitINT BANKSEL MOVLW MOVWF BANKSEL BSF
INTCON
;disable interrupts
TRISB 0x01 TRISB ;RB0/INT input OPTION_REG OPTION_REG,INTEDG ;INT stijgende flank
EnableINT BCF BSF BSF
INTCON,INTF INTCON,INTE INTCON,GIE
TRISC TRISC PORTC PORTC
loop
;PORTC=output ;PORTC=0x00
;INT vlag clearen ;enable INT ;enable interrupts ;oneindige lus
GOTO
loop
;interrupt service routine Isr IsrPush MOVWF SavedW ;opslaan W MOVFW STATUS MOVWF SavedSTATUS ;opslaan STATUS IsrINT BANKSEL PORTC INCF PORTC ;tellen op PORTC BCF INTCON,INTF ;clear flag IsrPop MOVFW SavedSTATUS ;restore STATUS MOVWF STATUS MOVFW SavedW ;restore W RETFIE END Code 6: interrupt-programma INT/RB0 Dubrul Stijn
Master Elektronica-ICT
30.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.4 LCD 4.4.1 Doel -
LCD initialiseren d.m.v. een 4 of 8-bits databus Tekst op de LCD plaatsen
4.4.2 Werking Een LCD heeft steeds een controle-IC aan boord die het display stuurt. In dit geval is dit de LCM1602A. De datasheet van dit component is opgenomen in bijlage 9. Deze IC is dan op zijn beurt verbonden met de PIC. We kunnen zowel data als instructies naar deze IC sturen. Voorbeelden van instructies zijn: wis scherm, ga naar volgende regel, plaats de cursor op een locatie, leg scherm af en toon cursor. De IC weet via de RS-lijn of we een instructie (0) of data (1) sturen. Via een puls op de enable-lijn weet de IC dat de instructie of data geldig is. Het uitvoeren van een instructie of het plaatsen van data duurt enig tijd dus moet er steeds wat gewacht worden. De LCD moet vooraf geïnitialiseerd worden. Dit bestaat uit een opeenvolging van instructies die onder meer de controle-IC vertellen met hoeveel bits we werken en hoeveel lijnen er aanwezig zijn op het display. Sommige instructie vragen meer tijd dus moet er langer gewacht worden (1 ms is ruim voldoende). Er zijn naast de 3 controlelijnen ook 8 datalijnen beschikbaar. Op deze lijnen komen de instructies of de data terecht. Ofwel worden er instructies op deze lijnen geplaatst ofwel data. De data die we sturen zullen karakters zijn die we op het scherm wensen te plaatsen. De ASCII-tabel is grotendeels toepasbaar. Om I/O-lijnen uit te sparen kan er ook gewerkt worden met een 4-bits databus. De 4 hoogste bits van de databus worden in dit geval gebruikt. De instructieset ziet er net iets anders uit in dit geval. Data versturen verloopt in 2 stappen: eerst de meest significante nibble en daarna de minst significante nibble. Er is nog 1 verbinding aanwezig waarmee het contrast geregeld kan worden via een potentiometer.
Dubrul Stijn
Master Elektronica-ICT
31.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.4.3 Routines Hieronder zijn de flowcharts van de routines om een instructie te plaatsen en een karakter te versturen opgenomen. Ze zijn juist hetzelfde opgebouwd alleen wordt in het ene geval een instructie verstuurd en in het andere geval een karakter. De toestand van de RSlijn bepaalt of het om een instructie of om data gaat. Ernaast is de routine om een LCD te initialiseren opgenomen. Deze routines zijn terug te vinden in het bestand LCD8.inc voor een 8bits databus en in het bestand LCD4.inc voor een 4-bits databus. Het versturen van een karakter gebeurd in 2 stappen bij een 4-bits databus.
Figuur 22: flowchart instructie naar LCD
Figuur 23: flowchart data naar LCD
Figuur 24: flowchart initialiseren LCD
Er is in beide bestanden nog een extra routine opgenomen om een zin op het scherm te plaatsen via een lookup-table.
Dubrul Stijn
Master Elektronica-ICT
32.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.4.4 Voorbeeldprogramma’s De 2 voorbeeldprogramma’s LCD4.asm en LCD8.asm plaatsen tekst op beide lijnen van de LCD. Eerst wordt er geïnitialiseerd waarna gebruik gemaakt wordt van de subroutines om een zin te plaatsen op de eerste lijn. Via een instructie wordt er naar de 2e lijn gesprongen en wordt er nog een zin geplaatst. De uitvoer is zoals op onderstaande figuur. De aansluitingen van de 2 verschillende modes is ook opgenomen.
Figuur 25: tekst op het scherm van de LCD
Figuur 26: elektrisch schema LCD met 8-bits databus
Figuur 27: elektrisch schema LCD met 4-bits databus Dubrul Stijn
Master Elektronica-ICT
33.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.5 RS232 4.5.1 Doel -
RS232-communicatie initialiseren voor zowel lezen als versturen subroutines maken voor zowel lezen als versturen een eenvoudige loopback-toepassing een subroutine maken die een volledige zin kan versturen
4.5.2 De module De USART-module is 1 van de 2 seriële modules die aanwezig zijn in de PIC. Ze kan zowel synchroon als asynchroon ingesteld worden. Hier is het de bedoeling van RS232-communicatie op te zetten. Er wordt met andere woorden asynchroon gewerkt. Doordat RS232 niet met de standaard TTL-niveaus werkt is er op de EasyPIC3 een MAX232 voorzien. JP5 en JP6 dienen op de juiste TX en RX-lijn geplugd te worden (RC6 en RC7) zodat er connectie is me de PIC. Het schema ziet er als volgt uit. Merk op dat de TX en RX-lijn op het bord reeds gekruist zijn.
Figuur 28: Elektrisch schema RS-232
De initialisatie van de module start met het bepalen van de gewenste baudrate. Het 8-bits register SPBRG en de bit TXSTA,BRGH bepalen de snelheid van communiceren en zijn zoals altijd in functie van de kloksnelheid. De formules staan hieronder. De keuze of we BRGH hoog of laag nemen is in functie van de fout die gemaakt wordt. We proberen deze natuurlijk zo laag mogelijk te nemen. Fosc 64(SPBRG + 1) Fosc baudrate(BRGH = 1) = 16(SPBRG + 1)
baudrate(BRGH = 0) =
Formule 2: het berekenen van de baudrate bij seriële communicatie Dubrul Stijn
Master Elektronica-ICT
34.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
De rest van de initialisatie gebeurt voornamelijk via 2 registers: TXSTA en RXSTA. Vooraleerst dient de directie van de TX en RX-pin ingesteld te worden via het TRISC-register. Eenmaal de baudrate ingesteld is wordt er geselecteerd in welke mode we werken (asynchroon). De seriële poort moet ingeschakeld worden alsook de transmit en de receive. Op het einde van de initialisatie legen we de ontvangstbuffer een aantal maal zodat er geen verkeerde data aanwezig kan zijn. Er zijn nog een aantal opties beschikbaar zoals 9-bits zenden en ontvangen. Dit kan bijvoorbeeld gebruikt worden om een pariteitsbit te genereren. Dit moet echter zelf geprogrammeerd worden. De onderstaande flowchart en programmacode toont de initialisatieroutine. Merk op dat de interrupts niet ingesteld worden in deze routine. Deze en de hier opvolgende routines zijn opgenomen in RS232.inc. initaliseren RS232
RS232init BANKSEL BCF BSF
PORTC PORTC,TX PORTC,RX
baudrate instellen
BANKSEL BSF MOVLW BANKSEL MOVWF
TXSTA TXSTA,BRGH d'51' SPBRG SPBRG
asynchrone mode selecteren
BANKSEL BCF
TXSTA TXSTA,SYNC
;asynchrone mode
BANKSEL BSF
RCSTA RCSTA,SPEN
;serialport enable
BANKSEL BSF
TXSTA TXSTA,TXEN
;transmit enable
BANKSEL BSF
RCSTA RCSTA,CREN
;receive enable
MOVFW MOVFW MOVFW
RCSTA RCSTA RCSTA
;flush ;flush ;flush
pinnen instellen TX = output RX = input
enable seriële poort
TX en RX activeren
RX-buffer leegmaken (flush)
;brgh=1 ;9600baud
RETURN
EINDE
Figuur 29: flowchart initialiseren RS-232
Dubrul Stijn
;TX=output ;RX=input
Code 7: initialiseren van RS-232
Master Elektronica-ICT
35.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.5.3 Lezen en versturen Voor zowel lezen als ontvangen kan er op 2 manieren gewerkt worden: polling of interrupt. Wordt er met interrupt gewerkt dan moet vanzelfsprekend de GIE-bit geset zijn maar ook de PEIE-bit. Voor seriële communicatie is dit RCIE en TXIE uit het PIE1-register. De vlaggen uit het PIR1 register zijn respectievelijk RCIF en TXIF. De RCIF wordt gereset na het uitlezen van de inputbuffer, de TXIF wordt vanzelf hoog wanneer de zendbuffer leeg is. Wil je met polling werken dan is er voor het zendgedeelte een bit beschikbaar TXST,TRMT die hoog wordt wanneer de zendbuffer leeg is. Voor het ontvangen is er enkel de interrupt-vlag. Er is geen ander bit aanwezig omdat het ook niet interessant is om het hoofdprogramma te laten wachten op een karakter die ontvangen is (het kan echter wel via deze vlag mocht dit toch nodig zijn). Uit het voorgaande kan dus afgeleid worden dat het ontvangen via een interrupt het interessants is en het versturen via het hoofdprogramma, zonder interrupt. Wil je namelijk het versturen ook via interrupt laten lopen dan zal er op zijn minst een buffer in het RAM-geheugen voorzien moeten worden waar het te versturen karakter klaar staat. De volgende 2 flowcharts en codes tonen hoe we een karakter ontvangen en versturen zonder interrupts.
RS232get
BANKSEL BTFSS GOTO
PIR1 PIR1,RCIF RS232get
;char ontvangen?
BANKSEL MOVFW
RCREG RCREG
;ontvangen char ;char naar W
RETURN Figuur 30: flowchart ontvangen van een char
Dubrul Stijn
Code 8: ontvangen van een char
Master Elektronica-ICT
36.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
RS232send
BANKSEL BTFSS GOTO
TXSTA TXSTA,TRMT RS232send
BANKSEL MOVWF
TXREG TXREG
NOP
;buffer leeg? ;nee: loop
;verstuur char
;even wachten
RETURN Figuur 31: flowchart versturen van een char
Code 9: versturen van een char
4.5.4 Voorbeeldprogramma In het volgende voorbeeldprogramma loopback.asm lezen we een char in via de ISR. Deze wordt dan terug verstuurd via de subroutine RS232send. Er is hier dus geen hoofdprogramma, enkel een ISR. Dit is zowat de eenvoudigste testmethode voor seriële communicatie. Je drukt op een toets in een terminal, deze wordt ontvangen door de PIC en terug verstuurd. Een soort van echo dus. ORG GOTO ORG
0x0000 init 0x0004
BANKSEL MOVFW CALL RETFIE
RCREG RCREG RS232send
;vectors
isr ;inlezen char cleart RCIF vlag! ;versturen char
#include
;includes subroutines
CLRF BANKSEL CLRF CLRF CALL BANKSEL BSF BSF BSF
INTCON PIE1 PIE1 PIE2 RS232init PIE1 PIE1,RCIE INTCON,PEIE INTCON,GIE
;geen interrupts
;RS232 initialiseren
GOTO
start
;oneindige loop
init
;enable int RX ;peripheral int enable ;enable global int
start
END Code 10: voorbeeldprogramma loopback RS232 Dubrul Stijn
Master Elektronica-ICT
37.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.5.5 Een volledige zin versturen via een macro Omdat het meestal wel wenselijk is van een volledige zin te versturen via RS232 i.p.v. karakter per karakter zou het wel handig zijn om daarvoor een routine te schrijven. Dit is mogelijk via een macro. Macro’s zijn sequenties van instructies die ingevoegd kunnen worden in het assembleerprogramma door een macro oproep. Macro’s hebben enkele voordelen t.o.v. normale subroutines. Eén van de grote voordelen is dat je argumenten kunt opgeven. Een macro dient vooraf gedefinieerd te worden en je kan ze oproepen in je programma. Ze worden dan door de compiler omgevormd naar de gewone assembleertaal. We gebruiken voor dit probleem een macro omdat we als argument een string willen opgeven. Via een lookup-table wordt de string dan karakter per karakter overlopen om verstuurd te worden. Er wordt teven een CR en een LF (een nieuwe lijn) verstuurd. Als laatste karakter staat een ETX (end of text). Met dit niet afdrukbaar ASCIIkarakter duiden we het einde van de string aan. Hieronder is de macro opgenomen. De code is zoveel als mogelijk uitgelegd. De werking van de lookup-table kan teruggevonden worden in hoofdstuk 4.2.4. RS232string local local local local
MACRO string loop getchar tekst einde
BANKSEL CLRF
index index
;string is het argument ;labels worden local gedefineerd
;positie reset: variabele aanwezig in ram
loop CALL getchar ;char ophalen CALL RS232char ;versturen: routine aanwezig in rs232.inc NOP ;even wachten SUBLW ETX ;ASCII einde tekst BTFSC STATUS,Z ;einde string? GOTO einde ;ja INCF index,f ;nee:volgende char GOTO loop getchar MOVLW high tekst ;hoogste adresbits MOVWF PCLATH MOVLW low tekst ;laagste adresbits ADDWF index,w ;add offset index BTFSC STATUS,C ;overflow? (page cross?) INCF PCLATH,f ;ja: PCLATH++ MOVWF PCL tekst DT string,CR,LF,ETX einde ENDM Code 11: macro om een string te versturen via RS232
Deze macro wordt in het programma simpelweg aangeroepen op volgende manier (zonder CALL!). RS232string
Dubrul Stijn
“dit is mijn string die ik wil versturen”
Master Elektronica-ICT
38.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.6 A/D-conversie 4.6.1 Doel -
de werking van de ADC-module bestuderen een analoog signaal omzetten naar 10 digitale bits aan een vaste samplefrequentie A/D via interrupt: een looplicht in snelheid regelen a.d.h.v. een potentiometer
4.6.2 Werking De 16F877A beschikt over 8 analoge ingangen (PORTA en PORTE) die via 1 A/D-module geconverteerd kunnen worden naar 10 digitale bits. 2 van deze pinnen kunnen eventueel gebruikt worden als Vref+ en Vref-. Het resultaat van de conversie wordt opgeslagen in 2 registers ADRESH en ADRESL. Het resultaat kan links of rechts uitgelijnd worden. Belangrijk is dat de tijd per bitconversie (Tad) gerespecteerd wordt. Dit moet minimum 1,6 µs zijn. De totale conversietijd (Tcy) duurt 12 Tadperioden. Indien er een langere sampleperiode gewenst is, moet er zelf een voorziening getroffen worden om langer te wachten. Er kan gekozen worden voor een interne RC-klok (Tad ≅ 4µs) of uit een aantal vaste perioden van de klokfrequentie. Volgende berekening toont hoe de tijd per bitconversie en de totale conversietijd berekend wordt indien er gekozen wordt voor een aantal klokperioden. De flowchart toont hoe we nu precies te werk gaan tijdens het programmeren om 1 kanaal te converteren. Merk op dat er na de bewerkingen een stuk vroeger kan teruggegaan worden in de flowchart om bijvoorbeeld een ander kanaal of conversiesnelheid te kiezen. Vanzelfsprekend kan er ook met interrupts gewerkt worden om te weten wanneer een conversie klaar is. Tosc =
n=
1 1 = = 125ns klokfrequentie 8MHz
min.bittijd 1,6µs = = 12,8 → 16 Tosc 125ns
Tcy = 12 ⋅ n ⋅ Tosc = 12 ⋅ 16 ⋅ 125ns = 24µs Formule 3: bittijd en conversietijd van de ADC
Dubrul Stijn
Master Elektronica-ICT
39.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 32: flowchart A/D-conversie
4.6.3 Voorbeeldprogramma In het voorbeeldprogramma gaan we te werk zoals in de flowchart voorgesteld. We zullen gebruik maken van de interne RC-klok om de A/D-module te sturen. Na elke conversie zullen we het resultaat weergeven op PORTC (hoogste 2 bits) en PORTD (laagste 8 bits). Als input-kanaal gebruiken we AN2/RA2 en als referentie de voedingsspanningen. JP15 dient aanwezig te zijn en de pull-up van dit kanaal dient losgemaakt te worden (SW1). Het elektrisch schema is op de volgende pagina opgenomen.
Dubrul Stijn
Master Elektronica-ICT
40.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Code 12: schema A/D met uitvoer via LED's
Bij de start van een conversie wordt B0 hoog geplaatst. Wanneer de data beschikbaar is op PORTC en PORTD wordt deze terug laag geplaatst. Door deze periode te meten met een oscilloscoop kan er exact achterhaald worden wanneer de gedigitaliseerde data beschikbaar is. De wachtlus vooraf kan dus aangepast worden om tot een exacte sampletijd te komen. In dit programma duurde het zonder wachtlus 47 µs voordat de data klaarstond. Er is 3 maal een wachtlus van 250 µs en 1 maal een wachtlus van 203 µs zodat we een sampleperiode van 1 ms bekomen. Er wordt in dit programma niet met interrupt gewerkt zodat deze periode constant blijft. De initialisatieroutine en het hoofdprogramma van ADC.asm zijn opgenomen. ;initialiseren Init CLRF InitPortsBCD BANKSEL CLRF CLRF CLRF BANKSEL CLRF CLRF CLRF InitADC MOVLW BANKSEL MOVWF
Dubrul Stijn
INTCON TRISB TRISB TRISC TRISD PORTB PORTB PORTC PORTD
0xFF TRISA TRISA
;disable interrupts
;portb=output ;portc=output ;portd=output ;portb=0 ;portc=0 ;portd=0
;PORTA=input
Master Elektronica-ICT
41.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
MOVLW BANKSEL MOVWF MOVLW BANKSEL MOVWF
B'11000000' ;rechts uitlijnen,RC-klok,all ADC inputs ADCON1 ADCON1 B'11010001' ;RC-klok,selecteer AN2/RA2,ADC-module aan ADCON0 ADCON0
;start programma WachtADC BSF CALL CALL CALL MOVLW MOVWF Delay203us DECFSZ GOTO StartADC BANKSEL BSF WachtKlaar BTFSC GOTO BCF
PORTB,0
;ready indicator hoog
delay250us delay250us delay250us
;wacht 3*250us = 750us
0x90 d1 ;wacht 203us d1 Delay203us
ADCON0 ADCON0,GO_DONE ADCON0,GO_DONE WachtKlaar PORTB,0
;start conversie ;klaar?
BANKSEL MOVFW MOVWF
ADRESH ADRESH PORTC
BANKSEL MOVFW BANKSEL MOVWF
ADRESL ADRESL PORTD PORTD
;naar portd
BCF
PORTB,0
;ready indicator laag
GOTO
;MSB ;naar portc
;LSB
WachtADC Code 13: A/D-conversie met vaste samplefrequentie
4.6.4 Voorbeeldprogramma via interrupt Via interrupt werkt de ADC-module juist hetzelfde. Enkel wordt er nu niet meer gewerkt met polling op de GO_DONE-bit maar is er een interruptvlag ADIF die ervoor zorgt dat er naar de ISR gesprongen wordt eenmaal de conversie klaar is. Deze vlag dient gecleard te worden in de ISR waarna de conversie opnieuw kan gestart worden. In volgend voorbeeldprogramma wordt er in het hoofdprogramma een looplicht aangestuurd. Er wordt telkens een aantal milliseconden gewacht volgens het dvar register. De ISR vult dit register met de 8 hoogste bits van het analoog signaal. Er wordt dus variabel gewacht tussen de 0 en de 255 ms. Hieronder is de programmacode opgenomen van het bestand ADC+ISR.asm. Dubrul Stijn
Master Elektronica-ICT
42.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
TITLE "ADC via isr: variabel looplicht" PROCESSOR 16F877A #include #include __CONFIG _HS_OSC & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF ERRORLEVEL -302
;warning Register in operand not in bank 0
ORG 0x0000 ;vectors GOTO Init ORG 0x0004 GOTO Isr ;subroutines #include <delay.inc> ;initialiseren Init CLRF BANKSEL CLRF InitPORTB BANKSEL CLRF BANKSEL CLRF InitADC MOVLW BANKSEL MOVWF MOVLW BANKSEL MOVWF MOVLW BANKSEL MOVWF InitIntAan BANKSEL CLRF BANKSEL BSF BSF BSF InitADCstart BANKSEL BSF ;hoofdprogramma StartLoop BCF BANKSEL CLRF BSF Lopen CALL BANKSEL RLF BTFSC GOTO Dubrul Stijn
INTCON PIE1 PIE1
;disable interrupts ;disable periferie1 interupt
TRISB TRISB PORTB PORTB
;PORTB=output ;PORTB=0
0xFF TRISA TRISA
;PORTA=input
B'01000000' ;links uitlijnen,RC-klok,all ADC inputs ADCON1 ADCON1 B'11010001' ;RC-klok,selecteer AN2/RA2,ADC-module aan ADCON0 ADCON0 PIR1 PIR1 PIE1 PIE1,ADIE INTCON,PEIE INTCON,GIE
;clear ADC vlag ;ADC interrupt aan ;periferie interrupt aan ;global interrupt aan
ADCON0 ADCON0,GO_DONE
STATUS,0 PORTB PORTB PORTB,0 DelayVar PORTB PORTB,1 STATUS,0 StartLoop
;ADCconversie aan
;carry=0 (rotate throug carry) ;PORTB=0 ;RB0=1 ;wacht ;schuif ;carry? ->einde loop ;terug naar begin Master Elektronica-ICT
43.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
GOTO Lopen ;verder lopen ;************************************************ ;subroutine DelayVar ;MSB ADC * delay 1 ms DelayVar MOVFW temp ;MSB ADC MOVWF dvar ;opsaan in dvar BTFSC STATUS,Z ;dvar=?0 INCF dvar,f ;dvar++ (fix voor DECFSZ: 0-1=0xFF) DelayVarLoop CALL delay1ms ;wacht 1 ms DECFSZ dvar,f ;dvar-GOTO DelayVarLoop ;nogmaals wachten RETURN ;************************************************ Isr IsrPush BANKSEL SavedW MOVWF SavedW ;push W MOVFW STATUS MOVWF SavedSTATUS ;push status IsrADC BANKSEL ADRESH ;MSB ADC MOVFW ADRESH MOVWF temp ;opslaan in temp BANKSEL PIR1 CLRF PIR1,ADIF ;ADC interruptvlag clearen BSF ADCON0,GO_DONE ;conversie aan IsrPull MOVFW SavedSTATUS MOVWF STATUS ;pull status MOVFW SavedW ;pull W RETFIE ;return from isr END Code 14: ADC-module met interrupt: variabel looplicht
Dubrul Stijn
Master Elektronica-ICT
44.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.7 Timers 4.7.1 Doel -
de verschillende timers met elkaar vergelijken elke timer initaliseren en een kleine toepassing uitwerken de werking van de watchdog timer (WDT) onderzoeken
4.7.2 Vergelijking Er zijn 3 timers aanwezig en 1 WDT in de 16F877A. Hun werking is ongeveer hetzelfde maar toch zijn er verschillen in de opbouw van hun blokschema. In onderstaande tabel worden de belangrijkste verschillen vergeleken.
timer counter telbreedte
WDT ja nee n.v.t.
prescaler
nee
postscaler externe klok interrupt overig
timer 0 ja ja 8 bits vast 1:2/4/8/16 32/64/128/256
timer 1 ja ja 16 bits vast 1:1/2/4/8
timer 2 ja nee 8 bits vast 1:1/2/8
vast 1:12/4/8/16 32/64/128
nee
nee
instelbaar 1:1/2/3…15/16
nee
flank selecteerbaar
ja
nee
bij overflow
bij gelijkheid na de postscaler
bij overflow: bij overflow reset postcaler en prescaler gedeeld
Tabel 4: de timer-modules
De telregisters zijn steeds leesbaar en schrijfbaar (uitgezonderd de WDT) zodat een precieze timing verkregen kan worden. De timer maakt steeds gebruik van de interne klok. De couter maakt gebruik van een externe klok. Timer 0 en 1 genereren een interrupt bij een overflow van het telregister. Timer 2 vergelijkt steeds zijn waarde met een perioderegister en genereert een interrupt na zijn postcaler. De toepassingen van de timers zijn steeds het genereren van een precies tijdsinterval om op een gepaste tijd te reageren met bepaalde instructies. In de volgende voorbeeldprogramma’s en formules wordt steeds gewerkt met de interne klok (timer mode).
Dubrul Stijn
Master Elektronica-ICT
45.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.7.3 De WDT De WDT is een speciale timer die de mogelijkheid heeft om de PIC te resetten. Hij wordt aan of uit geschakeld via het configuratieregister. Er is een RC-oscillator aanwezig speciaal voor de WDT zodat deze ook werkt zelfs al is er geen klok aanwezig (in slaapmode bijvoorbeeld). De RC-oscillator is temperatuursafhankelijk zodat de tijd tot een reset kan verschillen. Typisch is deze ongeveer 7 tot 33 ms. Door de postscaler kan deze waarde oplopen tot maximum een 4-tal seconden. Wanneer de WDT ingeschakeld is moet de CLRWDT-instructie uitgevoerd worden op geregeld tijdstippen in het programma. Deze zorgt ervoor dat de WDT de PIC niet reset. De WDT is dus een controlemechanisme.
4.7.4 Timer 0 Timer 0 wordt ingesteld door 2 registers: het controleregister OPTION_REG en het perioderegister TMR0. De tijd tussen 2 interrupts wordt als volgt berekend:
timer0interrupt = Tins ⋅ prescaler ⋅ (256 - TMR0) Formule 4: berekenen van de tijd tot timer 0 interrupt
In OPTION_REG kan de prescaler en zijn waarde toegekend worden aan de timer module. De periode wordt ingevuld in het TMR0-register. Wanneer er geschreven wordt in dit register wordt er voor 2 instructietijden niet geteld. Een aangepaste waarde weg schrijven in het TMR0-register verhelpt dit natuurlijk. De prescaler van deze timer is gedeeld met de postscaler van de WDT. Een voorbeeld van het gebruik van timer 0 is terug te vinden bij de PWM met variabele duty-cycle.
4.7.5 Timer 1 Timer 1 wordt ingesteld door 3 registers: het controleregister T1CON en de perioderegisters TMR1H en TMR1L die samen de 16-bits telwaarde vormen. De prescaler en de klokselectie worden ingesteld via het controleregister T1CON. Het 16-bits telregister kan ook ingesteld worden om de tijd tot overflow (en interrupt) korter te maken. Pas dan wordt de timer ingeschakeld via de bit T1CON,TMR1ON. Er wordt daadwerkelijk geteld in de registers TMR1H en TMR1L dus moeten ze in de ISR opnieuw ingevuld worden. Om nieuwe waarden in de telregisters te schrijven wordt de timer best gestopt. Wanneer deze aan het incrementeren is kan het schrijven onvoorspelbare waardes teweeg brengen. Om ze te lezen zonder dat er gestopt wordt moet men oppassen bij een rollover tussen het hoogste en laagste register. Dit kan gecontroleerd worden door het hoogste register 2 maal te lezen en deze 2 waardes dan te vergelijken. De tijd tussen 2 interrupts wordt als volgt berekend. Dubrul Stijn
Master Elektronica-ICT
46.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
timer1interrupt = Tins ⋅ prescaler ⋅ (65536 - [TMR1H: TMR1L ]) Formule 5: berekenen van de tijd tot timer 1 interrupt
In het voorbeeldprogramma timer1.asm worden de 7-segmentdisplays aangestuurd in het hoofdprogramma zoals voordien. Door gebruik te maken van timer 1 kunnen we daadwerkelijk tellen i.p.v. een statische waarde te sturen. Er wordt een interrupt gegenereerd om de 100 ms. In de ISR wordt de timer gestopt zodat de nieuwe waarden in de telregisters kunnen geschreven worden. De ramvariabelen worden geüpdate zodat er geteld wordt op de displays. Hieronder is de code voor het initaliseren van de teller en het deel van de ISR waar de telregisters ingevuld worden opgenomen. InitTimer1 MOVLW BANKSEL MOVWF MOVLW BANKSEL MOVWF MOVLW MOVWF Timer1Start BANKSEL BSF
Isr IsrPull … IsrTimerPeriode BANKSEL BCF MOVLW MOVWF MOVLW MOVWF BSF IsrUpdateTeller … IsrClearVlag BANKSEL BCF IsrPull MOVFW MOVWF MOVFW RETFIE
b'00110000' T1CON T1CON
;pre=1/8,internal clock, timer off
0x9E TMR1H TMR1H 0x58 TMR1L
;telregisters ;100ms = 4/8e6 * 8 * 0xFFFF – 0x9E58
T1CON T1CON,TMR1ON ;timer1 aan Code 15: initaliseren van timer 1
T1CON T1CON,TMR1ON
;timer af
0x9E TMR1H 0x58 TMR1L
;telregisters updaten
T1CON,TMR1ON
;timer aan
PIR1 PIR1,TMR1IF
;timer 1 interrupt doorlaten
SavedSTATUS STATUS SavedW Code 16: periode update in ISR voor timer 1
Dubrul Stijn
Master Elektronica-ICT
47.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.7.6 Timer 2 Timer 2 wordt ingesteld door 2 registers: het controleregister T2CON en het perioderegister PR2. De pre- en postscaler worden ingesteld via T2CON, de 8-bits telwaarde in PR2. Pas als deze waarden ingesteld zijn mag de timer gestart worden door de bit T2CON,TMR2ON te setten. Net zoals timer 1 is de enable en de vlag voor de interrupt te bereiken via de PIE1 en PIR1-registers. De vlag moet op het einde van de routine zelf gecleard worden. De tijd tussen 2 interrupts wordt als volgt berekend. timer2interrupt = Tins ⋅ prescaler ⋅ PR2 ⋅ postscaler Formule 6: berekenen van de tijd tot timer 2 interrupt
In het voorbeeldprogramma timer2.asm worden er 8 frequenties gegenereerd op PORTB. We stellen de timer in met een prescaler van 4, een postscaler van 10 en het perioderegister met 250. Dit levert een periode op van 5 ms. Via de INCF-instructie wordt er telkens 1 bijgeteld op PORTB. Pin RB0 zal dus een frequentie genereren van 100 Hz (5 ms laag + 5 ms hoog). De frequenties op de volgende pinnen zullen steeds de helft lager zijn.
Dubrul Stijn
Master Elektronica-ICT
48.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.8 PWM 4.8.1 Doel -
de werking van de PWM-module bestuderen een PWM-signaal genereren met vaste duty cycle een PWM-signaal genereren met variabele duty cycle
4.8.2 Werking De 16F877A heeft 2 CCP-modules aan boord. Elke module heeft een controle register CCPxCON en 2 dataregisters CCPRxL en CCPRxH. Naast deze registers maken de modules ook gebruik van de timer 1 of de timer 2 module. De modules kunnen ingesteld worden als captureeenheid (meten van een tijd tot een gebeurtenis) of als compareeenheid (een gebeurtenis sturen op een bepaalde tijd). De interessantste mogelijkheid van deze module is de pulsbreedte modulatie (PWM). De PWM-module maakt het mogelijk om signalen met een variabele duty cycle te genereren. De werking is als volgt. Inwendig wordt er gebruik gemaakt van een set/reset-flipflop. Beide ingangen zijn verbonden met de uitgang van een comparator. De ene comparator staat in voor het bepalen van de periode (set) en de andere voor het bepalen van de duty-cyle (reset). Er wordt steeds vergeleken met de waarde van het timer 2 register en wanneer deze gelijk zijn wordt de set of de reset gestuurd. Er moet ingesteld worden hoelang een periode duurt (hoog+laag) en hoelang het signaal hoog blijft. De duty cycle heeft een maximum resolutie van 10-bits en is dubbel gebufferd. Dit is noodzakelijk om geen glitches op de uitgang te veroorzaken. De volgende figuren maken dit duidelijk.
Dubrul Stijn
Master Elektronica-ICT
49.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 33: werking van de PWM-module
Volgende formules zijn noodzakelijk om de periode, de frequentie en de maximum resolutie te berekenen. Deze formules zijn voor eenvoudig gebruik uitgewerkt in een excel-bestand. Dit bestand is terug te vinden in bijlage 10. PWMperiode = (PR2 + 1) ⋅ 4 ⋅ Tosc ⋅ Timer2prescaler PWMdutycyle = CCPR1L : CCP1CON[5 : 4] ⋅ Tosc ⋅ Timer2prescaler Fosc log Fpwm PWMresolutie = bits log(2) Formule 7: formules voor PWM
4.8.3 PWM met vaste duty-cycle Een eerste testprogramma PWMvast.asm geneereert een vaste PWMfrequentie van 1 kHz met een duty cycle van 50%. Het resultaat is hieronder te zien. Na meting met de scoop blijkt dat dit signaal bijzonder nauwkeurig opgewekt wordt. Het instellen van de PWMmodule is opgenomen in onderstaande flowchart. Merk op dat eens de PWM-module ingesteld is deze onafhankelijk (asynchroon) werkt van de rest van het programma. Interactie kan plaatsvinden d.m.v. de timer 2 interrupt. De routine om de module te initialiseren is hieronder opgenomen. Een code voorbeeld is in het programma PWMvar.asm terug te vinden.
Dubrul Stijn
Master Elektronica-ICT
50.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 34: instellen van de PWM-module
Figuur 35: opwekken van een periodiek signaal
4.8.4 PWM met variabele duty-cycle Als 2e testprogramma genereren we opnieuw een frequentie van 1 kHz maar dit keer met een traag variërende duty-cycle. Hiervoor maken we gebruik van timer 0 die telkens de duty-cyle bits verhoogt in de ISR. Eerst worden de 2 LSBs getest en eventueel geset of gereset. Pas daarna kunnen de 8 hoogste bits verhoogt worden. Naar mijn mening hadden de 2 hoogste MSBs beter apart gestaan zodat bij een lagere resolutie die eerst verloren gaan. Het resultaat van het programma PWMvar.asm is dat de LED traag oplicht en dan terug uit gaat. Met de scoop kan er gezien worden dat de duty-cycle langzaam wijzigt. De timer is zo ingesteld dat het 33,5 seconden duurt om van 0% naar 100% over te gaan. Er zijn 1024 timer 0 interrupts nodig die om de 32,7 ms opkomen. Het programma is op de volgende pagina opgenomen. De PWM-module en de timer 0 worden geïnitialiseerd. Het hoofdprogramma is een oneindige lus. Het wijzigen van de duty-cycle vindt plaats in de ISR.
Dubrul Stijn
Master Elektronica-ICT
51.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Init CLRF InitPin BANKSEL BCF InitPWM BANKSEL MOVLW MOVWF
INTCON
;disable interrupts
TRISC TRISC,2
;pin CCP1/RC2 = output
PR2 d'124' PR2
;PWM periode
BANKSEL CLRF BCF BCF
CCPR1L CCPR1L CCP1CON,5 CCP1CON,4
;LSB1 ;LSB0
MOVLW MOVWF
b'00000111' T2CON
;timer2 prescaler ;prescale 1/16 + timer enable
CCP1CON,CCP1M2 CCP1CON,CCP1M3
;selecteer PWM ;selecteer PWM
OPTION_REG b'11010111' OPTION_REG
;internal clock/4, pre 1:256
INTCON,TMR0IF INTCON,TMR0IE INTCON,GIE
;vlag ;enable ;enable
Loop
;hoofdprogramma: oneindige lus
CCP1CON CCP1CON,4 SetLSB0
;LSB0
BSF BSF InitTimer0 BANKSEL MOVLW MOVWF InitTimerInt BCF BSF BSF
;PWM duty cycle 0%
Loop GOTO Isr TestLSB0 BANKSEL BTFSS GOTO TestLSB1 BTFSS GOTO SetMSB BCF BCF BANKSEL INCF GOTO SetLSB0 BSF GOTO SetLSB1 BSF BCF IsrEnd BCF RETFIE
CCP1CON,5 SetLSB1
;LSB1
CCP1CON,4 CCP1CON,5 CCPR1L CCPR1L,f IsrEnd
;LSB0=0 ;LSB1=0 ;MSBs
CCP1CON,4 IsrEnd
;LSB0=1
CCP1CON,5 CCP1CON,4
;LSB1=1 ;LSB0=0
INTCON,TMR0IF
;vlag clearen
END Code 17: PWM-signaal met variabele duty-cycle
Dubrul Stijn
Master Elektronica-ICT
52.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.9 Data EEPROM 4.9.1 Doel -
leesroutine die 1 byte leest van het EEPROM geheugen op een gegeven adres schrijfroutine die 1 byte schrijft naar het EEPROM geheugen op een gegeven adres voorbeeldprogramma dat de werking illustreert en tevens het niet volatiele karakter ervan aantoont
4.9.2 Routines Voor deze opdracht zijn er 2 routines gemaakt. Deze zijn opgenomen in het bestand EEPROM.inc. De ene routine schrijft een byte naar de EEPROM, de andere leest een byte van de EEPROM. Deze routines maken gebruik van een controle register EECON1, een dataregister EEDAT en een adresregister EEADR. Deze routines zijn overgenomen zoals ze vermeld staan in de datasheet. Merk op dat met deze registers ook kunnen gebruikt worden om het programmageheugen te benaderen. Dit is niet uitgewerkt in deze thesis.
4.9.3 Voorbeeldprogramma Het voorbeeldprogramma EEPROM.asm vult alle beschikbare 256 EEPROM-locaties met de getallen 0x00 tot 0xFF. De data van een locatie zal dus gelijk zijn aan zijn corresponderend adres. Eens gevuld worden alle locaties gelezen en uitgestuurd via RS-232. Onderstaande figuur toont de output van het programma. De eerste witregels zijn de tekens vanaf 0x00 tot 0x2F van de ASCII-tabel. Deze tekens zijn niet afdrukbare tekens.
Figuur 36: Output van de EEPROM
Dubrul Stijn
Master Elektronica-ICT
53.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Indien we de PIC even niet van spanning voorzien en daarna de EEPROM uitlezen, kan aangetoond worden dat de EEPROM deze waarden onthoudt wanneer er geen spanning aangesloten is. Door achtereenvolgens ‘Device>Read’ en dan ‘Windows>EEPROM View’ te kiezen in PICFLASH2, krijgen we de inhoud van de EEPROM afgebeeld op het scherm. De onderstaande figuur toont deze inhoud.
Figuur 37: geheugendump van de EEPROM
Dubrul Stijn
Master Elektronica-ICT
54.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.10 Reset-condities 4.10.1 Doel -
bestuderen van de verschillende oorzaken van een reset voorbeeldprogramma maken die deze demonstreert
4.10.2 Werkwijze Een PIC kan gereset worden door één van de volgende mogelijkheden: -
POR: normale opstart omdat de spanning opkomt BOR: detectie van een te lage werkspanning, < 4,2 Volt WDT-reset: de WDT reset de PIC WDT-wake-up: de PIC is in SLEEP en ontwaakt door de WDT MCLR: normale reset door het indrukken van de resetknop MCLR-wake-up of interrupt-wake-up: de PIC ontwaakt uit SLEEP door middel van een externe rest of door een interrupt
Het achterhalen van de oorzaak van een reset gebeurt door middel van 2 bits uit het STATUS-register: /POR en /BOR; en 2 bits uit het PCONregister (power control): /TO en /PD. De bits uit het STATUS-register dienen geset te worden bij het opstarten van de PIC. Ze worden gereset door ofwel een POR of door een BOR. Bij de bits van het STATUSregister is het iets moeilijker. Van deze bits dient een kopie opgeslagen te worden in het RAM-geheugen. Deze bits kunnen dan vergeleken worden met de vorige toestand om te achterhalen of we te maken hebben met een externe reset (unchanged). Door een andere combinatie van deze bits kan bepaald worden of we te maken hebben met de WDT of een wake-up vanuit slaaptoestand. De volgende flowchart toont het verloop hoe we controleren.
Dubrul Stijn
Master Elektronica-ICT
55.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
START
0
/POR?
1
0
/POR?
1
nee
/TO en /PD gewijzigd?
ja
1
set bit /POR set bit /BOR
set bit /BOR
POR
BOR
/TO
0
1
normale MCLR
wake-up (MCLR of INT)
WDT reset
/PD
0
WDT wake-up
kopie STATUS naar RAM
EINDE
Figuur 38: flowchart achterhalen oorzaak reset
4.10.3 Voorbeeldprogramma In het voorbeeldprogramma reset.asm is de voorgaande routine geïmplementeerd. Door middel van RS-232 wordt gevisualiseerd om welke reset het precies gaat. Belangrijk is dat BODEN_ON in het CONFIG-register ingeschakeld is. Door te experimenteren met de SLEEP en CLRWDT-instructie alsook de WDT in of uit te schakelen in het CONFIG-register worden er verschillende reset-oorzaken gegenereerd. De volgende figuur toont een mogelijke uitvoer.
Dubrul Stijn
Master Elektronica-ICT
56.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 39: uitvoer van het reset-programma
4.10.4 Opmerkingen Dit programma detecteert elke reset correct, de eerste keer dat de reset zich voordoet. Echter wanneer er zich verschillende maal na elkaar een reset voordoet die gecontroleerd wordt door de /TO en /PDbits (wake-up of WDT) zal deze aangegeven worden als normale MCLR. Dit omdat een normale MCLR juist maar gedetecteerd kan worden door het niet wijzigen van deze bits. Wanneer 2 maal dezelfde reset van dit karakter zich voordoet zijn deze bits vanzelfsprekend ook dezelfde. Ik heb hiervoor geen oplossing gevonden.
Dubrul Stijn
Master Elektronica-ICT
57.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
4.11 Ervaringen met EasyPIC3 Het voor- en nadeel van het ontwikkelbord is raar maar waar hetzelfde. Het enorme voordeel is dat er direct geprogrammeerd kan worden zonder veel tijd te moeten steken in het ontwikkelen van hardware. Dit is echter ook zijn nadeel want je bent niet vrij in de opbouw van de hardware. Er zijn natuurlijk een aantal jumpers en dipswitches aanwezig waarmee je bepaalde lijnen kunt doorlaten of juist niet. Je bent echter niet vrij om alles aan te sluiten zoals je wilt. Bijvoorbeeld de 2 potentiometers voor A/D-conversie (RA2 en RA3) die gemultiplext zijn met de selectielijnen van de 7-segment displays. Display 2 en 3 kunnen dus niet gebruikt worden wanneer deze kanalen gebruikt worden. Er is een oplossing voor: zelf een verbinding maken tussen de potentiometer en een ander A/D-ingang. Het oscillatorontwerp is waarschijnlijk het meest storende. Het is handig dat het kristal vervangen kan worden om zo op een andere klokfrequentie te werken. Er zit wel wat speling tussen de pinnen van het kristal en het socket. Een elektrische verbinding kan op deze manier niet gegarandeerd worden waardoor de µC soms geen klok krijgt en dus ook niets zal uitvoeren. Verder staat het kristal nogal ver van bijna alle sockets (dit kan ook niet anders met 6 sockets) waardoor een stabiele klok ook niet gegarandeerd kan worden. Verder ontbreekt op het bord een LED en drukknop voor RE2 en is er geen socket voor een 20-pins PIC (zoals de 16F690 bijvoorbeeld). Alle hardware die ik getest heb werkt correct en is voldoende gedocumenteerd in de handleiding waardoor dit toch een bord is waar je vlug kunt op programmeren. Het is dus ideaal voor een labo microcontrollers. De PICFLASH2-programmer werkt ook uitstekend. Ik heb nooit een programmeerproces gehad die foutief afliep. Jammer dat er geen connector aanwezig is waardoor je de programmeerlijnen vlug met een externe schakeling kunt verbinden. Dit kan zelf gerealiseerd worden door een IC-socket in een ander socket te plaatsen en de programmeerlijnen te solderen. Het is ook jammer dat er niet rechtstreeks geprogrammeerd kan worden uit MPLAB. Mikroe heeft zijn eigen ontwikkelomgevingen waar dit wel kan maar deze zijn voor hogere programmeertalen (mikroC bijvoorbeeld).
Dubrul Stijn
Master Elektronica-ICT
58.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5 Vermogentoepassing 5.1 Keuze van de toepassing In het tweede deel van dit eindwerk wordt afgestapt van het ontwikkelbord en wordt er een concrete toepassing uitgewerkt voor het labo vermogenelektronica. Hier wordt er gebruik gemaakt van een ander µC, namelijk de 16F690. Deze µC is in samenspraak met mijn promotor gekozen omdat deze een verbeterde PWM-module aan boord heeft. Dit maakt deze µC uiterst geschikt om een vermogensturing mee te maken. In deze toepassing wordt een volledige brug (H-brug) gestuurd om zo een gelijkspanning om te vormen naar een wisselspanning. De opdracht is opgebouwd rond volgende figuur die in de datasheet van de 16F690 terug te vinden is.
Figuur 40: H-brug d.m.v. PWM met de PIC16F690
Dit schema is natuurlijk wat simplistisch voorgesteld maar geeft de opdracht goed weer. P1A tot P1D zijn de PWM-lijnen van de 16F690 die via een driver FETs aansturen. Deze fungeren als schakelaars die de aangelegde vermogenspanningen V+ en V- doorlaten of niet doorlaten. Wanner QA en QD ingeschakeld zijn krijgen we een spanning naar rechts gericht (forward), wanneer QB en QC ingeschakeld zijn een spanning naar links gericht (reverse). We kunnen op deze manier vanuit een gelijkspanning een wisselspanning maken. Natuurlijk mogen de FETs die boven elkaar staan (QA en QB of QC en QD) nooit gelijktijdig ingeschakeld zijn of dit zou een kortsluiting teweeg brengen.
Dubrul Stijn
Master Elektronica-ICT
59.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Het signaal dat we wensen te genereren zal er als volgt uitzien. Dit wordt ook wel een magische sinusgolf genoemd. Willen we een sinus van 50 Hz (periode van 20 ms) maken dan worden er eerst pulsen gestuurd in de positieve richting voor een periode van 10 ms waarna er pulsen in de negatieve richting gestuurd worden. De berekening van de pulsen komt later aan bod.
Figuur 41: voorstelling van een magische sinusgolf
Voor deze opdracht wordt er dus zelf een printontwerp (PCB) gemaakt met als centrale kern de µC. Deze opdracht is gestart met het uitzoeken hoe de PWM-module juist werkt en welke componenten er nodig zijn om de H-brug te vervaardigen, vooral op het vlak van de drivers. Na het tekenen van het schema kon de PCB ontworpen en getest worden. De software werd als laatste geschreven en verfijnd aan de hand van de metingen en berekeningen op vlak van pulsmodulatie.
5.2 Enhanced PWM De enhanced PWM-module die aanwezig is in de 16F690 kan aan de hand van 1 PWM-signaal tot 4 uitgangen sturen. De typische toepassingen hiervoor zijn een halve brug en een volle brug. Wanneer we de volgende figuur bekijken merken we dat de PWM-module opgebouwd is zoals in de ander PICs maar met een uitbreiding. Door middel van een aantal controleregisters kunnen er tot op 4 uitgangen PWM-signalen gemoduleerd worden. We kunnen 4 maal hetzelfde PWMsignaal naar buiten sturen, al dan niet geïnverteerd of we kunnen 2 lijnen gebruiken die complementair zijn voor een halve brug maar ook 4 lijnen zoals in deze toepassing voor een volledige brug.
Dubrul Stijn
Master Elektronica-ICT
60.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 42: blokschema van de enhanced PWM-module
Er is een ‘forward’ en een ‘reverse’-mode wanneer we in full-bridge werken. Ook dit is instelbaar via een bit. De geselecteerde mode zal ervoor zorgen dat 1 van de 2 onderste FETs van de H-brug ingeschakeld is. De PWM-pulsen komen dan automatisch terecht bij de diagonaal daar tegenoverstaande FET. Door op deze manier te werken kan de polariteit gewisseld worden. Volgende figuur maakt dit wat duidelijker door deze 2 modes te naast elkaar te plaatsen. 2 FETs die diagonaal tegenover elkaar staan zijn gesloten. De andere 2 zijn open.
Vcc
FET1
Vcc
Vout
FET2
gnd
gnd
Vcc
FET3
FET1
FET4
FET2
Vcc
Vout
FET3
FET4
gnd
gnd
Figuur 43: forward en reverse mode
Dubrul Stijn
Master Elektronica-ICT
61.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.3 Hardware 5.3.1 Elektrisch schema 5.3.1.1 Opbouw Het elektrisch schema bestaat uit een 4-tal grote delen: -
een voeding de vermogenspanning de sturing de H-brug met drivers
Hieronder is voor de eenvoud deel per deel uitgelegd. Het volledige elektrisch schema kan teruggevonden worden in bijlage 11. De datasheets van alle componenten zijn ook terug te vinden op de bijlage cd-rom.
5.3.1.2 De voeding De 16F690 werkt op een voedingsspanning van 5V. De FETs worden geschakeld met een spanning van 12V. De voeding heeft als doel deze 2 spanningen op te wekken. De netspanning wordt via een transformator verlaagt tot ongeveer 20V en omgevormd tot een pulserende gelijkspanning via een bruggelijkrichter. Een elco met hoge capaciteit buffert deze spanning. Deze spanning wordt via een regelaar met enkele condensators op 12V gebracht. Een 2e regelaar houdt de spanning op 5V. De regelaars worden beschermd bij het uitschakelen van de voeding d.m.v. een diode die er parallel mee geschakeld is. Elke voeding heeft een LED met voorschakelweerstand ter indicatie. Het schema ziet er als volgt uit.
Figuur 44: elektrisch schema van de voeding Dubrul Stijn
Master Elektronica-ICT
62.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Er is ook nog een 3e spanning aanwezig op de printplaat namelijk de spanning die de FETs schakelen. Deze wordt via 2 veiligheidsconnectoren aangebracht. Op de printplaat zijn 2 elco’s met een grote capaciteit voorzien die een maximale spanning van 400V aankunnen. Deze dienen natuurlijk als buffer voor de spanning. Bij de testen die uitgevoerd worden wordt er steeds gewerkt met een spanning van 24 V en wordt er belast met een gloeilamp van 40W. Een zekering van 1 A beveiligt dit geheel. Het schema ziet er als volgt uit.
Figuur 45: elektrisch schema van de vermogenspanning
5.3.1.3 De sturing De sturing bestaat uit de 16F690 met enkele randcomponenten: -
-
-
-
De 5V-voeding wordt ontstoord d.m.v. een condensator. Een kristal van 20 MHz en 2 kleine buffercondensatoren zorgen voor de klokfrequentie. De resetingang van de PIC is via een weerstand aan de +5V geschakeld zodat deze gereset wordt bij het opkomen van de voeding. De PIC kan ook gereset worden via een schakelaar die met de massa verbonden is. Er is een ISCP-connector voorzien zodat het programma aangepast kan worden. Deze connector is verbonden met de voedingsspanning en 3 pinnen van de µC: PGD (data), PGC (klok) en de MCLR. De programmer kan de MCLR-lijn hoog of laag brengen. Daarom is er een jumper voorzien voor de resetschakelaar zodat deze de lijn niet laag kan brengen terwijl de programmer ze hoog plaatst. De 4 PWM-lijnen zijn doorgeschakeld naar de drivers alsook een extra verbinding waarmee de uitgangen van de drivers uitgeschakeld kunnen worden (shutdown). Verder is er ook nog een LED met voorschakelweerstand die aangeeft of de PIC in werking is of niet en een drukknop aan de interrupt-ingang die het programma kan starten.
Het schema is op de volgende pagina opgenomen.
Dubrul Stijn
Master Elektronica-ICT
63.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks P1A P1B P1C
SD P1D
Figuur 46: elektrisch schema van het stuurgedeelte
5.3.1.4 De H-brug De H-brug bestaat uit de 4 FETs en 2 drivers. De drivers zorgen voor de aansturing van de FETs. Elke driver kan 2 FETs schakelen dus zijn er 2 drivers nodig met elk 2 PWM-lijnen als ingang. De shutdown van de driver is via een weerstand aan de +5V verbonden zodat de uitgangen ervan uitgeschakeld zijn bij het inschakelen van de voeding. De PIC kan deze dan laag maken. De FETs die gebruikt worden zijn van het type 20N60S5 van de firma Infineon technologies en worden geleverd in een TO-220-verpakking. Per 2 FETs is een koelvin uit aluminium voorzien. Deze FETs zijn gekozen voor de volgende karakteristieken: -
hoge drain-source spanning (max. VDS= 600 V) hoge continue stroom door de drain (max. ID= 20 A) lage ingeschakelde weerstand (RDS(on)= 0,19 Ω) lage inschakeltijd (td(on)= 60 ns) & lage uitschakeltijd (td(off)= 150 ns)
Als drivers is er gekozen voor de IR2113 van de firma International Rectifier. Deze chips zijn geleverd in DIP-uitvoering en kunnen langs de vermogenzijde spanningen aan tot 600V. Zowel aan de high als low side kan er 2 A geleverd of opgenomen worden. Het frequentiebereik kan variëren van een 10-tal Hz tot enkele 100 kHz. Ze zijn compatibel met TTL-logica zodat de PIC ze rechtstreeks kan sturen. Er is een onafhankelijke hoge en lage stuurzijde waarvan de propagatietijden gelijk zijn zodat ze gebruikt kunnen worden in hoge frequentie applicaties. Er is een voorziening getroffen zodat hoog en laag nooit gelijktijdig ingeschakeld kunnen zijn alsook een shutdown-pin waarmee de ingangen geblokkeerd worden en de uitgangen laag staan.
Dubrul Stijn
Master Elektronica-ICT
64.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Het schema van een halve brug ziet er als volgt uit. Dit schema komt dus 2 maal voor op de print om een volledige brug te vormen.
d g s
P1A/C SD P1B/D d g s
Figuur 47: elektrisch schema van een halve brug
Er zijn een paar redenen waarom een driver noodzakelijk is om een FET te schakelen. Vooraleerst dient VGS 12 V te zijn en moet er voldoende stroom geleverd of ontnomen worden om de FET te kunnen schakelen. De PIC levert een spanning op TTL-niveau (5 V) en zou met deze stromen niet overweg kunnen. Het belangrijkste probleem zit hem in het volgende: Wanneer FET1 ingeschakeld is komt de source van deze FET op V+ t.o.v. de massa te staan. Om de FET ingeschakeld te houden dient de gate nog steeds 12 V hoger te staan. Wanneer FET2 ingeschakeld is staat de source van FET1 op 0 V. Om FET1 terug in te schakelen moet de gate spanning 12 V zijn t.o.v. de massa. Dit noemt men het high side probleem. De driver-IC lost dit probleem op met slechts enkele randcomponenten zoals op de figuur hierboven te zien. Het inwendige van de driver is hieronder opgenomen.
Figuur 48: inwendige van de driver IR2113 Dubrul Stijn
Master Elektronica-ICT
65.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
De werking is als volgt: Telkens FET2 in geleiding is, zal de stuurcondensator C van FET1 zich opladen via een weg gevormd door de diode en FET2 naar de massa toe. Wanneer FET1 inschakelt, wordt de spanning over C als voeding gebruikt om de gate van FET1 op te laden. De spanning over C zal dalen. Wanneer FET1 terug inschakelt kan deze terug opladen. Hieruit volgt onmiddellijk een beperking: FET2 moet regelmatig inschakelen en moet voldoende lang ingeschakeld blijven zodat C terug kan opladen. Deze methode noemt de bootstraptechniek. De stuurcondensator C van FET1 dient over een voldoende capaciteit te bezitten. Niet alleen de gate-capaciteit (QG= 88 nC) van FET1 moet opgeladen worden. Naarmate FET1 inschakelt stijgt zijn sourcespanning t.o.v. de massa en wordt de bootstrap diode invers gepolariseerd. Dit kan slechts gebeuren indien gedurende een korte tijd een reverse recovery current loopt (1 A gedurende 200 ns). De lading Qrr die daarvoor nodig is wordt ook door de stuurcondensator geleverd. Verder moet er ook een continue ruststroom geleverd worden (IQBS= 230 µA) aan de klemmen VB en VS van het IC. De lekstroom van de diode (Ir = 5 µA) wordt ook geleverd door deze condensator. Er zal ook een stroom (IR= 1,2 mA) lopen door de weerstand van 10k die parallel geschakeld is met de gate en de source van FET1. Deze weerstand ontlaat de capaciteit van de FET bij het inschakelen van de voeding. Noemen we TON de langste tijd dat FET1 in geleiding is dan zal de condensator gedurende deze tijd een lading afstaan en zal er een spanningsval plaatsvinden die gelijk is aan onderstaande formule. ∆V =
∆Q QG + Qrr + TON ⋅ (IQBS + Ir + IR ) = C C
Formule 8: spanningsval over de stuurcondensator
De spanning moet natuurlijk nog voldoende groot zijn om Q1 volledig in geleiding te houden. ∆V moet voldoende klein zijn en C voldoende groot. Met een condensator van 100 µF is er nauwelijks een spanningsval van 3 mV merkbaar wanneer FET1 10 ms ingeschakeld is. Wanneer FET1 terug uitschakelt begint de source-spanning te dalen. Van zodra deze lager komt dan VCC begint voor C een refresh-cyclus. In de tijd dat FET1 uitgeschakeld is (TOFF) moet C terug bijgeladen zijn. Bemerkt dat C zich niet zal opladen tot VCC: er is een spanningsval over de diode VR en ook over FET2 (afhankelijk van RDS(on) en de laststroom). De diode moet de volledige voeding van de vermogenkring kunnen sperren. Verder moet zij een kleine lekstroom hebben en ultra-fast zijn. Hier is gekozen voor de fast-recovery diode 1N4937. Deze diode kan een inverse spanning VR = 600 V aan. De voorwaartse spanning is ongeveer 1 V. Dubrul Stijn
Master Elektronica-ICT
66.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
De kleine weerstand van 2Ω2 zal de inductieve werking van de koperbaan tegengaan. Dit zorgt weliswaar voor een vertraging tijdens het inschakelen van de FET. Het uitschakelen verloopt via de BAT49 diode die parallel met de weerstand staat. Dit is een schottky diode die snel kan schakelen met een lage voorwaartse spanningsval.
5.3.2 Printontwerp (PCB) De PCB is opgenomen in bijlage 12. Alle ontwerpfiles zijn ook op de bijlage cd-rom terug te vinden. Een printplaat met 2 lagen was voldoende zodat deze in school geëtst kon worden. Een foto is hieronder opgenomen. Bij het ontwerp is met volgende zaken rekening gehouden:
-
-
-
De drivers en hun randcomponenten staan zo dicht mogelijk bij de FETs zodat de koperbaantjes zo kort mogelijk gehouden worden. Wanneer er snel geschakeld wordt gedragen deze zich als spoelen die inductiespanningen kunnen veroorzaken. Voor de ingangsspanning en de uitgangsspanning zijn veiligheidsconnectoren gebruikt. De voeding en de sturing bevinden zich links. De vermogenzijde bevindt zicht rechts. De massa van de vermogenzijde is via 1 verbinding met de massa van de voeding verbonden om geen spanningsval te veroorzaken. (de stuurcondensators laden zich op via deze massa) Er zijn testpinnen voorzien aan de gate, drain en source van elke FET.
Figuur 49: foto van de vermogenprint Dubrul Stijn
Master Elektronica-ICT
67.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.3.3 Stuklijst De stuklijst van alle gebruikte componenten is hieronder opgenomen.
component
referentie
waarde
aantal
bruggelijkrichter
B1 C10, C11
B380C 33pF
1 2
C3, C6, C12, C13, C15, C16, C17, C19, C21, C22, C23 C2, C5 C4, C7, C18, C24 C14, C20 (tantalium) C8, C9 (elco) C1 (elco) CON1 X1 X2,X3,X4,X6 D1, D2 D3, D6 D4, D5, D7, D8 FET1, FET2, FET3, FET4 IC2, IC3 JP1 XTAL1 LED1 LED2 LED3 IC1 S1 S2 S3 REG1 REG2 TR1 R6, R8, R10, R12 R2, R4 R1 R5 R3,R7, R9, R11,R13, R14 F1 F2
100nF
11
330nF 10µF 100µF 470µF/400V 4700µF/25V RJ12 220V AC Saftey con. 1N4007 1N4937 BAT49 20N60S5 IRS2113 3pin 20MHz +12V +5V ON PIC16F690 NET ON/OFF RESET ON 7812 7805 E32TR7 2R2 180R 560R 1k 10k 250 mA 1A
2 4 2 2 1 1 1 5 2 2 4 4 2 1 1 1 1 1 1 1 1 1 1 1 1 4 2 1 1 6 1 1
condensator
connector
diode FET FET-driver jumper kristal LED microcontroller schakelaar
spanningsregelaar transformator
weerstand
zekering
Tabel 5: stuklijst vermogenprint
Dubrul Stijn
Master Elektronica-ICT
68.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.4 Software 5.4.1 Testprogramma halve brug Om de hardware te testen wordt er eerst een halve brug aangestuurd om de complexiteit van de te meten signalen te vereenvoudigen. Het testprogramma is zo opgesteld dat er een PWM-signaal gegenereerd wordt van 1.250 Hz. Dit is de laagste frequentie die gegenereerd kon worden met een kristal van 20 kHz. De duty-cycle is ingesteld zodat het signaal 25% van de tijd hoog is (200 µs) en 75% van de tijd laag is (600 µs). Dit testprogramma halvebrug.asm is niet opgenomen in de scriptie maar kan teruggevonden worden in bijlage 13.
5.4.2 Meetresultaten halve brug De halve brug wordt gevoed met 12 V en belast met een gloeilamp van 24V/40W zoals te zien in onderstaand vereenvoudigd schema. De lamp wordt verbonden met het midden van de halve brug en langs de andere zijde ofwel met de +12 V ofwel met de massa. Doordat de FETs geschakeld worden, zullen deze achtereenvolgens de output op +12 V brengen (FET1 geschakeld) of op massa brengen (FET2 geschakeld). +12 V
DRIVER
d FET1
P1A
HIN
HS
HO
g
24V/40W
s
VS
output
µC
RC1
SD d FET2
P1B
LIN
LS
LO COM
g s
Figuur 50: de halve brug belasten
Of het geheel werkt kan vlug visueel gecontroleerd worden. Wanneer de lamp met de +12 V verbonden is moet deze fel oplichten omdat de massa ¾ van de tijd doorgeschakeld wordt. Wanneer de lamp met massa verbonden is moet deze zwak oplichten omdat de + 12 V maar ¼ van de tijd geschakeld wordt.
Dubrul Stijn
Master Elektronica-ICT
69.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Er worden wat meer signalen opgemeten om de werking te controleren en te verklaren. Voor deze metingen wordt gebruik gemaakt van een draagbare oscilloscoop om geen problemen te veroorzaken. De massa van de probe mag van een conventionele scoop niet zomaar aan de output-klem verbonden worden omdat dit eventueel doorverbonden zou kunnen worden met de massa van de vermogenvoeding! Dit zou een kortsluiting veroorzaken wanneer de bovenste FET geschakeld is.
-
de stuursignalen die de PIC genereert:
Figuur 51: oscilloscoopbeeld PWM-stuursginalen
Dit zijn de signalen die de PIC genereert. Indien er verder ingezoomd wordt op de overgangen kan er gezien worden dat de dode tijd ongeveer 1 µs bedraagt. Dit verzekert dat de FETs niet gelijktijdig ingeschakeld zijn.
Figuur 52: oscilloscoopbeeld dode tijd
Dubrul Stijn
Master Elektronica-ICT
70.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
-
de gate-source spanningen die bij de FETs toekomen:
Figuur 53: oscilloscoopbeeld gate-source spanningen
Dit zijn de stuursignalen na de driver die de FETs daadwerkelijk aansturen en zijn natuurlijk van dezelfde frequentie en duty-cycle als de stuursignalen van de PIC. We zien dat de maximumspanning bij de bovenste FET lager is dan bij de onderste. Dit komt door de spanningsval over de diode.
-
de drain-source spanningen:
Figuur 54: oscilloscoopbeeld drain-source spanningen
Met deze signalen kan gecontroleerd worden of de FETs werkelijk schakelen. Wanneer we 0 V meten is de FET geschakeld (schakelaar gesloten). Wanneer we de voedingsspanning meten is de FET niet geschakeld (schakelaar open).
Dubrul Stijn
Master Elektronica-ICT
71.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
-
de spanning over de lamp (verbonden met +12 V):
Figuur 55: oscilloscoopbeeld output 1
We meten de spanning over de lamp naar de +12 V toe. Wanneer we + 12 V meten is de onderste FET geschakeld en de massa doorverbonden. Wanneer we 0 V meten is de bovenste FET geschakeld en staat er 0 V over de lamp. De lamp brandt helder. We meten maximum 10,2 V. De voeding is echter ook al gezakt naar 10,5 V door de stroom van 850 mA die er vloeide.
-
de spanning over de lamp (verbonden met massa):
Figuur 56: oscilloscoopbeeld output 2
Nu is de lamp verbonden met de massa. We meten de spanning van de massa naar de lamp toe. Dit is net de omgekeerde situatie als daarnet. De lamp brandt een stuk minder helder. De gemiddelde stroom bedraagt 350 mA wat ongeveer 3 maal minder is dan in de vorige situatie. Deze metingen tonen aan dat de hardware correct werkt. Dubrul Stijn
Master Elektronica-ICT
72.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.4.3 Gemoduleerde sinusgolf Om de sinusgolf te genereren wordt gebruik gemaakt van het ‘magic sinewaves’-principe van Don Lancaster. Don Lancaster is een pionier op vlak van microcomputers en is vooral gekend van de vele boeken die hij schreef. Op zijn website www.tinaja.com is heel wat informatie over het genereren van sinusgolven via PWM terug te vinden. Een magische sinusgolf is een opeenvolging van enen en nullen met zo weinig mogelijk overgangen. Door via de PWM-module precieze pulsen op te wekken kan er een hoge amplitude en een lage vervorming (distortion) verkregen worden. Concreet ziet de golf dat we willen opwekken er ongeveer uit als in volgende figuur. Vanaf 7 pulsen per kwadrant kan een efficiënte sinus gegenereerd worden.
Figuur 57: magische sinusgolf met 7 pulsen per kwadrant
Het spectrum van dit patroon is in de volgende figuur afgebeeld en hier is al meteen de bedoeling te zien. Het pulspatroon heeft als doel een grondharmonische te genereren met zo weinig mogelijk nevenharmonischen. Door zoveel mogelijk harmonischen te onderdrukken blijft de vervorming miniem.
Figuur 58: spectrum van een magische sinusgolf
Dit is natuurlijk theorie. In werkelijkheid zullen we onder invloed van kwantisatie niet alle harmonischen op 0 krijgen. Een low-pass filter kan deze vervolgens wegwerken.
Dubrul Stijn
Master Elektronica-ICT
73.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Het bepalen van de pulslengtes is eenvoudig uit te leggen. Het vergt echter enige kennis van Fourier-reeksen. Elke puls heeft zijn bijdrage in het spectrum die afhankelijk is van de pulsduur (start en stop):
cos(1 ⋅ p1s) − cos(1 ⋅ p1e) = amplitude ⋅ π 4 Formule 9: een puls in het Fourier-spectrum
Elke puls genereert ook harmonischen j:
cos(j ⋅ p1s) − cos(j ⋅ p1e) = amplitude ⋅ π 4j Formule 10: harmonischen van een puls
Willen we nu een magische sinusgolf genereren met 7 pulsen per kwadrant én alle harmonischen t.e.m. de 9e op 0 plaatsen, krijgen we een stelsel met 14 onbekenden zoals als volgt:
cos(1 ⋅ p1s) − cos(1 ⋅ p1e) + ... + cos(1 ⋅ p7s) − cos(1 ⋅ p7e) = amplitude ⋅ π 4 cos(3 ⋅ p1s) − cos(3 ⋅ p1e) + ... + cos(3 ⋅ p7s) − cos(3 ⋅ p7e) = 0 cos(5 ⋅ p1s) − cos(5 ⋅ p1e) + ... + cos(5 ⋅ p7s) − cos(5 ⋅ p7e) = 0 cos(7 ⋅ p1s) − cos(7 ⋅ p1e) + ... + cos(7 ⋅ p7s) − cos(7 ⋅ p7e) = 0 cos(9 ⋅ p1s) − cos(9 ⋅ p1e) + ... + cos(9 ⋅ p7s) − cos(9 ⋅ p7e) = 0 Formule 11: stelsel van harmonischen
Dit stelsel bestaat dus een grondharmonische met een amplitude en nevenharmonischen die op 0 geplaatst worden. Er bestaat geen wiskundige methode om dit stelsel op te lossen. Dit stelsel kan wel opgelost worden a.d.h.v. een numerieke lus. Deze methode wordt toegepast in de ‘JavaScript magic sinewave calculator’ die beschikbaar is op www.tinaja.com/demo28a.asp. De bediening is eenvoudig:
-
-
De amplitude wordt ingevuld en de berekening start door middel van de knop ‘set amplitude’. Een eerste voorstel wordt gegenereerd. Een efficiënter resultaat wordt verkregen door middel van ‘improve’ of ‘instacalc’. De pulsposities zijn vanaf nu beschikbaar alsook de amplitude van de harmonischen. Door middel van een kwantisatieniveau te kiezen en ‘debug’ wordt er een schatting gemaakt van de werkelijke vervorming.
Een screenshot van de calculator is op de volgende pagina opgenomen. Dubrul Stijn
Master Elektronica-ICT
74.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 59: screenshot van de magic sinwave calculator
5.4.4 Implementatie in het programma De hoekposities van de pulsen zijn nu beschikbaar en moeten nog omgezet worden naar tijden en vervolgens naar duty-cycles. Deze waarden worden via een lookup-table in de PIC geprogrammeerd. De volgende figuur is het vertrekpunt voor het programma en toont enkele belangrijke gegevens.
Figuur 60: vertrekpunt programma
Dubrul Stijn
Master Elektronica-ICT
75.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Er is in deze toepassing gekozen om de pulsen te sturen op een PWMfrequentie van 20 kHz. De pulsen volgen elkaar dus op om de 50 µs. Er passen precies 100 pulsen in een kwart sinus. Dit is het middel om de 7 pulsen die berekend zijn met de calculator te benaderen. Sommige pulsen zullen dus volledig laag zijn (O% duty-cycle), andere volledig hoog (100% duty-cycle). Om spiegelproblemen te vermijden worden geen duty-cycles ingesteld De concrete omvorming is opgenomen in een excel-file in bijlage 14. We zijn niet vrij om te kiezen wanneer afhankelijk is van de PWM-periode (50 µs). kiezen wanneer een puls stopt want dit periode omdat we niet met duty-cyles consequenties hebben.
een puls start omdat dit We zijn ook niet vrij om te is ook afhankelijk van de werken. Dit zal dus zijn
Diezelfde 100 pulsen maar dan gespiegeld worden opnieuw uitgestuurd voor het 2e kwart van de sinus. Na deze sequentie is de sinus halverwege en moet de polariteit gewisseld worden. Dezelfde sequentie van pulsen kan opnieuw uitgestuurd worden (normaal en gespiegeld) om het 3e en 4e kwadrant van de sinus te vormen. Concreet wordt de tabel met duty-cycle waarden eerst van boven naar onderen gelezen en vervolgens van onderen naar boven. De PIC zelf werkt met een kristal van 20 MHz. Een instructie duurt 4 klokpulsen ofwel 200 ns. Er is dus voldoende tijd (250 instructies) om de nieuwe pulsbreedte (0% of 100%) in te laden voor de volgende puls en eventueel de polariteit van de H-brug te wisselen. Door middel van de TMR2-interrupt wordt gesignaleerd wanneer een periode afgelopen is en wanneer een nieuwe begint. De nieuwe duty-cycle moet dus al klaarstaan omdat de nieuwe periode van deze gebruik maakt. Telkens de interrupt zich voordoet moet de nieuwe duty-cycle voor de volgende puls opgehaald worden zodat deze klaarstaat. Onderstaande figuur maakt dit duidelijk.
Figuur 61: ophalen volgende duty-cycle
Nog even opmerken dat de onderste 2 FETs in het begin van het programma even gesloten moeten worden zodat de stuurcondensators van de bovenste FETs zich kunnen opladen.
Dubrul Stijn
Master Elektronica-ICT
76.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.4.5 Hoofdprogramma H-brug Om de werking van het programma gedetailleerder te verduidelijken zijn onderstaande flowcharts opgenomen. De assembler code van het programma kan teruggevonden worden in bijlage 15.
Figuur 62: flowchart initialisatie
Dubrul Stijn
Figuur 63: flowchart ISR
Master Elektronica-ICT
77.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
HOOFD PROGRAMMA
nee
volgende stap nodig? ja
normaal
nee
leesrichting?
spiegel
stapteller++
stapteller--
Lees MSB & LSB (geen stap meer nodig)
Lees MSB & LSB (geen stap meer nodig)
einde tabel?
begin tabel?
ja
nee
ja
leesrichting= spiegel
leesrichting= normaal
polariteit wisselen
Figuur 64: flowchart hoofdprogramma
normaal Lookup MSB
Lookup LSB
pulsduur 0 pulsduur 1 … pulsduur 98 pulsduur 99
pulsduur 0 pulsduur 1 … pulsduur 98 pulsduur 99
spiegel Figuur 65: voorstelling lookup-tables
Dubrul Stijn
Master Elektronica-ICT
78.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
5.4.6 Meetresultaten H-brug De uitgang is opnieuw belast met een lamp van 24V/40W en de H-brug wordt gevoed met een gelijkspanning van 24 V. De 4 stuursignalen die de PIC genereert zien er als volgt uit:
Figuur 66: oscilloscoopbeeld stuursignalen
De bovenste 2 signalen hebben een frequentie van 50 Hz en komen tot stand door de foward en reverse mode. Deze worden gestuurd naar de onderste 2 FETs die de massa doorschakelen. De 2 onderste stuursignalen zijn de pulsen die opgewerkt worden om een sinusgolf te genereren en die de positieve spanning doorschakelen. Het volgend scoopbeeld toont deze signalen wat meer in detail. Er wordt 1 volledige periode van het programma weergeven. De gemoduleerde pulsen starten met een kleine breedte en zijn het breedst rond de 5 ms waarna hun breedte terug afneemt. Dit is een halve periode van de sinus. In het 2 deel krijgen we hetzelfde resultaat.
Dubrul Stijn
Master Elektronica-ICT
79.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 67: oscilloscoopbeeld detail van de stuursignalen
De spanning over de lamp wordt gemeten met een differentiaal probe om geen kortsluiting te veroorzaken via de aarding. Deze probe heeft een verzwakking van 1/20. Het signaal ziet er als volgt uit. Een wisselspanning wordt dusdanig opgewekt.
Figuur 68: oscilloscoopbeeld uitgangssignaal
Wanneer we 1 periode bekijken van het uitgangssignaal zien we de wisselspanning tot stand komen. Dezelfde stuurpulsen zijn zichtbaar en de polariteit wordt omgedraaid na een halve periode.
Dubrul Stijn
Master Elektronica-ICT
80.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Figuur 69: oscilloscoopbeeld detail van het uitgangssignaal
Met het meettoestel wordt er geen gelijkspanning gemeten. Er is dan ook geen DC-component aanwezig in dit signaal. Het meetoestel heeft een wisselspanning van 17 V. Dit is de RMS-waarde van een sinus met een piek die √2 hoger ligt, 24 V. Er vloeide een stroom van 1,5 A door de lamp. Het frequentiespectrum is opgenomen in de volgden figuur. De piek van 50 Hz is zichtbaar. De grootste storingen bevinden zich rond de 2 kHz.
Figuur 70: oscilloscoopbeeld spectrum van het uitgangssignaal
Dubrul Stijn
Master Elektronica-ICT
81.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Door een eenvoudig RC-filter te gebruiken zoals in onderstaand schema kan het uitgangssignaal naar een sinus omgevormd worden. Deze lowpass filter onderdrukt frequenties boven de 330 Hz. Het resultaat is ook opgenomen. De top tot topwaarde is ongeveer met 1/3 gedaald. Dit omdat er spanningsverlies is over de weerstand.
Figuur 71: RC-filter
Het uitgangssignaal ziet er als volgt uit:
Figuur 72: oscilloscoopbeeld gefilterde uitgangsspanning
Figuur 73: oscilloscoopbeeld detail gefilterde uitgangsspanning
Dubrul Stijn
Master Elektronica-ICT
82.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
6 Algemeen besluit Dit eindwerk was een boeiende uitdaging dankzij de grote verscheidenheid. Onderzoek, software en hardware kwamen aan bod, maar ook minder gekende terreinen zoals vermogenelektronica. De aansturing en de werking van de microcontrollers van Microchip is fascinerend. Door met assembler te werken sta je bijzonder dicht bij de hardware. Het assembleerproces is een traag proces maar wel een nauwkeurig proces. De MPLAB IDE helpt uitermate goed bij dit proces door de vele simulatiefuncties die aanwezig zijn. De datasheet blijft onmisbaar tijdens het programmeren en bepaalde stukken moeten soms vele malen opnieuw gelezen worden om geen detail over het hoofd te zien. Deze datasheets zijn bijzonder nauwkeurig opgesteld maar wanneer het op details aankomt kunnen sommige stukken toch nog voor interpretatie vatbaar zijn. Om te experimenteren met deze microcontrollers is het EasyPIC3ontwikkelbord uitermate geschikt in een leeromgeving. De documentatie is eenduidig, de hardware werkt correct en de on-board programmer functioneert zoals het hoort. Er hoeft geen tijd gespendeerd te worden aan het ontwikkelen van hardware zodat het programmeerproces direct kan starten. Kleine projecten kunnen vlug ontwikkeld worden wat didactisch interessant is. De voorbeelden en subroutines die in dit eindwerk ontwikkeld zijn, zorgen ervoor dat er steeds kan teruggevallen worden op werkende programma’s. Om een grotere toepassing te ontwikkelen kunnen de externe connectoren van het bord gebruikt worden. Het lijkt me toch beter om het bord te verlaten en zelf een printontwerp te maken wanneer extra hardware vereist is. Zo blijft alles gecentraliseerd en wordt er ook tijd gespendeerd aan de omliggende elektronica. Een eigen ontwerp bevat tevens alleen maar de componenten die noodzakelijk zijn, wat het opsporen van een fout eenvoudiger maakt. De vermogentoepassing was een grote uitdaging voor mij omdat mijn kennis van vermogenelektronica minimaal is. De begeleiding van Dhr. Windels kwam uitstekend van pas op dit gebied. Wanneer er overgestapt wordt naar een concrete toepassing komt er hardwarematig meer bij kijken dan op het eerste zicht. De microcontroller kan niet zomaar alles aansturen. Er zijn externe componenten nodig en dit vergt heel wat onderzoek. De opzet is geslaagd doordat de componenten zorgvuldig gekozen zijn en de print uitstekend werkt. Het bord kan in de toekomst gebruikt worden voor demonstraties omtrent de H-brug en de aansturing via PWM. De software kan eventueel verfijnd worden of voorzien worden van extra functies zoals het opmeten van de stroom bijvoorbeeld. Dubrul Stijn
Master Elektronica-ICT
83.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Literatuurlijst 16C50, datasheet, Microchip Technology, 2002, 194 blz. 16F690, datasheet, Microchip Technology, 2006, 294 blz. 16F877A, datasheet, Microchip Technology, 2003, 234 blz. EasyPIC3 Users Manual, handleiding, MikroeElektronica, 2e editie, november 2005, 30 blz. FAQ and archive from the ‘PIClist’, website, 2007, geraadpleegd op 22/5/2007, http://www.piclist.com/techref/piclist/index.htm Magic sinewaves: an executive summary, datasheet, Lancaster D., 2006, 9 blz. Microchip Technology delivers five billionth PIC microcontroller, persaankondiging, 8/11/2006, geraadpleegd op 22/5/2007, http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&n odeId=2018&mcparam=en028627 Microchip Technology Inc., website, 2007, geraadpleegd op 22/5/2007, http://www.microchip.com Microcontroller, artikel, Wikipedia, 17/5/2007, geraadpleegd op 22/5/2007, http://en.wikipedia.org/wiki/Microcontroller MPLAB ICD2 In-Circuit Debugger user’s guide, datasheet, Microchip Technology, 2005, 144 blz. MPLAB IDE user’s guide, datasheet, Microchip Technology, 2006, 288 blz. PIC FAQ, website, Van Ooijen W., geraadpleegd op 22/5/2007, http://www.voti.nl/picfaq/index.html PIC microcontroller, artikel, Wikipedia, 24/4/2007, geraadpleegd op 22/5/2007, http://en.wikipedia.org/wiki/PIC_microcontroller PICmicro mid-range MCU family reference manual, datasheet, Microchip Technology, 1997, 688 blz. The PIC microcontroller book , website, Nebojsa Matic, geraadpleegd op 22/5/2007, http://www.mikroe.com/en/books/picbook/0_Uvod.htm
Dubrul Stijn
Master Elektronica-ICT
84.
Onderzoek & ontwikkeling van de Microchip PICmicro 16F-reeks
Bijlagen Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage Bijlage
1: de projectfiche 2: informatieposter 3: samenvatting van dit eindwerk 4: datasheet MPLAB IDE user’s guide 5: datasheet ICD2 user’s guide 6: datasheet 16F877A 7: datasheet PICmicro mid-range MCU family reference manual 8: overzicht programma’s en subroutines voor de EasyPIC3 9: datasheet LCDM1602A LCD driver 10: hulpmiddel PWM-berekeningen 11: elektrisch schema vermogentoepassing 12: printontwerp vermogentoepassing 13: testprogramma vermogentoepassing halve brug 14: omvorming van de stuurpulsen 15: programma vermogentoepassing H-brug
Alle bijlagen zijn opgenomen op cd-rom. Bijlage 3, 8, 11, 12 en 15 zijn ook in deze scriptie opgenomen.
Volgende bestanden kunnen op de cd-rom teruggevonden worden: \Bijlagen
alle bijlagen zijn opgenomen in deze map
\EasyPIC3 \ASM+INC \HEX \Driver
programma's (asm) en subroutines (inc) gecompileerde programma's PICFLASH2 driver & programmer
\Vermogen \Eagle \PDF \ASM \HEX
elektrisch schema & printontwerp datasheets gebruikte componenten programma H-brug en halve brug gecompileerde programma's
\Scriptie
scriptie
Dubrul Stijn
Master Elektronica-ICT
85.