DCF77 klok met PIC µC 1 Gemeentelijk Technisch Instituut Europalaan 1 9120 BEVEREN ………………………………….. TECHNISCH SECUNDAIR ONDERWIJS Schooljaar: 2007 - 2008 ………………………………………….. GEÏNTEGREERDE PROEF 2de Leerjaar van de 3de Graad ELEKTRICITEIT-ELEKTRONICA DCF-klok met PIC µC Van Hoylandt Roel Weverstraat 31 9130 Kieldrecht 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 2 Woord vooraf Bij deze wil ik de personen bedanken die mij dit jaar gesteund hebben in mijn zesde middelbaar en bij de realisatie van mijn eindwerk. Zonder deze personen was het mij niet gelukt om dit dossier in orde te krijgen. Dank aan: dhr. Van Goethem M. voor het begeleiden van dit eindwerk; mvr. Schuddings M. voor de taalcorrectie; Alle andere leerkrachten van het zesde middelbaar voor de steun die ik dit jaar gekregen heb; mijn medeleerlingen voor de verkregen hulp dit jaar; mijn ouders voor de extra steun die ik dit jaar gekregen heb. Van Hoylandt Roel 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 3 Inhoudsopgave Woord vooraf Inhoudsopgave Inleiding 1 Algemeen blokschema 1.1 DCF77 1.1.1 Algemeen 1.1.2 Informatie in het signaal 1.1.3 Protocol 1.1.3.1 Bitstructuur 1.1.3.2 Signaal 1.1.3.3 Pariteit 1.2 Ontvangstmodule 1.2.1 Open-collectoruitgangen 1.2.2 Principewerking 1.3 Voeding 1.3.1 Afvlakcondensatoren 1.3.1.1 Wegwerken van laagfrequente rimpel 1.3.1.2 Wegwerken van hoogfrequente rimpel 1.3.2 Spanningsregelaar 7805 1.3.2.1 Nut van de spanningsregelaar 1.3.2.2 78xx familie 1.3.2.3 Opgewekt vermogen 1.3.2.4 Spanningsstabilisatie 1.3.2.5 Eigenschappen 1.4 Display 1.4.1 Algemeen 1.4.2 Aansluitpinnen 1.4.3 HD44780 1.4.3.1 Display Data Random Acces Memory (DDRAM) 1.4.3.2 Character Generator Read Only Memory (CGROM) 1.4.3.3 Instructies 1.4.3.4 Protocol 1.4.3.5 Opstarten van display 1.4.3.6 Tekst schrijven op het display 1.5 PIC Microcontroller 1.5.1 Algemeen 1.5.2 PIC-µC’s 1.5.3 16F648A 1.5.4 Blokschema 1.5.5 Instructies 1.5.6 Aansluitpinnen 1.5.6.1 Voeding 1.5.6.2 Poort A 1.5.6.3 Poort B 1.5.7 Interrupts 1.5.7.1 INTCON register 6EE Van Hoylandt Roel 2 3 5 6 6 6 7 8 8 9 12 13 14 15 15 16 16 17 17 17 18 19 19 22 22 22 24 25 26 26 28 31 32 32 33 33 34 35 36 41 44 45 45 46 47 49 2007-2008 DCF77 klok met PIC µC 1.5.7.2 PIE1 register Timer 0 Speciale functie registers 1.5.9.1 CMCON 1.5.9.2 TRISA, TRISB 1.5.10 Oscillator 1.5.11 RA5/MCLR/Vpp -pin 1.5.12 Software 1.5.12.1 Algemeen 1.5.12.2 HEX 1.5.12.3 ASM 1.5.12.4 JAL 1.5.12.5 Blokschema 1.5.13 Programmeertoestel 1.5.13.1 Galva-wisp 1.5.13.2 Optocoupler 1.5.13.3 Aansluitingen van een galva-wisp 1.5.13.4 Software 1.5.14 Schema Footprint pin mapping table Printontwerp Onderdeel Frans 4.1 L’article: DCF77 4.1.1 Introduction 4.1.2 L'émetteur 4.1.3 Le signal horaire 4.1.4 Les informations contenues dans le signal horaire 4.1.5 Le récepteur 4.2 Lexique – woordenlijst 4.3 Résumé en néerlandais – samenvatting in het Nederlands Onderdeel Engels 5.1 Lead 5.2 Article 5.2.1 PIC Microcontroller 5.2.2 Core Architecture of the 8-bit CPUs 5.2.3 Data Space (RAM) 5.2.4 Code Space 5.2.5 Stacks 5.2.6 Instruction Set 5.2.7 Criticisms 5.3 Lexicon Bibliografie 1.5.8 1.5.9 2 3 4 5 6 6EE Van Hoylandt Roel 4 49 50 53 53 53 53 54 55 55 55 56 56 58 59 59 60 60 61 62 65 68 70 70 70 70 70 71 73 74 74 75 75 75 75 75 76 76 76 77 77 78 79 2007-2008 DCF77 klok met PIC µC 5 Inleiding De uiteindelijke bedoeling van dit eindwerk is het bouwen van een DCF-klok met een PIC microcontroller. Dit is een klok die, wanneer ze ingeschakeld wordt, zelf de juiste tijd en datum zoekt. Dit gebeurt door het oppikken van het DCF77-signaal. Het hart van de schakeling is een PIC microcontroller. De tijd en datum zullen af te lezen zijn op een HD44780-compatibele display; dit type display is een veelvuldig gebruikt en gemakkelijk aanstuurbaar type. Om de klok werkend te maken, dient er software geschreven te worden, dit zal gebeuren in de programmeertaal JAL (Just Another Language). Deze taal is zeer bekend onder elektronicahobbyisten en staat bekend om zijn gebruiksgemak. Er zal gebruik gemaakt worden van een zelf ontworpen schema en printontwerp. Als voeding zal er een adapter in combinatie met een spanningsregelaar gebruikt worden. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 6 1 Algemeen blokschema Volgende figuur stelt de klok blokschematisch voor: 2. Voeding DCF77 1. Antenne 4. PIC µC 3. Display Figuur 1: Algemeen blokschema Zoals men kan zien, is dit eindwerk op te splitsen in vier grote delen, namelijk: 1. antenne en ontvangstmodule: zorgt voor het ontvangen en omzetten van het DCF77 signaal naar een bruikbaar signaal; 2. de voeding: zorgt voor de nodige spanning; 3. display: zorgt ervoor dat de tijd en datum afleesbaar zijn; 4. PIC microcontroller (µC): het hart van de klok, dit onderdeel regelt en controleert de gehele schakeling. 1.1 DCF77 1.1.1 Algemeen Het DCF77 (afgekort DCF) -signaal wordt uitgezonden vanuit Mainflingen (50°01' N, 09°00’ O); dit ligt ongeveer 25 km van Frankfurt. Het signaal kan men ontvangen in ongeveer geheel West-Europa. Figuur 2: Ontvangstbereik DCF77 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 7 De D in de afkorting is afkomstig van Deutschland (Duitsland), de C staat als kenteken voor de “lange golf”, de F voor Frankfurt en 77 slaat op de frequentie van het uitgezonden signaal (77,5 kHz). Met “lange golf” wordt er een frequentiegebied tussen 30 en 300 kHz bedoeld, dit gebied heeft een golflengte van 10 tot 1 kilometer. Verder is er nog het middengolfgebied (300 tot 3000 kHz, 1 km tot 100 m) en het kortegolfgebied (3 tot 30 MHz, 100 m – 10 m). Vroeger waren deze frequenties hoog genoeg maar vandaag de dag worden er nog hogere frequenties gebruikt voor digitale radio- en televisie-uitzendingen, GSM, draadloos internet,… Bij DCF77 wordt er niet aan hoge snelheid informatie uitgezonden, dus is het uitzenden op lange golf voldoende. De hoofdzender van het DCF77-signaal heeft een zendvermogen van 50 kW; er is ook een reservezender met een zendvermogen van 30 kW. Deze wordt gebruikt tijdens onderhoud of bij defect van de hoofdzender. Dit om er voor te zorgen dat er constant een signaal aanwezig is. In enkele uitzonderlijke gevallen, zoals een zware storm, zullen beide zenders uitgeschakeld worden. In volgende tabel ziet men hoe vaak (en hoelang) de zenders uitgeschakeld zijn gedurende één jaar. Tijd in minuten 2-5 5-15 15-30 >30 Aantal keer voorgekomen 7 5 4 5 Cijfers: 2005-2006 Tabel 1: Uitschakeltijden zenders Het signaal had in dat jaar (’05-’06) een aan-tijd van 99.87 %, dit maakt dat het signaal zo goed als constant te ontvangen is. Om ervoor te zorgen dat de uitgezonden tijd correct is, wordt er gebruik gemaakt van drie atoomklokken. Deze drie klokken en de bijhorende computers die zorgen voor de juiste tijdsindicatie, zijn aangesloten op een UPS1, wat er voor zorgt dat er een continu, correct en betrouwbaar signaal gegenereerd wordt. 1.1.2 Informatie in het signaal Het DCF77-signaal bevat volgende informatie: reserve’/hoofdantenne in gebruik; zomertijd/wintertijd; minuten (0-59); uren (0-23); dag van de maand (1-31); dag van de week (1-7); 1 Uninterruptible Power Supply: Apparaat dat bij uitval van de netspanning de stroomvoorziening van computers en andere apparatuur voor een tijd kan overnemen door gebruik te maken van energie die opgeslagen is in accu’s. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 8 maand (1-12); jaar (bv: 2008). Verder bevat het ook informatie over het weer in Europa. Hiervoor is Europa opgesplitst in 90 gebieden. Dit systeem wordt “Meteotime” genoemd, om gebruik te mogen maken van dit systeem moet je echter wel over een licentie beschikken. 1.1.3 Protocol 1.1.3.1 Bitstructuur Elke minuut worden er 58 bits verzonden: deze 58 bits noemt men één venster of frame. In onderstaande figuur ziet men wat elke bit in één venster doet. Zo zal bijvoorbeeld bit 15 aankondigen of er wordt uitgezonden via de reserve of hoofdinstallatie. Elke seconde wordt er 1 bit verzonden, behalve op seconde 59, dit om het begin van elke minuut aan te tonen. Figuur 3: Functie van de bits 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 9 In volgende tabel staat beschreven waar elke bit voor staat: Bitnummer(s) 0-14 Naam 15 R Zend antenne 16 17 18 A1 Z1 Z2 Aankondigings bit 1 Tijd zone bit 1 Tijd zone bit 2 19 A2 Aankondigings bit 2 20 21-27 28 29-34 35 36-41 S Startbit Minuten Pariteitsbit 1 Uren Pariteitsbit 2 Dag van de maand P1 P2 Functie Gereserveerd 42-44 Dag van de week 45-49 50-57 58 59 Maand Jaar Pariteitsbit 3 P3 Toelichting 0 = Standaard antenne 1 = Reserve antenne 1 = Komend uur wisselt de wintertijd/zomertijd 0 = Winter / 1 = Zomer 0 = Zomer / 1 = Winter 1 = Komend uur wordt een extra seconde ingevoegd (schrikkelseconde) Altijd 1 2 3 7 bit BCD , LSB eerst (0-59) Even pariteit voor bits 21-27 6 bit BCD LSB eerst (0-23) Even pariteit voor bits 29-34 6 bit BCD, LSB eerst (1-31) 3 bit BCD, LSB eerst (1=maandag – 7 = zondag) 5 bit BCD, LSB eerst (1-12) 8 bit BCD, LSB eerst (0-99) Even pariteit voor bits 36-57 Geen bit uitgezonden Tabel 2: Functiebeschrijving ontvangen bits 1.1.3.2 Signaal Om de informatie (= bits) te verzenden wordt er gebruik gemaakt van een amplitude gemoduleerd (AM) signaal met een frequentie van 77,5 kHz. Amplitude modulatie (AM) Bij amplitude gemoduleerde signalen wordt er signaal uitgezonden met een vaste frequentie. De amplitude van dit signaal is afhankelijk van de grootte van de te verzenden informatie. Onderstaande figuur toont de te verzenden informatie en het uitgezonden signaal. 2 3 BCD = Binary Coded Decimal bv. 0011 0110 = 36 LSB = Least significant bit, de bit met de minste waarde bv. de ‘1’ in 0000 0001 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 10 Figuur 4: AM-modulatie Als men een AM-signaal, waarbij het te verzenden signaal een constante frequentie fi heeft en de draaggolf een frequentie fc, bekijkt met een spectrum analyzer4 krijgt men volgende figuur: Figuur 5: Spectrumanalyse van een AM-signaal Men ziet dat er 3 frequenties in het AM-signaal voorkomen, de middelste frequentie fc en de twee zijbanden fc – fi en fc + fi . Een groot deel van het zendvermogen bij AM-uitzendingen gaat verloren aan het uitzenden van de draaggolf, die geen enkele informatie bevat. Amplitude modulatie is de oudste vorm van modulatie die al vanaf het ontstaan van de radio wordt gebruikt. Dit omdat een AM-signaal redelijk simpel gegenereerd kan worden. Een AM-zender en ontvanger zijn hierdoor relatief eenvoudig van opbouw. Tegenover dit grote voordeel van eenvoudige apparatuur staan drie belangrijke nadelen: grote bandbreedte (minstens twee maal fi); veel vermogen nodig; grote mate van storingsgevoeligheid. 4 Een spectrum analyzer toont een grafische voorstelling van de amplitude van een signaal in functie van de frequentie. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 11 De grote mate van storingsgevoeligheid bij AM wordt veroorzaakt door het feit dat de meeste storingen zorgen voor een variatie van de amplitude van het ontvangen signaal. Frequentie modulatie (FM) Bij frequentie modulatie wordt de frequentie van de draaggolf (carrier) gemoduleerd naargelang de grootte van het uit te zenden signaal. In onderstaande figuur ziet men bovenaan de te verzenden informatie, onderaan het uitgaande FM-signaal. Men ziet dat de frequentie van dit signaal afhankelijk is van de waarde van de te verzenden informatie. Figuur 6: Frequentie modulatie Frequentie modulatie wordt veel gebruikt op plaatsen waar storingen op het draaggolfsignaal door elektromagnetische pulssignalen, zoals de bliksem, zeer ongewenst is of waar een goede kwaliteit van het draagsignaal voorop staat. De meeste storingen, zoals elektromagnetische pulssignalen, hebben invloed op de amplitude van het uitgezonden signaal, ze beïnvloeden in veel mindere mate de frequentie van het uitgezonden signaal. Een FM-ontvanger let niet op de amplitude van het ontvangen signaal, de amplitude van het signaal mag dus gewijzigd worden. Wanneer de storing echter te groot wordt, kan het gebeuren dat de FM-ontvanger de storing niet langer onderdrukt en een volledige periode van de draaggolf overslaat. Bij een FM-radio zal dit te horen zijn als een typische scherpe tik. FM-signalen zijn gemakkelijker te ontvangen dan AM-signalen. Bij DCF77 wordt er gebruik gemaakt van amplitude modulatie omdat dit met een eenvoudige en goedkope ontvanger te ontvangen is, ook is de reikwijdte van deze lage frequentie groter. Om informatie te verzenden bij DCF77 wordt elke seconde de amplitude van het signaal voor een bepaalde tijd teruggebracht tot 25 %. Behalve op seconde 59, dan blijft de amplitude ongewijzigd. Dit om het begin van een venster (=minuut) aan te geven. In volgende figuur is duidelijk te zien dat op seconde 59 de amplitude van het signaal niet gewijzigd wordt. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 12 Figuur 7: Signaal rond minuutovergang Om te weten te komen of de ontvangen bits nu de waarde 0 of 1 hebben moet er gekeken worden naar de tijd dat het signaal gemoduleerd is tot 25 %. Is dit 100 milliseconden dan is de ontvangen bit een 0, bij 200 milliseconden is de ontvangen bit een 1. Volgende figuur toont het signaal op een willekeurig moment: Figuur 8: Signaal op een willekeurig moment Men ziet dus dat op seconde 45 het signaal 200 milliseconden lang gemoduleerd is tot 25 %, bit 45 heeft dus de waarde 1, net zoals bit 46 en 47. Bit 48 krijgt de waarde 0. Ook is duidelijk te zien dat er tussen 2 ontvangen bits juist 1 seconde zit. 1.1.3.3 Pariteit Door gebruik te maken van pariteitbits is het mogelijk om te controleren of er foutieve data ontvangen werd. Hiervoor wordt er een extra bit, de pariteitsbit, meegezonden na een reeks data (bits). Bij DCF77 wordt er gebruik gemaakt van even pariteit. Dit wil zeggen dat het aantal ontvangen bits met waarde ‘1’, inclusief de pariteitsbit, even moet zijn. Bijvoorbeeld: De bedoeling is dat het getal (107)10 of (0110 1011)2 , verzonden en ontvangen wordt. Het getal (0110 1011)2 bevat een oneven aantal énen, de pariteitsbit zal dus 1 worden. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 13 De uitgezonden data wordt dus: (0110 1011 1)2 Stel dat de ontvanger volgende data ontvangt: (0110 1011 1)2 = (107)10: even aantal énen, de ontvanger mag de data accepteren; (0110 1010 1)2 = (106)10: oneven aantal énen, de ontvanger mag de data niet accepteren; (0100 1010 1)2 = (74)10: even aantal énen, de ontvanger zal de data accepteren hoewel ze foutief is. Bij DCF77 worden er 3 pariteitsbits meegezonden, namelijk bit 28 (P1), 35 (P2) en 58 (P3). Bit 28 zal de pariteit geven voor bits 21 tot en met 27, bit 35 voor bits 29 tot en met 34 en bit 58 voor de bits 36 tot en met 57. 1.2 Ontvangstmodule Om het ontvangen signaal van 77,5 kHz naar een bruikbaar signaal voor de microcontroller om te zetten, wordt er gebruik gemaakt van een ontvangstmodule welke volledig gemonteerd gekocht is. Figuur 9: Foto ontvangstmodule De module maakt gebruik van een ferrietantenne zodat ook een zwak signaal nog gemakkelijk te ontvangen is. Men kan deze module aansluiten op een gelijkspanning van 1,2 tot 15 volt, de stroomopname is 3 milliampère. Op de module zitten 4 aansluitklemmen, deze hebben volgende functie: Aansluitklem 1 2 3 4 Functie Massa Positieve voedingsspanning DCF77-uitgang (open collector) Geïnverteerde DCF77-uitgang (open collector) Tabel 3: Functie van de aansluitklemmen 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 14 Men verkrijgt dus volgend aansluitschema: Figuur 10: Aansluitschema DCF77-module 1.2.1 Open-collectoruitgangen De beide uitgangen kunnen maximaal 1 milliampère ingangsstroom en een maximale potentiaal van 30 Volt verdragen. In volgende figuur is één van beide uitgangen voorgesteld. Figuur 11: Open collectoruitgang De transistor T zit op de print van de ontvangstmodule, de weerstand R is aangesloten op de uitgang (= de collector van de transistor T) van de module en de positieve voedingsspanning welke een potentiaal heeft van + 5 Volt. Stel: 1) T is in geleiding: → er zal een stroom IR beginnen lopen van de positieve voedingsspanning door de weerstand naar de collector; → er zal een spanning (UR = IR x R) over de weerstand komen te staan; → de uitgangsspanning Uu wordt gelijk aan 5 V – UR . 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 15 2) T is in sper: → er kan geen stroom meer lopen door de weerstand want de transistor werkt als open schakelaar. (IR = 0 mA); → de spanning over de weerstand wordt 0 V (UR = IR x R = 0 mA x R = 0 V); → de uitgangsspanning wordt 5 V (Uu = 5 V – UR = 5 V – 0 V = 0 V). Een open-collectoruitgang levert dus geen stroom, er kan enkel stroom in de uitgang binnenvloeien. Als men geen pull-up weerstand zou gebruiken zou men een onbruikbare spanning meten voor Uu. Ze noemen deze weerstand een pull-up weerstand omdat hij de collector naar de positieve voedingsspanning “trekt”. Om de minimale waarde van de weerstand te weten te komen, moet men de maximale stroom door en spanning over de weerstand weten. De maximale stroom door de weerstand is 1 mA, dit is de maximale stroom die de open-collectoruitgang kan verdragen. De maximale spanning over de weerstand is gelijk aan de voedingsspanning, 5 volt. Men krijgt dus volgende formule: In de schakeling wordt een weerstand van 10 kΩ gebruikt zodat de stroom maar maximaal 0,5 mA kan worden. 1.2.2 Principewerking Volgende figuur stelt de principiële werking van de module voor. Indien er gebruik gemaakt wordt van de niet-geïnverteerde uitgang met pull-up weerstand zal Uu hoog worden als het DCF77-signaal gemoduleerd wordt naar 25 %. Men krijgt dus impulsen aan de uitgang van 100 of 200 milliseconden met een spanning van 5 volt. Deze impulsen kan men uitlezen met een microcontroller. Figuur 12: Principewerking ontvangstmodule 1.3 Voeding Om er voor te zorgen dat elk onderdeel van de schakeling een stabiele en correcte spanning krijgt, wordt er gebruik gemaakt van volgend schema: 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 16 Figuur 13: Schema van voeding De inkomende spanning komt van een adapter die de netspanning omzet naar 12 volt gelijkspanning. De diode D1 zorgt ervoor dat, als de ingangsspanning omgepoold wordt er geen stroom kan vloeien. Ze zal namelijk in sper komen als de ingangsspanning verkeerd wordt aangelegd, op deze manier is de schakeling ook beveiligd tegen wisselspanning. 1.3.1 Afvlakcondensatoren Een afvlakcondensator kan men herkennen aan het feit dat deze parallel met de voeding staat. Zo zijn alle condensatoren in bovenstaand schema afvlakcondensatoren. Toch kan men twee types onderscheiden, namelijk de afvlakcondensatoren voor laagfrequente en hoogfrequente rimpel. De condensatoren zorgen er ook voor dat stroompieken opgevangen worden zonder dat de voeding in elkaar zakt. 1.3.1.1 Wegwerken van laagfrequente rimpel De condensatoren C1 en C3 in bovenstaand schema hebben tot nut de laagfrequente rimpel te minimaliseren. Volgende figuur laat zien wat een afvlakcondensator doet bij een enkelzijdige onafgevlakte voeding met belasting: Figuur 14: Afvlakcondensator Als men geen condensator parallel aan de ingangsspanning zet dan krijgt men een pulserende gelijkspanning. Als men deze spanning zou aansluiten op de microcontroller zou deze zich telkens opnieuw resetten omdat de voedingsspanning op bepaalde momenten nul volt wordt. Plaatst men nu een condensator parallel over de voeding dan zal de condensator telkens opnieuw opladen wanneer de 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 17 ingangsspanning Uin groter wordt dan Uc. Als de voedingsspanning lager wordt dan Uc dan zal de condensator zich ontladen over de belasting, de spanning zal dus lichtjes dalen tot wanneer Uin terug groter wordt dan Uc. De verkregen uitgangsspanning Uu zal nu een meer perfecte gelijkspanning benaderen. Om de capaciteitswaarde van de condensatoren te berekenen, wordt er meestal 2200 microfarad per ampère genomen. De totale klok neemt iets minder dan 100 milliampère, er worden dus condensatoren gebruikt van 220 microfarad. 1.3.1.2 Wegwerken van hoogfrequente rimpel Door lange voedingskabels kan er (hoogfrequente) ruis opgevangen worden die de DC-spanning vervuild. Dit kan zorgen voor een onzekere werking van de aangesloten componenten. Figuur 15: DC-spanning met hoogfrequente AC-component Het is dus van groot belang dat de voedingsspanning vrij gemaakt wordt van deze vervuiling, dit kan gebeuren door een condensator te plaatsen die de hoogfrequente spanningen kortsluit. In het schema van de voeding vormen C2, C4 en C5 elk een laagdoorlaatfilter zonder weerstand. We krijgen volgende formule: f: C: frequentie waarbij de condensator een kortsluiting vormt [Hertz]; waarde van de condensator [Farad]. Als men alle frequenties boven 1,5 MHz weg wil filteren, moet men een condensator gebruiken van 106,1 nF. In deze voeding worden er condensatoren van 100 nF gebruikt, dit is een typische waarde voor digitale schakelingen. 1.3.2 Spanningsregelaar 7805 1.3.2.1 Nut van de spanningsregelaar De voedingsspanning van de microcontroller moet tussen 2.0 en 5.5 Volt liggen, bij de display is dit 4.5 en 5.5 Volt. Het is dus noodzakelijk dat de inkomende spanning van de adapter omgezet wordt tot een stabiele en constante spanning van 5 Volt. Hiervoor wordt het IC5 7805 gebruikt, dit is een veelgebruikte spanningsregelaar. Hij 5 Integrated Circuit, geïntegreerde schakeling, volledige elektronische schakeling in één behuizing 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 18 wordt ondergebracht in een TO220-behuizing zodat een koelvin aangesloten kan worden. Figuur 16: TO220 behuizing 1.3.2.2 78xx familie Het 7805 IC is een onderdeel van de 78xx-familie, dit is een reeks spanningsregelaars met elk een verschillende uitgangsspanning. Er bestaan drie uitvoeringen naargelang de stroom die ze kunnen leveren, zo is er de 78Lxx-serie die 100 mA kan leveren, de 78xx-serie die 1 A kan leveren en de 78Sxx-serie die 2 A kan leveren. Het IC dat in deze voeding wordt gebruikt kan dus 1 Ampère stroom leveren. In onderstaande tabel vindt men een overzicht van de 78xx-familie: Uuit [V] 2 3,3 5 6 7,5 9 10 12 15 18 24 Iuit = 100 mA 78L02 78L33 78L05 78L06 78L09 78L10 78L12 78L15 78L18 - Iuit = 1 A 7833 7805 7806 7809 7812 7815 7818 7824 Iuit = 2 A 78S05 78S75 78S09 78S10 78S12 78S15 78S18 78S24 Tabel 4: 78xx-familie Er bestaat ook nog een variant op de 78xx IC’s, namelijk de 79xx-familie. Deze IC’s worden gebruikt wanneer negatieve spanningen geregeld moeten worden. De 78xx- en 79xx-families zijn seriespanningsregelaars, dit wil zeggen dat ze in serie met de belasting worden opgenomen. Ze zijn voorzien van drie aansluitpinnen, de ingang (1), de massa (3) en de uitgang (2) (79xx heeft een andere pinout!). Merk op dat het ijzeren lipje en de middelste pin met elkaar zijn doorverbonden. Figuur 17: Pinout van een 78xx IC 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 19 1.3.2.3 Opgewekt vermogen Een seriespanningsregelaar wordt zoals eerder vermeld in serie gezet met de belasting. De spanning over de regelaar zal zo geregeld worden dat er aan de uitgang steeds een vaste spanning staat, onafhankelijk van de ingangsspanning. Aangezien er dus steeds een spanning over de regelaar staat en er steeds een stroom vloeit door de regelaar zal er een vermogen opgewekt worden. Dit vermogen zal omgezet worden in warmte welke afgevoerd moet worden via een koelvin. De grootte6 van het opgewekte vermogen in de spanningsregelaar kan men berekenen met volgende formule: P: Uin: Uuit: I: opgewekt vermogen in de spanningsregelaar [Watt]; spanning op de ingangspin [Volt]; spanning op de uitgangspin [Volt]; stroom door de spanningsregelaar [Ampère]. 1.3.2.4 Spanningsstabilisatie Zenerdiode Een zenerdiode is een diode met de speciale eigenschap dat deze een spanning kan stabiliseren. In volgende figuur ziet men de karakteristiek van een zenerdiode: Figuur 18: Karakteristiek van een zenerdiode In het eerste kwadrant van de grafiek ziet men dat de zenerdiode zich gedraagt als een normale diode. Er zal een (bijna constante) spanning van ongeveer 0,7 Volt over de zenerdiode staan wanneer ze in doorlaat wordt aangesloten. 6 Dit is een benadering, er wordt geen rekening gehouden met de opgenomen stroom van de spanningsregelaar zelf. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 20 Als we ze in sper aansluiten zal er, in tegenstelling tot een gewone diode waar geen stroom zal lopen, over de zenerdiode constante spanning (= Uz) komen te staan, er zal ook een stroom door de zenerdiode lopen. Dit laatste zou bij een normale diode vernietigend werken; de stroom door de zenerdiode moet wel beperkt worden. We zien in bovenstaande grafiek dat eens er een inverse stroom door de zenerdiode loopt een negatieve spanning over de diode zal komen te staan; wordt de stroom gelijk of hoger dan de doorslagspanning dan zal de spanning over de diode zich op een bepaald punt stabiliseren. Dit punt noemen we de zenerspanning. Spanningsstabilisatie met zenerdiode Het basisschema voor zenerstabilisatie is hieronder weergegeven. Figuur 19: Basisschema zenerstabilisatie De schakeling vormt eigenlijk een soort spanningsdeler waarbij er over de zenerspanning een vaste spanning komt te staan. De weerstand zal de rest van de spanning nemen en op die manier de stroom door de zenerdiode begrenzen. Indien we een te grote belasting aansluiten zal de uitgangsspanning wijzigen, hiervoor dient dus een oplossing gevonden te worden. We breiden het schema daarvoor uit met een transistor: Figuur 20: Uitbreiding op basisschema De basis-emitterspanning van de transistor is ongeveer gelijk aan 0,7 Volt, als we op de basis de zenerspanning aansluiten zal op de emitter een spanning staan die 0,7 Volt lager is dan de zenerspanning. Hierop kan dan een belasting RL aangesloten worden. Er zal een spanning Uin – Uuit over de transistor komen te staan en er zal een stroom IL door de transistor lopen. De transistor zal dus 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 21 een vermogen weg te werken hebben dat evenredig is met de grootte van de ingangsspanning en de stroom door de belasting. Figuur 21: Vereenvoudigde voorstelling van een 78xx IC In bovenstaande figuur ziet men een vereenvoudigde voorstelling van het inwendige schema van een 78xx IC. Weerstand R2 en diode D1 vormen het basisschema van de zenerstabilisatie. Stel dat Uuit stijgt, dan zal via de spanningsdeler (R3 en R4) Ub2 ook stijgen waardoor T2 meer in doorlaat gaat. Hierdoor zal er meer stroom door R1 lopen waardoor UR1 stijgt. Aangezien Uin een vast potentiaal is zal Ub1 dalen waardoor T1 meer in sper gaat. Hierdoor zal Uuit dalen. Als Uuit daalt dan zal Ub2 dalen waardoor T2 meer in sper gaat. Dit heeft als gevolg dat de stroom door R1 zal dalen waardoor UR1 daalt. Dit zal er voor zorgen dat Ub1 stijgt en T1 meer in doorlaat gaat wat er dan weer voor zorgt dat Uuit stijgt. Wordt Iuit te groot dan zal UR5 groter worden dan 0,7 volt. Hierdoor zal T2 meer in doorlaat gaan waardoor de stroom door R1 en de spanning over UR1 stijgt. Dit zal zorgen voor een daling van Ub1, T1 zal meer in sper gaan waardoor de uitgangsspanning afneemt. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 22 1.3.2.5 Eigenschappen Een 7805-IC bevat een: stroombegrenzing; temperatuurbegrenzing. Zo zal hij uitschakelen als de opgenomen stroom meer dan 1 Ampère bedraagt of als hij warmer wordt dan 150°C. Dit heeft als voordeel dat het IC niet beschadigd raakt als er te veel stroom genomen wordt; het IC laten afkoelen of de belasting wegnemen zal er voor zorgen dat de spanningsregelaar terug ingeschakeld wordt. De aangelegde voedingsspanning mag maximaal 35 Volt bedragen en moet minimaal 8 Volt zijn. Deze uitgangsspanning ligt tussen 4,8 Volt en 5,2 Volt, de uitgangsspanning zal echter wel stabiel zijn, zo zal deze niet gaan schommelen tussen de twee uiterste waarden. Het IC verbruikt zelf echter wel 6 milliampère; deze stroom wordt dus ook gevraagd aan het voedende net, in dit geval de adapter, indien er geen belasting is aangesloten. Dit maakt de 7805 ongeschikt voor batterij gevoede schakelingen. 1.4 Display 1.4.1 Algemeen In dit eindwerk wordt de display gebruikt voor het zichtbaar te maken van de tijd en datum. De display wordt aangestuurd vanuit de microcontroller. De display kan 2 rijen van elk 16 karakters tonen, dit zijn dus in totaal 32 karakters. Elk karakter wordt opgebouwd uit 8 keer 5 pixels, 1 display bestaat dus uit maar liefst 1280 pixels. Het zou onmogelijk zijn om de microcontroller deze pixels aan te laten sturen en tegelijk het rekenwerk voor de datum en tijd te laten doen. Daarom wordt er gebruik gemaakt van een controller die de aansturing van de display op zich neemt. De microcontroller kan door middel van instructies die hij doorstuurt naar de controller, de tekst op de display wijzigen. In dit geval wordt de HD44780-controller gebruikt. De controller en de display zitten samen op 1 print, deze print is volledig klaargemaakt gekocht, het zou ook onmogelijk zijn om dit zelf te maken. Figuur 22: Karakter A 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 23 Het meest gebruikte type display voor schakelingen met microcontrollers is een LCD7, welke te herkennen is aan de typisch groene achtergrond en zwart-grijze letters. Men vindt ze ook terug in fax- en kopieerapparaten, rekenmachines,… Er zijn uitvoeringen met en zonder achtergrondverlichting. Verder zijn er ook PLED8-displays, OLED9-displays en nog enkele minder frequent gebruikte types. Het type display dat in dit eindwerk gebruikt wordt is een PLED, dit type is heel energiezuinig, het vraagt slechts enkele milliampères (of minder) in vergelijking met een LC-Display dat met achtergrondverlichting al direct meer dan 100 milliampère vraagt. Figuur 23: Foto van het gebruikte PLED-display Ook heeft een PLED-display een moderner en aangenamer uitzicht en is hij in verschillende kleuren leverbaar. Hij kan ook van op verdere afstand gelezen worden. 7 Liquid Crystal Display: Er wordt gebruik gemaakt van vloeibare kristalen waar spanning opgezet wordt. 8 Polymer Light Emitting Diodes: Er wordt gebruik gemaakt van oplichtende LED’s. 9 Organic Light- Emitting Diode 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 24 1.4.2 Aansluitpinnen De display bevat 16 aansluitpinnen, namelijk: Pinnummer 14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15 Functie DB7, Data bus line DB6, Data bus line DB5, Data bus line DB4, Data bus line DB3, Data bus line DB2, Data bus line DB1, Data bus line DB0, Data bus line E, Enable R/W H/L Read/Write RS H/L Function Select V0, Contrast Adjustment Vdd, + 5 V Vss, Ground, 0 V No connection No connection Tabel 5: Aansluitpinnen display De volgorde van deze pinnen is standaard bij HD44780-compatibele displays. Op pin 1 en pin 2 wordt de 5 Volt voeding aangesloten. Op pin 3 moet een spanning tussen 0 en 5 Volt aangelegd worden. Bij LCDisplays regelt deze spanning het contrast, bij PLED-displays regelt deze spanning de helderheid. Pin 3 wordt dan ook meestal aangesloten op de loper van een potentiometer, de andere 2 pinnen van de potentiometer worden aan de massa en de voedingsspanning gehangen. Zo kan de spanning, en dus ook de helderheid, mooi geregeld worden tussen het minimum en het maximum. Met pin 4 kan er geselecteerd worden welk register van de HD44780controller actief is, namelijk het Instructie Register (IR) of het Data Register (DR). Pin 5 wordt gebruikt om te kunnen kiezen of er geschreven wordt naar de display of van de display wordt uitgelezen. Als er 5 Volt op deze pin staat kan de display uitgelezen worden, is deze pin verbonden met de 0 Volt dan kan er geschreven worden naar de display. De display hoeft in dit eindwerk niet uitgelezen te worden dus wordt deze pin met de 0 Volt verbonden. Pin 6 is de Enable pin. Is deze pin laag, dus verbonden met de 0 Volt, dan kan er naar de display geschreven of van de display gelezen worden. Is deze pin logisch hoog dan reageert de display op wat er aan zijn andere ingangen gebeurt. Dit maakt het mogelijk om meerdere displays, of andere componenten, aan te sluiten op dezelfde datalijnen. Pin 7 tot 14 is de databus, ze bestaat uit 8 datalijnen. Deze bus wordt gebruikt om data of instructies door te geven aan de display. Soms kan het gebeuren dat er te weinig vrije pinnen op een microcontroller aanwezig zijn om een 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 25 display aan te sluiten. Daarom kan de HD44780-controller ook werken in 4 bits-modus; dit wil zeggen dat er slechts 4 van de 8 datalijnen gebruikt worden. In dit eindwerk wordt er gebruik gemaakt van deze 4 bits-modus, hiervoor worden pin 11 tot 13 (DB4 tot DB7) aangesloten op de microcontroller, pin 7 tot 10 (DB0 tot DB3) moeten in dit geval niet aangesloten worden want de controller bevat interne pull-up weerstanden. De twee laatste pinnen, pin 15 en 16, zijn ook voorzien op de gebruikte display maar worden niet gebruikt; bij LC-Displays worden deze gebruikt voor achtergrondverlichting, als deze tenminste aanwezig is. Op sommige displays worden deze 2 aansluitingen achterwege gelaten. Voor pin 15 en 16 zijn er geen vaste regels. 1.4.3 HD44780 Er wordt, zoals hierboven vermeld, gebruik gemaakt van een HD44780-compatibel display. Het HD44780 is een displaycontroller van Hitachi, een kloon van deze IC is de KS0066 van het merk SEC, welke volledig identiek werkt. Figuur 24: HD44780A00 De HD44780 kan displays van verschillende groottes aansturen; zo zijn er displays van: 1 rij van 8 karakters; 1 rij van 16 karakters; 2 rijen van elk 8 karakters; 2 rijen van elk 16 karakters; 2 rijen van elk 20 karakters; 2 rijen van elk 40 karakters; 4 rijen van elk 20 karakters; … Ook kan de controller displays aansturen waar 1 karakter 5 x 7 pixels is, of 5 x 10. De display die hier gebruikt wordt is 2 rijen hoog en 16 karakters breed, en 1 karakter is 5 x 7 pixels. Van de HD44780 bestaan er enkele uitvoeringen, de mestvoorkomende is de HD44780A00, de Japanse versie. Ook bestaat er een type HD44780A02 welke een Europese versie is. Het verschil zit erin dat de Europese versie ook tekens zoals ç, è, é, ê, ë, ù, ú, û en ü kan laten zien op het display. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 26 De controller zal ervoor zorgen dat op elk moment de juiste pixels oplichten. De microcontroller hoeft enkel te zeggen welke tekst waar op de display moet komen, dit gebeurt door middel van enkele instructies. Deze instructies worden ingegeven via 14 aansluitpinnen. 1.4.3.1 Display Data Random Acces Memory (DDRAM) De HD44780 maakt gebruik van het DDRAM, in dit geheugen staat welk karakter op welke plaats op de display staat, het karakter wordt opgeslagen onder de vorm van één byte ofwel 8 bits. Figuur 25: DDRAM-geheugenplaatsen Zo zal in geheugenplaats 0 af te lezen zijn welk karakter er op de eerste plaats van de eerste rij op de display komt. Geheugenplaats 64 staat voor de eerste plaats op de tweede rij. Ook in de geheugenplaatsen 16 tot 39 en 80 tot 103 kunnen karakters geplaatst worden. Deze laatste geheugenplaatsen zijn niet zichtbaar bij het gebruikte type display. Maar bij grotere displays, zoals een 4 x 20 display, zijn deze geheugenplaatsen wel zichtbaar. Dan zal geheugenplaats 16 het eerste karakter van rij 2 vormen en geheugenplaats 80 het eerste karakter van rij 4. Bij een 2 x 16 display kunnen deze geheugenplaatsen echter wel gebruikt worden, er bestaat namelijk een instructie waarbij alle geheugenplaatsen één plaats opgeschoven kunnen worden, zo kan men het karakter van geheugenplaats 16 laten zien op de plaats van geheugenplaats 16. De HD44780 maakt ook gebruik van een cursor, hiermee wordt de actieve geheugenplaats bedoeld. Voor het schrijven van een karakter aan het begin van de tweede lijn dient men de cursor de waarde 64 toe te kennen en vervolgens de data door te sturen. 1.4.3.2 Character Generator Read Only Memory (CGROM) In het DDRAM staat in elke geheugenplaats een byte, deze byte verwijst naar een bepaald karakter. Zoals eerder gezegd is elk karakter opgebouwd uit 5 x 8 pixels. Om te weten welke van deze 40 pixels moeten oplichten bij bijvoorbeeld het karakter “A”, wordt er gebruik gemaakt van het CGROM; hierin staat welke pixels moeten oplichten voor elk karakter. In volgende twee figuren ziet men de CGROM van de Japanse HD44780A00 en de Europese HD44780A02. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC Figuur 26: CGROM van een HD44780A00 27 Figuur 27: CGROM van een HD44780A02 De tabellen zijn voor het grootste deel opgebouwd volgens de ASCII-code10. Zo zal geheugenplaats (65)10 = (0100 0001)2, de hoofdletter “A” bevatten. Dit is bij beide types van de HD44780 hetzelfde, maar geheugenplaats 126 zal bij de Japanse versie een pijl “→” bevatten, terwijl dit in de Europese versie een tilde “~” is. De eerste 8 plaatsen van het CGROM kunnen door de gebruiker zelf beschreven worden, daarom wordt dit deel van het CGROM het CGRAM genoemd. In deze 8 plaatsen kunnen er dan zelfgemaakte karakters geplaatst worden. Stel dat men het onderstaande karakter in het CGRAM wil plaatsen: Figuur 28: CGRAM opbouw karakter 10 American Standard Code for Information Interchange: Amerikaanse standaard waarbij aan elk karakter een eigen nummer is toegekend. Wordt gebruikt bij onder andere computers. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 28 Men dient dit karakter dan uit te schrijven in 5 verschillende bytes, namelijk: Byte 0: (00010101)2 Byte 1: (00010110)2 Byte 2: (01111100)2 Byte 3: (00010110)2 Byte 4: (00010101)2 Deze 5 bytes moeten dan met een instructie in het CGRAM geplaatst worden. Om dit laatste te vergemakkelijken wordt er gebruik gemaakt van een zelf geschreven programma. Figuur 29: Programma om zelfgemaakte karakters te ontwerpen 1.4.3.3 Instructies Om bepaalde instructies uit te voeren op de display moet men de datalijnen op een bepaalde manier hoog en laag maken, elke instructie heeft zijn eigen combinatie. De volgende lijst geeft de instructies die gebruikt kunnen worden in de schakeling. De controller kent meer instructies dan er opgesomd zijn maar voor die instructies dient men R/W 1 te maken en dit is onmogelijk gemaakt in de schakeling want de R/W-lijn is met de 0 Volt verbonden. Alle instructies waarvoor de R/W-lijn hoog gemaakt moet worden, zijn instructies die de display uitlezen en van deze functie wordt geen gebruik gemaakt. Clear Display Maakt de volledige display leeg en zet de cursor op positie 0. Instructie Clear Display 6EE RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 Van Hoylandt Roel DB3 0 DB2 0 DB1 0 DB0 1 2007-2008 DCF77 klok met PIC µC 29 Return home Zet de cursor op positie 0 en maakt alle schuif acties ongedaan. Instructie Return home RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 DB3 0 DB2 0 DB1 1 DB0 x Entry mode set Stelt in, in welke richting de cursor beweegt na het schrijven van data naar het display en of het schuiven ingeschakeld is. Instructie Entry mode set RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 DB3 0 DB2 0 DB1 I/D DB0 S I/D=0: cursor telt af I/D=1: cursor telt op S = 0: schuiven niet toegestaan S = 1: schuiven toegestaan Display on/off control Zet de hele display, cursoraanduiding (lijn) of pinkende cursoraanduiding (blok) aan of uit. Figuur 30: Beide types van cursoraanduiding Instructie Display on/off control RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 DB3 1 DB2 D DB1 C DB0 B D = 0: Display uit D = 1: Display aan C = 0: Cursoraanduiding (lijn) uit C = 1: Cursoraanduiding (lijn) aan B = 0: Cursoraanduiding (blok) uit B = 1: Cursoraanduiding (blok) aan 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 30 Cursor or display shift Verplaatst de cursor en schuift display naar links of rechts. Instructie Cursor or display shift S/C = 0: S/C = 1: R/L = 0: R/L = 1: RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 1 DB3 S/C DB2 R/L DB1 x DB0 x Verplaats cursor Schuif display Schuif naar links Schuif naar rechts Function set Stelt in of er met 8- of 4-bits communicatie wordt gewerkt, uit hoeveel lijnen de display bestaat en uit hoeveel pixels 1 karakter bestaat. Instructie Function set RS 0 R/W 0 DB7 0 DB6 0 DB5 1 DB4 DL DB3 N DB2 F DB1 x DB0 x DL=0: 4 bits communicatie DL=1: 8 bits communicatie N = 0: Display met 1 lijn N = 1: Display met 2 lijnen F = 0: Karakters opgebouwd uit 5 x 8 pixels F = 1: Karakters opgebouwd uit 5 x 10 pixels Set CGRAM address Stelt het CGRAM-adres in, de CGRAM-data moet verzonden worden na deze instructie. Instructie Set CGRAM address RS 0 R/W 0 DB7 0 DB6 1 DB5 ACG DB4 ACG DB3 ACG DB2 ACG DB1 ACG DB0 ACG ACG: CGRAM-adres 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 31 Set DDRAM address Stelt het DDRAM-adres in, de DDRAM-data moet verzonden worden na deze instructie. Instructie Set DDRAM address RS 0 R/W 0 DB7 1 DB6 ADD DB5 ADD DB4 ADD DB3 ADD DB2 ADD DB1 ADD DB0 ADD ADD: DDRAM adres Write data to CGRAM or DDRAM Schrijft data in het GGRAM of DDRAM, hiervoor moet eerst het CGRAM of DDRAM adres ingesteld worden. Na deze instructie wordt de cursorpositie met 1 opgehoogd/afgeteld. Instructie Write data to CGRAM or DDRAM RS 0 R/W 0 DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0 D7-D0: Te verzenden byte (data) 1.4.3.4 Protocol Om de bovenstaande instructies te verzenden, wordt er gebruik gemaakt van een protocol. De display kan werken met 2 types van protocol, 1 waarbij gebruik gemaakt wordt van een 8-bitsdatabus en 1 waarbij gebruik gemaakt wordt van een 4-bits databus. Er wordt in dit geval gebruik gemaakt van de 4-bits databus. Figuur 31: 4 bits protocol 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 32 Om via een 4-bits brede databus een byte te verzenden moet de byte opgesplitst worden in 2 delen van elk 4 bits groot. Eerst worden de 4 hoogste bits verzonden en vervolgens de 4 laagste bits. Voordat de bits worden verzonden, moet de enable lijn hoog gemaakt worden. Als er een instructie wordt verzonden, moet de RS-lijn laag gemaakt worden; als er data wordt verzonden moet de RS-lijn hoog gemaakt worden. De R/W-lijn blijft in dit geval altijd laag want er wordt niet gelezen van de display. 1.4.3.5 Opstarten van display Bij het opstarten van de display moeten enkele dingen gebeuren zoals de controller vertellen met welk type display hij werkt. Het opstarten bestaat uit volgende stappen: Zet de voedingsspanning op de display. Wacht een tijd om de controller zichzelf te laten resetten. Maak de RS-lijn laag zodat de controller weet dat de volgende ontvangen data instructies zijn. Vertel de controller dat er gewerkt wordt met een 4 bits brede databus door middel van het verzenden van de “Function Set”-instructie. Geef de controller de tijd om de instructie te verwerken. De laatste 2 stappen worden voor de zekerheid nog 2 maal uitgevoerd. De controller moet weten met welk type display hij werkt, daarom wordt de “function set”-instructie nogmaals uitgevoerd maar nu wordt de volgende bijkomende informatie meegezonden: 4-bitscommunicatie, een display met 2 lijnen en de karakters zijn opgebouwd uit 5 x 8 pixels. Maak de display leeg door het verzenden van de instructie “Clear display” Geef de display de tijd om deze instructie te verwerken. Zet de cursor op de positie nul door de instructie “Cursor home” Geef de display de tijd om deze instructie te verwerken. Stel in dat de cursor met 1 moet optellen als er data geschreven is naar de display en er geen gebruik gemaakt wordt van de schuif functie. Dit gebeurt door middel van de “Entry mode set”-instructie Zet de display aan en beide cursoraanduidingen uit met het “Display on/off control”- instructie. Nadat deze stappen uitgevoerd zijn, is de display klaar voor verder gebruik. 1.4.3.6 Tekst schrijven op het display Om tekst te schrijven naar de display moet er gebruik gemaakt worden van de instructie “Write data to CGRAM or DDRAM”. Om de controller te laten weten op welke plaats van de display de tekst moet komen moet eerst het juiste adres van het DDRAM actief gemaakt worden, dit gebeurd door het uitvoeren van de instructie “Set DDRAM address”. Stel dat we de tekst “DCF” aan het begin van de tweede regel van de display willen schrijven. Hiervoor dient men volgende stappen te doen. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 33 Voor de instructie “Set DDRAM address” met adres (64)10 = (0100 0000)2 uit. Geef de controller de tijd om deze instructie te verzenden. Voor de instructie “Write data to CGRAM or DDRAM” met data “D” = (68)10 = (0100 0100)2 uit. Geef de controller de tijd om de instructie uit te voeren. Aangezien de cursor automatisch met “1” wordt opgehoogd na het schrijven van data moet er nu geen DDRAM-adres ingesteld worden, voor dus de instructie” Write data to CGRAM or DDRAM” met data “C” = (67)10 = (0100 0011)2 uit. Geef de controller de tijd om de instructie uit te voeren. Voor de instructie “Write data to CGRAM or DDRAM” met data “F” = (70)10 = (0100 0110)2 uit. Geef de controller de tijd om de instructie uit te voeren. De tekst “DCF” zal nu af te lezen zijn op de display en zal daar blijven staan totdat een andere instructie de tekst zal veranderen of verwijderen. 1.5 PIC Microcontroller 1.5.1 Algemeen Een microcontroller kan het best omschreven worden als een minicomputer. Hij steunt op dezelfde vier basispijlers van een computer, namelijk: invoer; geheugen; verwerking; uitvoer. De eerste geïntegreerde circuits (IC's) zijn ontworpen om één van deze basisfuncties (gedeeltelijk) te realiseren. Omdat geheugens een regelmatige opbouw hebben werden het eerst geheugen IC’s ontworpen. De volgende functie die in IC’s werd ingebouwd was de processor11 die de verwerking voor zijn rekening neemt. Wordt deze processor ondergebracht in één IC dan noemt men dit een microprocessor. Brengt men nu de invoer-, uitvoer-, geheugen- en verwerkingsfunctie onder in één IC dan heeft men te maken met een microcontroller. Omdat alles al in één enkele behuizing is ondergebracht kan de print rondom de microcontroller relatief klein blijven, er zijn weinig extra randcomponenten nodig om de microcontroller te laten werken. Dit heeft tot gevolg dat schakelingen met microcontrollers goedkoop kunnen blijven. In een microcontroller kan men een programma programmeren. Als men de microcontroller start zal deze vervolgens het programma beginnen uitvoeren. Het programma kan door de productontwikkelaar zelf geschreven worden, dit heeft als voordeel dat als men een volledige andere schakeling heeft men toch hetzelfde type 11 Wordt ook wel Centrale Verwerkings Eenheid (CVE) of Central Processing Unit (CPU) genoemd 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 34 van IC kan gebruiken. Als men geen microcontroller zou gebruiken, dan zou de productontwikkelaar op zoek moeten gaan naar andere types IC’s. Hij zou dan van elk van deze IC’s de datasheet moeten lezen, wat een tijdrovend werk is. Afhankelijk van het type microcontroller kan men het programma éénmalig of meermaals (her)programmeren. Types waar men kan herprogrammeren zijn goed voor prototypes waar het programma nog niet volledig op punt staat. Types die éénmalig geprogrammeerd kunnen worden zijn meestal goedkoper en worden gebruikt bij massaproductie. Eén van de grootste voordelen van microcontrollers is hun flexibiliteit. Microcontroller wordt in de rest van dit dossier afgekort tot µC. 1.5.2 PIC-µC’s Het gebruikte type µC is een PIC-µC. PIC-µC’s zijn populair bij ontwikkelaars en hobbyisten omdat: ze goedkoop zijn; er grote beschikbaarheid is; er veel gebruikers zijn, men vindt dus gemakkelijk hulp bij problemen; er uitgebreide collectie van application notes12 bestaat; er goedkope of gratis development tools13 beschikbaar zijn; er veel ondersteuning te vinden is op het internet, … PIC-µC’s worden enkel gemaakt door de fabrikant Microchip. Figuur 32: Logo Microchip 12 13 Application notes: Document waarin een bepaalde toepassing wordt uitgelegd Development tools: Programma’s die het ontwikkelen van software vergemakkelijken 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 35 De afkorting PIC stond oorspronkelijk voor “Programmable Interface Controller” maar deze afkorting is achteraf aangepast tot “Programmable Intelligent Computer”, soms komt men ook wel eens de afkorting “Peripheral Interface Controller” tegen. PIC-µC’s zijn opgebouwd volgens de Harvard-architectuur, dit wil zeggen dat er gebruik gemaakt wordt van gescheiden bussen en adresruimtes voor data en instructies. Dit resulteert in een snellere processor omdat het ophalen van de volgende instructie en het wegschrijven van het resultaat van de laatste instructie gelijktijdig kan gebeuren. Ook wordt er opslagruimte uitgespaard, daar data- en instructiegeheugens niet dezelfde woordbreedte hoeven te hebben. De architectuur van een PIC-µC is minimalistisch. Hij heeft de volgende eigenschappen: afzonderlijke code- en gegevensplaatsen (Harvard architectuur); een klein aantal instructies met vaste lengte; de meeste instructies duren één cyclus; één enkele accumulator (W); alle RAM locaties fungeren als registers, zowel als bron en/of als bestemming van mathematische en andere functies; hardware stack voor het opslaan van adressen wanneer teruggekeerd moet worden; een kleine hoeveelheid adresseerbare gegevensruimte (typisch 256 bytes), die wordt uitgebreid door “banking”. In tegenstelling tot het meeste andere µC, is er geen onderscheid tussen "geheugen" en "register" omdat het RAM zowel werkt als geheugen en als registers. PIC-µC’s bevatten een RISC (Reduced Instruction Set Computer) processor, dit is een processor die werkt met een kleine set simpele basisinstructies14. De CISC (Complex Instruction Set Computer) processoren werken met een relatief omvangrijke set complexe instructies. Een RISC-processor is simpeler van opbouw omdat hij minder schakelingen bevat. Dit heeft als gevolg dat hij veel kleiner te maken is. Om een moeilijke bewerking te doen moet een RISC-processor veel meer instructies uitvoeren dan een CISC-processor, dit wordt gecompenseerd door een hogere verwerkingssnelheid bij de RISC-processoren. In de praktijk liggen de verwerkingssnelheden niet ver uit elkaar. Het belangrijkste verschil is het energieverbruik, waarbij de RISC processoren winnen van de CISC-processoren. 1.5.3 16F648A De gebruikte µC is van het type 16F648A, dit is de uitgebreide versie van de 16F628A. Het enige verschil (op enkele minieme uitzonderingen na) is de grote van het programmageheugen. Dit is bij de 16F628A twee kilobyte groot terwijl dit bij de 16F648A vier kilobyte groot is. Er is ook nog een 16F627A die slechts 1 kilobyte geheugen heeft. In de rest van dit eindwerk wordt er vanuit gegaan dat er gewerkt wordt met de 16F628A omdat deze het meeste gebruikt wordt. 14 Bij het gebruikte type microcontroller in de eindwerk zijn dit er 35 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 36 Figuur 33: Foto van de 16F628A De 16F628A heeft volgende eigenschappen: elke pin kan maximum 25 mA binnennemen (sinken); elke pin kan maximum 20 mA leveren (sourcen); in-circuit serial programming (ISCP) ondersteuning; power-on Reset (POR); power-up Timer (PWRT); oscillator Start-up Timer (OST); watchdog Timer (WDT); code-protection; energiezuinige slaapstand (Sleep-mode); hardware stack van 8 adressen diep; twee poorten (A & B), elk 8 bits breed; 16 inputs/outputs; interne oscillator van 4 MHz (+/- 1 %) en 37 kHz; in en uitschakelbare pull-up weerstanden voor poort B; low voltage programming; twee analoge comparatoren; programeerbare referentie-spannings-module voor de comparatoren; TMR0 8-bit timer/counter met 8-bit programmeerbare prescaler; TMR1 16-bit timer/counter met externe crystal/clock mogelijkheid; TMR2 8-bit timer/counter met 8-bit period register met prescaler and postscaler; 16 bit Capture/Compare en 10 bit PWM module; USART en SCI communicatie; 100 000 wis/schrijf cyclussen op Flash programma geheugen; bevat een EEPROM geheugen voor het opslagen van data; 1 000 000 wis/schrijf cyclussen op EEPROM geheugen; EEPROM kan data meer dan 100 jaar vasthouden; werkt op een voedingsspanning tussen de 3,0 en 5,5 Volt. 1.5.4 Blokschema Volgende figuur toont het blokschema van de hardware van een 16F628A. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 37 Figuur 34: Blokschema van de 16F628A Program counter De program counter (PC) is een 13-bits breed register15 dat telt van (0 0000 0000 0000)2 = (0)10 tot (1 1111 1111 1111)2 = (8191)10. Hij bevat het nummer van de instructie die uitgevoerd wordt. Bij het opstarten of resetten van de µC wordt de PC op 0 gezet. Nadat er een instructie is opgehaald wordt de PC met 1 opgehoogd. 15 Een register is een geheugenplaats die 8 (of meer) bits kan opslagen, een register kan beschreven en uitgelezen worden. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 38 Flash Program Memory In dit geheugen wordt het programma opgeslagen. De program counter “vertelt” aan het Flash Program Memory welke instructie uitgevoerd moet worden. Het Flash Program Memory zal vervolgens deze instructie ophalen en doorsturen naar het Instruction Register. Het voordeel van Flash geheugen is dat dit elektrisch geschreven en gewist kan worden. Het programma kan dus achteraf gewijzigd worden, dit in tegenstelling tot µC’s met een ROM geheugen dat slechts éénmalig beschreven kan worden. Instruction Register Het instruction register is een register dat de instructie die wordt uitgevoerd, “vasthoudt” terwijl deze wordt gedecodeerd, klaargemaakt en uitgevoerd. Instruction Decode & Control Dit onderdeel decodeert de ontvangen instructies en stuurt, afhankelijk van de ontvangen instructie, de andere blokken van de µC aan. Timing Generation Genereert een klokimpuls voor de rest van de µC, aan de hand van een extern kristal, RC-keten, klokimpuls of door het gebruiken van één van de twee interne oscillatoren (RC-ketens) die werken op een frequentie van 48 kHz of 4 MHz. 8-level stack De stack in de gebruikte µC kan maximaal 8 adressen opslagen. Een stack werkt als een LIFO16-register, het adres dat het laatst werd opgeslagen wordt er het eerst terug uitgehaald. Net zoals bij een stapel borden, het bord dat er het laatst wordt opgezet wordt er ook het eerst terug afgehaald. Figuur 35: Voorstelling Stack 16 LIFO: Lirst in, first out 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 39 Een CALL-instructie, welke een subroutine start, kopieert de met één opgehoogde inhoud van de program counter naar de stack, dit adres ligt nu bovenop. Nadat de subroutine afgelopen is wordt de programmateller met de inhoud van het bovenste adres van de stack geladen. Er wordt nu verdergegaan waar het programma onderbroken was. RAM file registers Het RAM file register bevat geheugenplaatsen die beschreven kunnen worden vanuit het programma, men kan het RAM-geheugen dus gebruiken voor het opslagen van tussenuitkomsten. In het RAM-geheugen zijn er ook registers die een bepaalde functie hebben, deze registers worden Special Function Registers genoemd. Zo is er bijvoorbeeld het RCREG-register, waar de ontvangen data van de USART-module in komt te staan. De registers in het RAM-geheugen zijn overschrijfbaar, vanuit het programma. Addr Mux De addr mux (adres multiplexer) is een soort schakelaar die kiest waarvan het adres voor het RAM file register vandaan moet komen, van het instructie register, of van het FSR-register. FSR reg (File Select Register) Het FSR kan dienen als een index register in het RAM-geheugen. Het gebruikt als er gewerkt wordt met indirecte adressering. wordt Status reg Het status register vertelt welke bank van het RAM-geheugen actief is, er een watchdog error is, de µC in SLEEP-mode staat. Ook geeft hij aan of de uitkomst van een logische/wiskunde bewerking van het ALU, een nul uitkomt, een carry heeft en of de laagste 4 bits van de uitkomst een carry hebben. MUX Deze multiplexer geeft het juiste binaire getal door aan de ALU, dit getal kan afkomstig zijn van de databus of van het instructie register. ALU De Arithmetic Logic Unit (ALU) of Centrale Verwerkings Eenheid (CVE) is het belangrijkste onderdeel van de µC, hij voert de rekenkundige (arithmetic) en logische (logic) bewerkingen voert. Enkele bewerkingen die de ALU kan uitvoeren zijn, optellen, logische vergelijkingen zoals AND en OR, … 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 40 W reg De uitkomst van de bewerking van de ALU wordt opgeslagen in de accumulator of Work register (W reg), deze biedt de uitkomst vervolgens terug aan aan de ALU zodat er terug bewerkingen op kunnen worden uitgevoerd. Port A & B Dit zijn de uitgangen/ingangen van de µC. Zijn de poorten ingesteld als uitgang, dan kan men door een byte in deze registers te plaatsen de aansluitpinnen van toestand wijzigen. Zijn de poorten ingesteld als ingang dan kan men door de registers uit te lezen de toestand van de aansluitpinnen opvragen. Comparator, Timer 0,1 & 2, Vref, CCP1, USART, Data EEPROM Dit zijn extra modules die in de µC zijn ingebouwd, buiten Timer 0 worden er geen van deze modules gebruikt in dit eindwerk. Voor verdere informatie over deze modules wordt er verwezen naar de datasheet. Timer 0 komt later in dit dossier wel aan bod. Power up timer Deze interne timer zorgt voor een vertraging van 72 milliseconde na het aanzetten van de voeding. Hierdoor kan voedingsspanning van de PIC stabiliseren na het aanzetten van de voeding, pas daarna wordt het reset signaal opgeheven. Deze instelling wordt aan of uit gezet bij het programmeren. Oscillator start-up timer Oscillator start-up timer zorgt ervoor dat het programma pas start na 1024 cycli’s van de oscillator zodat deze tijd heeft om stabiel te worden. Deze instelling wordt aan of uit gezet bij het programmeren. Power on reset De power on reset laat de gehele µC resetten bij het inschakelen van de voedingsspanning. Deze instelling wordt aan of uit gezet bij het programmeren. Watchdog timer Het is mogelijk om een onafhankelijke timer te gebruiken om de PIC te laten resetten als de software vast loopt. Dit is de watchdog timer. Deze wordt niet gebruikt in dit eindwerk. Deze instelling wordt aan of uit gezet bij het programmeren. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 41 Brown-out reset Als de brown-out reset actief is wordt de PIC gereset indien de voedingsspanning tijdelijk onder het vereiste niveau komt zodat een onzekere werking wordt vermeden. Deze instelling wordt aan of uit gezet bij het programmeren. Low voltage programming Low voltage programming of LVP is een instelling die het mogelijk maakt om te programmeren met een lage spanning via de aansluiting RB4 in plaatst van de Master Clear aansluiting. Deze instelling wordt aan of uit gezet bij het programmeren. 1.5.5 Instructies De gebruikte µC heeft een instructieset die 35 instructies bevat. Deze instructies zijn bijvoorbeeld: optellen van de accumulator (W) en een register (f); wis een register; tel één bij een register op, is de uitkomst 0, sla de volgende instructie over; schrijf de accumulator in een register; doe 1 instructie lang niets; roep een subroutine op; … We nemen als voorbeeld de instructie ADDWF. De syntax voor deze instructie is: ADDWF f,d Deze instructie telt de inhoud van de accumulator (W) op bij de inhoud van register f. Als d 0 is wordt de uitkomst weggeschreven naar het W register, is de waarde van d gelijk aan 1 dan wordt de uitkomst weggeschreven naar het register f. Elke instructie van het programma wordt opgeslagen onder de vorm van een 14-bits code in het RAM-register. Elke instructie heeft zijn eigen codeformaat, onderstaande figuur toont de code van de ADDW f,d instructie. Figuur 36: code ADDWF De eerste 6 bytes noemt men de opcode van de instructie, de volgende 8 bytes bevat de parameters van de instructie, in dit geval d en f. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 42 Alle instructies kunnen opgedeeld worden in 4 types die elk hun eigen codeformaat hebben. Byte-oriented file register operations Deze instructies voeren bewerkingen uit op gehele registers, ze werken dus met gehele bytes. Onderstaande figuur toont het codeformaat van de instructies: Figuur 37: Codeformaat byte-oriented file register operations De eerste 6 bits tonen aan welke instructie het is. Bit 7 vertelt in waar de uitkomst van de bewerking geschreven moet worden. Bit 6 tot 0 bevat het adres van het register waarmee gewerkt wordt. Voorbeelden van dit type instructies zijn, ADDWF, CLRF, INCF, MOVF, MOVWF, … Bit-oriented file register operations Deze instructie’s voeren bewerkingen uit op een bit uit een bepaald register. In onderstaande figuur staat het codeformaat van dit type instructie’s: Figuur 38: Codeformaat bit-oriented file register operations De eerste 4 bits tonen, net zoals bij het vorige type, aan met welke instructie er gewerkt wordt. De volgende 3 bits vertelen met welk bitnummer er gewerkt wordt en de laatste 7 bits geven het gebruikte register aan. Voorbeelden van dit type instructies zijn, BCF, BTFSC, … Literal and control operations Dit type instructies kan men opdelen in twee groepen, namelijk de general instructions (algemene instructies) en de CALL en GOTO instructies. General instructions Deze instructies voeren bewerkingen uit tussen een bepaald getal en het W reg of voeren bewerkingen uit op een bepaald register. Volgende figuur toont het codeformaat van dit type instructies: 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 43 Figuur 39: Codeformaat general instructions De eerste 6 bits vertellen met welke instructie men te maken heeft. De volgende 8 bits tonen taan met welk register er gewerkt wordt. Voorbeelden van dit type instructies zijn: ADDLW, IORLW, MOVLW, … CALL en GOTO instructies Deze instructies schrijven een waarde weg naar de program counter. De CALL instructie zal een subroutine oproepen, de GOTO instructie zal ervoor zorgen dat er naar een bepaalde lijn gesprongen wordt. De volgende figuur toont het codeformaat van deze instructies. Figuur 40: Codeformaat call en goto De eerste 3 bits tonen aan met welke instructie er gewerkt wordt. De volgende 10 bits geven het adres op dat in de program counter moet komen te staan. De afkortingen (zoals CLRF, CALL, SLEEP, …) worden mnemonics genoemd. Deze worden, wanneer het programma omgezet wordt, omgevormd tot een code die men de opcode noemt. Het gebruik van mnemonics maakt het programmeren overzichtelijk, anders zou men in plaats van CLRW het getal (00 0001)2 moeten typen. Volgende tabel toont alle instructies doe de gebruikte µC kent. In de tabel staat ook vermeld hoeveel tijd deze instructies innemen. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 44 Figuur 41: Instructieset van de 16F628A 1.5.6 Aansluitpinnen Het IC heeft 18 aansluitpinnen. Elk van deze aansluitpinnen heeft zijn eigen (programeerbare) functie. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 45 Figuur 42: Pinout van de 16F628A Elk van deze 18 pinnen kan men onderverdelen in 3 groepen: voeding; poort A; poort B. 1.5.6.1 Voeding Bij de voeding vinden we 2 pinnen terug, Vss en Vdd. Op de Vss wordt de massa aangesloten, op de Vdd sluit men de positieve voedingsspanning aan. 1.5.6.2 Poort A Bij Poort A vinden we 8 pinnen terug. Elk van deze pinnen heeft een dubbele of driedubbele functie. Zo kan (op RA5 na) elke pin ingesteld worden als input of output. Dit maakt dat elke pin 3 uitgangstoestanden heeft namelijk hoog, laag en hoogohmig. De functie van de pin wordt ingesteld in het programma. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC Pin-naam RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/CMP1 RA4/T0CKI/CMP2 RA5/MCLR/Vpp RA6/OSC2/CLKOUT RA7/OSC1/CLKIN Functie RA0 AN0 RA1 AN1 RA2 AN2 Vref RA3 AN3 CMP1 RA4 T0CKI CMP2 RA5 MCLR VPP RA6 OSC2 CLKOUT RA7 OSC1 CLKIN 46 Omschrijving Input/output Analoge comparator input Input/output Analoge comparator input Input/output Analoge comparator input Vref output Input/output Analoge comparator input Comparator 1 output Input/open collector output TMR0 clock input Comparator 2 output Input Master clear (reset) programming voltage input Input/output Oscilator Crystal output Intruction cycle rate output Input/output Oscilator Crystal output Externe klok input Tabel 6: Pinnen en pinfuncties van poort A 1.5.6.3 Poort B Elke pin van poort B is voorzien van een pull-up weerstand, deze weerstanden kunnen gezamenlijk in en uitgeschakeld worden. Op pinnen RB4 tot RB7 kan er ingesteld worden dat er een interrupt wordt gegenereerd bij het veranderen van de toestand van één van deze pinnen. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC Pin-naam RB0/INT RB1/RX/DT RB2/TX/CK RB3/CCP1 RB4/PGM RB5 RB6/T1OSO/T1CKI/PGC RB7/T1OSI/PGD Functie RB0 INT RB1 RX DT RB2 TX CK RB3 CCP1 RB4 PGM RB5 RB6 T1OSO T1CKI PGC RB7 T1OSI PGD 47 Omschrijving Input/output Externe interrupt ingang Input/output USART receive pin Sycchronous data I/O Input/output USART transmit pin Synchronous clock I/O Input/output Capture/compare/PWM I/0 Input/output LVP (low voltage programming) input Input/output Input/output TMR1 oscillator output TMR1 clock input ICSP programming clock Input/output TMR1 oscillator input ICSP data input/output Tabel 7: Pinnen en pinfucties van poort B 1.5.7 Interrupts Een interrupt, afgeleid van het Latijnse woord voor onderbreking, zorgt ervoor dat er bij een bepaalde gebeurtenis of voorwaarde er automatisch naar een bepaald stuk programmacode wordt gesprongen. Zo hoeft er in het hoofdprogramma geen processortijd verspilt worden aan het controleren of de gebeurtenis voorgekomen of voorwaarde voorvoldaan is. Door het goed gebruiken van interrupts kan een programma veel sneller werken dan een programma dat hetzelfde doet zonder interrupts. Een interrupt is dus een zeer handige en krachtige tool. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC Normaal programma verloop Start 48 Programma verloop met interrupt Start Hoofdprog. Hoofdprog. Instructie 1 Instructie 2 … Instructie x Instructie 1 Instructie 2 … Instructie x Bij Interrupt ISR Instructie 1 Instructie 2 … Instructie x Figuur 43: 2 types programmaverlopen De 16F628A heeft 10 verschillende soorten interrupts. Deze 10 interrupts worden opgedeeld in 2 groepen, de basis en de peripheral of rand-interrupts. Basis interrupts TMR0 overloopt (TMR0 overflow); er een positieve/negatieve flank is op RB0 (RB0/INT external interrupt); de status van RB4, RB5, RB6 of RB7 veranderd (RB Port change). Peripheral interrupts TMR1 overloopt (TMR1 Overflow); de waarde van TMR2 gelijk aan register PR2 (TMR2 to PR2 Match); er data via USART ontvangen is (USART recieve); het verzenden van data via USART klaar is (USART transmit); de Capture/Compare/PWM module aan een bepaalde voorwaarde voldoet (CCP1 interrupt); het schrijven van het EEPROM-geheugen klaar is (EE-write complete); de spanning aan de comparator module aan een bepaalde voorwaarde voldoet (Comparator interrupt). Elk van deze interrupts zijn apart in en uitschakelbaar. Stel dat er een interrupt ingesteld is die reageert op een positieve flank van RB0. Het hoofdprogramma zal gewoon blijven werken totdat er een positieve flank is op RB0. Nu zal de interrupt ervoor zorgen dat de program counter naar adres 0004h springt . Het hoofdprogramma zal dus onderbroken worden en een subprogramma zal worden uitgevoerd. Eens dit subprogramma afgewerkt is wordt er verder gegaan met het hoofdprogramma. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 49 Ook zal de interrupt ervoor zorgen dat bit INTF (RB0/INT External Interrupt Flag bit) aan zal komen te staan. Dit laatste is nodig zodat er gecontroleerd kan worden welke (van de 10 verschillende) interrupts is voorgekomen. Als de verwerking gebeurt is moet de INTF-bit via het programma uitgezet worden, anders kan er geen volgende interrupt gegenereerd worden. Om de interrupts in te kunnen stellen zijn er verschillende registers voorzien. 1.5.7.1 INTCON register INTCON staat voor INTerrupt CONtrol register, hiermee worden onder andere enkele interrupts aan en uit gezet. Bit n° Naam 7 GIE 6 PEIE 5 T0IE 4 INTE 3 RBIE 2 T0IF 1 INTF 0 RBIF Volledige Naam Global Interrupt Enable Bit Peripheral Interrupt Enable Bit TMR0 Overflow Interrupt Enable Bit RB0/INT External Interrupt Enable Bit RB Port Change Interrupt Enable Bit TMR0 Overflow Interrupt flag Bit RB0/INT External Interrupt Flag Bit RB Port Change Interrupt Flag Bit Functie Schakelt alle interrupts in/uit Schakelt de rand-interrupts in/uit Schakelt de TMR0 overloop interrupt in/uit Schakelt de RB0 interrupt in/uit Schakelt de RB Port Change interrupt in/uit Als TMR0 overgelopen is gaat deze bit aan Als er een flank geweest is op RB0 gaat deze bit aan Als RB4-RB7 van toestand gewijzigd zijn gaat deze bit aan Tabel 8: INTCON register De flag bits moeten softwarematig uitgezet worden. 1.5.7.2 PIE1 register PIE1 staat voor het Peripheral Interrupts Enable bits, Hier staan enkele enable bits voor de rand-interrupts. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC Bit n° Naam 7 EEIE 6 CMIE 5 RCIE 4 TXIE 3 2 / CCP1IE 1 TMR2IE 0 TMR1IE Volledige Naam EE Write Complete Interrupt Enable Bit Comparator Interrupt Enable Bit USART Receive Interrupt Enable Bit USART Transmit Interrupt Enable Bit / CCP1 Interrupt Enable bit TMR2 to PR2 Match Interrupt Enable bit TMR1 Overflow Interrupt Enable bit 50 Functie Schakelt de “EE Write Complete” interrupt in/uit Schakel de comparator interrupt in/uit Schakelt de “USART Receive” interrupt in/uit Schakelt de “USART Transmit” interrupt in/uit Ongebruikt, altijd 0 Schakelt de CCP1 interrupt in/uit Schakelt de TMR2 interrupt in/uit Schakelt de interrupt van TMR1 in/uit Tabel 9: PIE1 register 1.5.8 Timer 0 In de 16F628A zitten drie timermodules, in deze toepassing wordt enkel de eerste module gebruikt, namelijk timer 0. Deze timermodule is een register dat zijn waarde met 1 verhoogt telkens hij een klokimpuls aangeboden krijgt. Aangezien het register 8 bits breed is kan er maar een maximale waarde van 255 in opgeslagen worden. Als dit het geval is en er wordt nog een klokimpuls gegeven en zal timer 0 overlopen, dit wil zeggen dat hij terug vanaf 0 zal beginnen tellen. De klokimpulsen kunnen afkomstig zijn van pin RA4/T0CKI/CMP2 of deze kunnen ook gelinkt zijn aan de instructie klok. Door bit T0CS17 op 0 te zetten wordt er gekozen voor de instructie klok als klokingang, zet men deze bit op 1 dan wordt er gekozen voor pin RA4/T0CKI/CMP2 als klokingang. Met bit T0SE18 kan ingesteld worden of er gereageerd wordt op een positieve of een negatieve flank van pin RA4/T0CKI/CMP2. 17 18 T0CS: TMR0 Clock Source Select bit, bit nummer 5 in het option register T0SE: TMR0 Source Edge Select bit, bit nummer 4 in het option register 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 51 Prescaler 1: Instructie klok = fosc / 4 0 2 4 8 16 32 64 128 256 T0CS RA4/T0CKI/ CMP2 T0SE 1 PS2, PS1, PS0 TMR0 Figuur 44: Blokschema klokimpuls timer 0 De juiste klokimpulsen worden doorgegeven aan de prescaler. Dit is een deler die doormiddel van 3 bits ingesteld kan worden door hoeveel hij moet delen. Deze 3 bits zijn PS2, PS1 en PS0. In onderstaande tabel ziet men de mogelijk combinaties. PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 Deeltal 2 4 8 16 32 64 128 256 Tabel 10: Prescaler, deeltallen De klokimpuls die uit de prescaler uitkomt wordt vervolgens aangeboden aan TMR0, die telkens er een klokimpuls komt zijn waarde met 1 zal ophogen. De prescaler kan gebruikt worden voor de Watchdog Timer module, hiervoor dient men de bit PSA19 hoog te maken. Wil men de prescaler gebruiken voor de Timer 0 module dan dient men de PSA-bit laag te maken. Als men nu een interrupt wilt telkens dat timer 0 overloopt dan moet men: Bit GIE (Global Interrupts Enable bit) aanzetten, → Interrupts gebruiken is mogelijk gemaakt. Bit T0IE (Timer 0 Interrupt Enable bit) aanzetten, → Timer 0 Interrupt is ingeschakeld. 19 PSA: Prescaler Assignment bit, bit nummer 3 in het option register 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 52 Bit T0CS (Timer 0 Clock Source Select bit) afzetten, → De klokimpuls komt van de instructie klok. Bit PSA (Prescaler Assignment bit) afzetten, → De prescaler is toegewezen aan de Timer 0 module. Voorbeeld: De µC is aangesloten op een kristal met een frequentie van 4 MHz (fosc = 4 MHz) en volgende instellingen zijn gemaakt: GIE = 1 T0IE= 1 PSA= 0 T0CS = 0 PS2 = 0 PS1 = 0 PS0 = 1 Dit wil zeggen dat, de interrupt van timer 0 is ingeschakeld, de prescaler toegewezen is aan timer 0, de instructie klok de klokimpuls is en het deeltal van de prescaler vier is. De instructie klok is altijd een vierde van fosc , dit is dus 1 MHz. Deze frequentie van 1 MHz wordt aangeboden aan de prescaler die deze deelt door vier. TMR0 wordt dus opgehoogd aan een frequentie van 250 kHz, of anders gezegd, elke 4 µS wordt er bij TMR0 een 1 bij geteld. Aangezien TMR0 256 verschillende waarden kan bevatten loopt hij 976,5625 keer per seconde over. Tussen elke interrupt zit dus een tijd van 1024 µS. In de klok is het nodig om elke seconde een puls te hebben, deze wordt gegenereerd met de hulp van een TMR0 interrupt. Hiervoor worden de volgende instellingen gemaakt: GIE = 1 T0IE= 1 PSA= 0 T0CS = 0 PS2 = 0 PS1 = 0 PS0 = 0 Dit houdt in dat de TRM0 interrupt toegestaan wordt, voor de klok de “instruction cycle clock” wordt genomen, de prescaler aan de Timer 0 module wordt gekoppeld en bij de prescaler 2 als deeltal genomen wordt. De µC is aangesloten op een kristal met een frequentie van 20 MHz, de instruction cycle clock wordt dus 5 MHz. Dit wordt door de prescaler gedeeld door 2, de timer wordt dus opgehoogd met een frequentie van 2,5 MHz, elke 0,4 µS wordt er dus één opgeteld bij de timer. Elke 102,4 µS wordt er dus een interrupt gegeven. In één seconde komen dus 9765,625 interrupts voor, in 8 seconden komen er 78125 interrupts voor. Aangezien het niet mogelijk is om de µC 9765,625 interrupts te laten tellen wordt er geteld tot 9765 waarna er een puls gegeven wordt. Deze puls duurt dus geen 1 seconde meer maar 0,999936 seconden. Dit geeft grote fouten op lange termijn. Door een tweede teller te laten meelopen, kan dit verholpen worden. Deze teller zal ook de interrupts tellen en als deze op 78125 staat zal hij een puls geven. Tussen de pulsen van teller 2 zit exact 8 seconden, hiermee wordt dus de fout op teller 1 gecorrigeerd. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 53 1.5.9 Speciale functie registers 1.5.9.1 CMCON Het CMCON register, afkorting voor CoMparator CONfiguration register, bevat de instellingen voor de twee comparatoren die ingebouwd zitten in de µC. De ingebouwde comparator module bevat twee analoge comparatoren. De ingangen van deze comparatoren zijn gemultiplext met pin RA0 tot pin RA3. De spanningsreferentie module, die ook ingebouwd zit in de µC, kan ook een ingang zijn voor de comparatoren. Het CMCON register controleert de multiplexer zodat de ingangen van beide comparatoren ingesteld kunnen worden. Aangezien de comparatoren in dit eindwerk niet gebruikt worden moeten deze worden uitgeschakeld. Dit doet men door het getal (0000 0111)2 of (7)10 in dit register te plaatsen. De pinnen RA0 tot RA3 zijn nu gewone digitale ingangen. 1.5.9.2 TRISA, TRISB Om van elke pin in te kunnen stellen of hij een in- of een uitgang is wordt er gebruik gemaakt van de registers TRISA en TRISB. TRISA staat voor Tri-state register van poort A. Tri-state wil zeggen dat elke aansluitpin drie standen heeft, deze zijn: laag of 0 V (uitgang); hoog of 5 V (uitgang); hoog-ohmig (ingang). Elke bit in het register stelt een pin voor. Zo zal bit 0 van TRISA pin RA0 voorstellen. Plaats men in deze bit een 0 dan wordt RA0 een uitgang, wordt de bit een 1 dan wordt RA0 een ingang. Via de registers PORTA en PORTB kan men de toestand (0 V of 5 V) van de pinnen wijzigen (indien het een uitgang is) of uitlezen. Als de µC gereset wordt staan de alle pinnen ingesteld als ingang. 1.5.10 Oscillator Om de µC te laten werken is het nodig gebruik te maken van een oscillator. Dit is een schakeling die een periodiek signaal opwekt met een vaste frequentie. Dit (klok)signaal wordt gebruikt om de µC te laten weten wanneer hij de volgende bewerking mag doen. De µC heeft 8 verschillende opties voor oscillatoren. 6EE LP, Low Power Crystal; XT, Crystal/Resonator; HS, High Speed Crystal/Resonator; RC External Resitor/Capacitor (2 modes); INTOSC Internal Precision Oscillator (2 modes); EC External Clock In. Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 54 In de klok wordt er gebruik gemaakt van een kristal, in de µC wordt dus de XT-optie ingeschakeld. Volgende figuur toont aan dat de µC het extern aangesloten kristal en condensatoren als Pierce oscillator schakelt. Figuur 45: Schakeling van de oscillator Het zou ons te ver leiden wanneer we dieper ingaan in bovenstaand schema, dit omdat deze informatie niet relevant is in dit dossier. Door gebruik te maken van een kristal wordt de fout op de frequentie zeer klein. Een kristal heeft namelijk een fout van 20 ppm (parts per million), en vaak minder. Dit houdt in dat wanneer men een kristal van met een frequentie van 1 MHz met een foutenmarge van 10 ppm neemt, er maximaal 10 cyclussen per seconden teveel of te weinig kunnen zijn. De waarden van de condensatoren kan men opzoeken in de datasheet van de µC. Deze moeten in dit geval tussen de 15 pF (picoFarad) en de 30 pF liggen want er wordt gebruik gemaakt van een kristal van 20 MHz.. De twee gebruikte condensatoren hebben een waarde van 22 pF. 1.5.11 RA5/MCLR/Vpp -pin Deze pin kan gebruikt worden voor twee verschillende doeleinden. Deze kan namelijk ingesteld worden als: gewone digitale ingang (RA5); reset ingang. Gebruikt men deze pin als gewone ingang dan wordt de MCLR20-schakeling intern verbonden met de positieve voedingsspanning zodat de µC niet gereset wordt. Gebruikt men deze pin als reset ingang dan moet men op deze pin 5 Volt zetten, via een pull-up weerstand. Zet men 0 Volt op deze pin dan zal de µC gereset worden. 20 MCLR: Master Clear of reset 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 55 Zet men een spanning van 13 Volt op deze pin dan schakelt de µC over op programmeermodus. De µC kan nu geprogrammeerd worden via de pinnen RB6/T1OSO/T1CKI/PGC en RB7/T1OSI/PGD. 1.5.12 Software 1.5.12.1 Algemeen Om de µC de display te laten aansturen, de tijd te decoderen, led laten pinken, ... moet er natuurlijk een programma geschreven worden. Dit programma wordt geschreven in de programmeertaal JAL. Deze afkorting staat voor “Just Another Language”. De µC kan niet direct overweg met deze programmeertaal, daarom moet deze worden omgezet naar een begrijpbare taal voor de µC. bestand.jal bestand.asm bestand.hex Figuur 46: Omzetten van een JAL-programma Een begrijpbaar programma voor de µC is een programma opgebouwd uit een HEXcode. De compiler21 kan de JAL-code niet direct omzetten naar een HEX-code. Hiervoor dient eerst een tussenstap genomen te worden. Deze tussenstap is een programma geschreven in assembly (ASM). 1.5.12.2 HEX Een programma geschreven in hexadecimale code, of machinetaal, is een programma waarin instructies geschreven zijn die de µC direct kan uitvoeren. Het programma bestaat uit een reeks woorden. Elk woord staat voor een bepaalde bewerking of actie die de µC moet uitvoeren. Omdat het voor programmeurs tijdrovend en te onoverzichtelijk is om software in machinetaal te schrijven, schrijven ze hun software in een voor mensen makkelijker te begrijpen, 'hogere' programmeertaal. De programmeertaal die het dichts bij de machinetaal ligt is assembly. 21 Compiler: computerprogramma dat een programma geschreven in een programmataal omzet naar een programma geschreven in een andere programmeertaal 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 56 Een voorbeeld van deze HEX-programma: :020000040000FA :100000000A128A1104280000A4010C282408860082 :02400E00023D71 :00000001FF 1.5.12.3 ASM Assembly is een programmeertaal van lagere orde die eigenlijk een symbolische weergave van machinetaal is. Bij deze taal is het zo dat iedere regel van een assembly-instructie naar een enkele machinecode-instructie wordt vertaald. De assembler, die het programma omzet naar machinecode, zet wel nog symbolische namen (mnemonics) voor geheugens, zoals PORTB, en labels om naar adressen. Het grote voordeel van programmeren in assembly is dat de code zeer compact en snel kan zijn. Een nadeel is dat voor eenvoudige programma’s als snel heel veel code nodig is. Dit maakt een programma in assembly zeer onoverzichtelijk. Een voorbeeld van een (deel van een) ASM-programma: ... main movlw 2 call ALLES_AAN_UIT_100MS movlw 3 movwf teller2 call LINKS_AAN_UIT_100MS goto main ALLES_AAN_UIT_100MS movwf teller1 C1 call ALLES_AAN call delay_100ms call ALLES_UIT call delay_100ms decfsz teller1,f goto C1 return ... 1.5.12.4 6EE JAL Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 57 Deze programmeertaal is oorspronkelijk ontworpen door de Nederlander Wouter Van Ooijen. Tegenwoordig werkt er een groot team aan de verdere ontwikkeling van deze programmeertaal. De voordelen van deze programmeertaal zijn: de kostprijs (volledig gratis); veel gebruikers, dus veel ondersteuning; veel documentatie en voorbeeldprogramma’s te vinden op internet; veel bibliotheken te vinden op internet; veel hulpprogramma’s te vinden op internet; … Deze bovenstaande punten maakt de taal vooral populair bij hobbyisten. Voor hogere programmeertalen, zoals JAL er één is, is een interpreter of compiler nodig om de programma's om te zetten in door een machine uit te voeren machinetaal. Om de software voor dit eindwerk te ontwikkelen werd er gebruik gemaakt van de compiler JALv2. De toepassing waarin het programma geschreven werd is JALedit, beide programma’s zijn gratis te verkrijgen. De programmeertaal JAL is in staat om met een 8 bits CPU bewerkingen te doen op 32 bits getallen. Dit zorgt ervoor dat met volgende types getallen of variabelen gewerkt kan worden: bit [0/1, off/on, false/true, low/high]; byte: 8 bits [natuurlijke getallen van 0 tot 255]; sbyte: 8 bits [gehele getallen van –128 tot 127]; word; 16 bits = 2 bytes [natuurlijke getallen van 0 tot 65 535]; sword: 16 bits = 2 bytes [gehele getallen van -32 768 tot 32 767]; dword: 32 bits = 4 bytes [natuurlijke getallen van 0 tot 4 294 967 296]; sdword: 32 bits = 4 bytes [gehele getallen van –2 147 483 648 tot 2 147 483 647]. Een voorbeeld van een JAL-programma: include f877_20_roel var bit LED is pin_a0 pin_a0_direction = output var bit SW1 is pin_b0 pin_b0_direction = input ;LED = pin_a0 ;pin_a0 is een uitgang ;SW1 = pin_b0 ;pin_b0 is een input forever loop if SW1 == on then delay_100ms(1) else delay_100ms(2) end if ;als SW1 aan is dan ... ;wacht 100 ms ;anders ;wacht 200 ms ;if-blok afsluiten 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC LED = ! LED end loop 1.5.12.5 58 ;draai LED om Blokschema In onderstaande figuur vindt men het blokschema van het programma terug . Start Variabelen declareren Display instellen + zelf ontworpen tekens doorsturen Timer 0 module instellen Welkomstteksten tonen Antenne opgestart? Ja Startbit? Ja ISR: Nee Nee DCF77 signaal decoderen en foutencontrole Verhoog de klok met 1 seconde Displaytekst vernieuwen Figuur 47: Blokschema programma Als eerste in het programma staan de algemene instellingen voor de µC die ingesteld moeten worden, zoals de waarde (7)10 die in het CMCON register geplaatst moet worden. Daarna worden de variabelen gedeclareerd, hiermee wordt verteld aan de compiler welk type (bit, byte, sbyte, word, sword, dword, sdword) de variabele is. Vervolgens wordt de display ingesteld en de zelf ontworpen tekens worden doorgestuurd naar de display zodat men deze later kan gebruiken. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 59 Nadat dit gebeurd is wordt de timer 0 module ingesteld en worden de welkomstteksten getoond op de display. Vervolgens wordt er gewacht totdat de antenne opgestart is. Eens dit is gebeurd wordt er gewacht op de startbit. Als de startbit voorbij gekomen is wordt het hoofdprogramma gestart. Hierin decodeert de µC het DCF77-signaal en wordt er aan foutencontrole gedaan. Voor men dit deel van het programma opnieuw doorloopt vernieuwt de µC de tekst op de display. Verder is er nog het ISR, wat staat voor “Interrupt Service Routine”, dit stuk programmacode wordt bij elke interrupt van timer 0 doorlopen. De ISR zorgt voor een puls van 1 seconde en zal de klok, die op de display getoond wordt, ophogen met één seconde. Is de ontvangen data van het DCF-signaal juist, dan zal deze klok overschreven worden met de ontvangen data. 1.5.13 Programmeertoestel 1.5.13.1 Galva-wisp Om de µC een programma te laten uitvoeren moet hij natuurlijk eerst over programma beschikken. Dit programma wordt in de µC geprogrammeerd met een programmeertoestel, er wordt gebruik gemaakt van de “galva-wisp”. Bestand.hex & Bumblebee.exe Galvanische scheiding RS232 USB 5 Galva-wisp USB ► RS232 DCF77-klok Figuur 48: Blokschema voor het aansluiten van het programmeertoestel Dit is een programmeertoestel waarvan het schema vrij te verkrijgen is, net zoals de firmware voor de ingebouwde µC die het programmeertoestel aanstuurt. Ook de bijhorende computerprogramma’s zijn gratis te downloaden van het internet. Het programmeertoestel is gebaseerd op de populaire wisp628 die, net zoals JAL, ontworpen is door Wouter Van Ooijen. De galva-wisp beschikt echter over een galvanische scheiding22 welke gebruik maakt van optocouplers. 22 Galvanische scheiding: Verbinding tussen twee elektrische circuits terwijl deze elektrisch van elkaar gescheiden zijn 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 60 De galva-wisp ondersteunt ICSP23, zodat de µC niet uit de toepassingsprint gehaald moet worden om hem te kunnen programmeren. Dit spaart tijd en ook beschadigde IC’s, bij het meermaals wegnemen en plaatsen van een IC van of op een printplaat is het afbreken van één van de aansluitpinnen haast onvermijdelijk. Ook heeft de galvawisp geen nood aan een eigen voeding, hij haalt zijn voedingspanning namelijk van de toepassingsprint. De galva-wisp die gebruikt wordt is zelf gebouwd. 1.5.13.2 Optocoupler Figuur 49: Optocoupler Bovenstaande figuur toont de werking van een optocoupler. Tussen de aansluitingen A en B zit een LED, tussen de aansluitingen C en D een lichtgevoelige transistor. Stel dat er geen spanningsverschil is tussen A en B, dan zal de LED niet oplichten, de transistor zal niet geleiden waardoor het lijkt alsof er tussen C en D een open schakelaar zit. Laat men nu een stroom van A naar B lopen dan zal de LED oplichten, de lichtgevoelige transistor zal nu beginnen geleiden, nu lijkt het alsof er een gesloten schakelaar tussen C en D zit. Er kan dus informatie van A en B naar C en D overgebracht worden. Als A en B zich nu op een te hoge spanning (bv: netspanning) bevindt dan kan deze spanning onmogelijk op aansluitingen C en D komen. Er kan dus aan informatieoverdracht gedaan worden zonder dat de twee deelschakelingen elektrisch met elkaar verbonden zijn. Bij de galva-wisp wil dit zeggen dat er nooit een verkeerde (hoge) spanning bij de computer terecht kan komen als er een fout op de print aanwezig is. Een nadeel van de optocouplers is dat deze maar tot een bepaalde snelheid kunnen schakelen, wat de maximale programmeersnelheid naar beneden haalt. 1.5.13.3 Aansluitingen van een galva-wisp De originele galva-wisp beschikt over 2 aansluitingsconnectoren. De gebruikte galvawisp beschikt over meer aansluiten die later zijn bijgebouwd. Enkel de twee originele aansluitingen worden besproken. Seriële poort 23 ICSP: In Circuit Serial Programming 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 61 Om de computer te kunnen laten communiceren wordt er gebruikt gemaakt van het RS232 protocol. Een poort die gebruik maakt van dit protocol is de seriële poort op een computer. Niet elke computer beschikt over een seriële poort, daarom wordt er tussen de computer en de galva-wisp een USB-toserial-converter geplaatst. Programmeeraansluiting Om de µC in programmeermodus te brengen moet een spanning van 13 Volt op de MCLR-pin gezet te worden. De µC stopt nu met het uitvoeren van het programma. Pinnen RB6/T1OSO/T1CKI/PGC en RB7/T1OSI/PGD zullen in de programmeermodus gebruikt worden als communicatielijnen met het programmeertoestel. Zo zal op pin RB6 de klokimpuls aangeboden worden terwijl pin RB7 gebruikt wordt om de programmadata te verzenden/ontvangen. Plaats men 5 Volt op de MCLR-pin dan zal deze in “run”-mode staan. Het programmeertoestel heeft ook een voeding nodig. Deze wordt van de toepassingsprint, in dit geval de klok, gehaald. Dit kan omdat het programmeertoestel niet veel verbruikt en ook op 5 Volt voedingsspanning werkt. Dit maakt het overbodig een extra voeding voor het programmeertoestel te gebruiken. Het programmeertoestel heeft dus een 5 polige programmeeraansluiting: 1.5.13.4 voeding (Massa en +5 V); programmaklok; programmadata; MCLR-aansluiting. Software Om de computer te laten communiceren met de galva-wisp wordt er gebruik gemaakt van een programma. Het gebruikte programma heet “Bumblebee”. Dit is een eenvoudig programma waarmee men: 6EE een programma in de µC kan laden; een programma uit de µC kan verwijderen; het programma in de µC kan vergelijken met het geopende programma; de aangesloten µC kan identificiëren; de firmware versie van de galva-wisp ophalen; … Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 62 Figuur 50: Bumblebee, standaard en mini venster Om de galva-wisp een programma in te µC te laten laden moet men eerst het bestand met de HEX-code openen. Vervolgens hoeft men enkel de “execute list” te starten, dit heeft tot gevolg dat: het hex-bestand opnieuw geladen wordt zodat er steeds met de recentste versie gewerkt wordt; de µC gewist wordt zodat alle vorige programma’s zeker volledig weg zijn uit de µC; de code naar de µC geschreven wordt; de µC in “run-mode” gezet wordt. Ook kan de execute list ingesteld worden dat er ook automatisch aan vergelijking tussen de code in de µC en de code op de computer gedaan wordt. 1.5.14 Schema In volgende figuur staat het schema van de µC, display en de ontvangstmodule. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 63 Figuur 51: Schema µC, display en de ontvangstmodule 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 64 Weerstand R1 is een voorschakelweerstand voor de LED24. Deze weerstand kan als volgt worden berekent. Geg: Uledmax = 1,2 V Iledmax = 12,5 mA Vcc = 5 V Gevr: R = ? Opls: UR = Vcc – Uledmax = 3,8 V IR = UR / Iledmax = 304 Ω Naar boven afgerond geeft dit 330 Ω, welke een standaardwaarde is uit de E12reeks van de weerstanden. Weerstand R2 is de pull-up weerstand voor de opencollector uitgang van de ontvangstmodule Weerstand R3 is een pull-up weerstand voor de MCLR-pin. Deze dient ervoor te zorgen dat de spanning op deze pin 5 V is tijdens normale werking. De genomen waarde (33 kΩ) is een standaardwaarde die terug te vinden is in de handleiding van het programmeertoestel. Aansluitingen X2 en X3 worden gebruikt voor de voedingsspanning van de ontvangstmodule en voor doorgeven van DCF77-signaal naar de µC. Ook wordt deze gebruikt om een LED, die samen met de ontvangstmodule wordt ingebouwd, te laten oplichten tesamen met het ontvangen DCF77-signaal. De 10-polige connector X4 wordt gebruikt om de display aan te sluiten. Welke datalijn aan welke pin van de µC gehangen is, is in de gebruikte bibliotheek25, voor het aansturen van de display, opgegeven. Potentiometer R4 wordt gebruikt voor het instellen van het contrast van de display. Op aansluiting X5 kan men het programmeertoestel aansluiten. 24 LED: light emitting diode, lichtemitterende diode Bibliotheek: Verzameling van procedures, er bestaan verschillende bibliotheken die elk procedures over een bepaald onderwerp handelen, zoals: Aansturen van display, communicaties via de USARTmodule, instellen en gebruiken van de comparator-module, … 25 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 65 2 Footprint pin mapping table symbool naam in user library multisim footprint in user library ultiboard footprint naam pin nr. pin text logische pin fysische pin CONNECTOREN SCREW2_POWER1 Ref. ID X1 GND +V SCREW2_POWER1 GND +V SCREW2_LED_SIG Ref. ID X2 LED SIG SCREW2_LED_SIG LED SIG SCREW2_POWER2 Ref. ID X3 GND +5V X4 GND +5V 1 2 3 4 5 6 7 8 9 10 HEADER_PROG Ref. ID 6EE X5 LED SIG SCREW2_POWER2 BOXHEADER2X5 Ref. ID GND +V PGC PGD GND +5V MCLR Van Hoylandt Roel GND +5V BOXHEADER2X5 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 Header_prog PGC PGD GND +5V MCLR 2007-2008 DCF77 klok met PIC µC symbool naam in user library multisim footprint in user library ultiboard pin nr. footprint naam pin text 66 logische pin fysische pin IC's 780x_V Ref. ID Type Out. Volt. VR1 7805 5V 7805 1 2 3 IN GND OUT 16F648A_GP Ref. ID Type IC1 16F648A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 16F648A_GP DCF77 Led MCLR Vss D4 D5 D6 D7 RS E PGC PGD Vdd OSC2 OSC1 1 2 DCF77 Led NC3 MCLR Vss D4 D5 D6 D7 RS E PGC PGD Vdd OSC2 OSC1 NC17 NC18 4 5 6 7 8 9 10 11 12 13 14 15 16 KRISTALLEN Kristal_standaard Ref. ID Value XTAL1 20MHz 1 2 Kristal_standaard X1 X2 DIODES 1N400X Ref. ID 6EE D1 1N4007 A C Van Hoylandt Roel A K 2007-2008 DCF77 klok met PIC µC symbool naam in user library multisim footprint in user library ultiboard pin nr. footprint naam 67 pin text logische pin fysische pin CONDENSATOREN Elco_middel C1 & C3 220µF Ref. ID Value 220uF 2 1 + Cond_groot Ref. ID Value C2, C4 & C5 100nF 100nF 1 2 1 2 Cond_klein C6 & C7 22pF Ref. ID Value 22pF 1 2 1 2 WEERSTANDEN RES Ref. ID R1, R2 & R3 Value 330Ω,10kΩ & 33kΩ 330R, 10k & 33k 1 2 1 2 1 2 RES_POT Ref. ID Value 6EE R4 10k Potentiometer 1 2 3 1 2 3 Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 68 3 Printontwerp Figuur 52: Silkscreen Figuur 53: Silkscreen en copper bottom 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 69 Figuur 54: Silkscreen en copper top 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 70 4 Onderdeel Frans 4.1 L’article: DCF77 4.1.1 Introduction La réception des signaux horaires DCF77 est le seul moyen en Europe d'obtenir une heure précise, de manière fiable, avec un récepteur simple et peu cher. (La réception de signaux horaires provenant d'un satellite GPS est plus difficile à mettre en oeuvre). On peut ainsi recevoir l'heure, la date, et le jour de la semaine. Le changement entre l'heure d'été et d'hiver est automatique. 4.1.2 L'émetteur L'émetteur des signaux horaires DCF77 est situé en Allemagne, à Mainflingen (près de Francfort), plus précisément à 50,02° de latitude Nord, et 9,00° de longitude Ouest. L'information horaire est donnée par l'horloge atomique de « L'institut Physique Et De Metrologie De Brunswick ». Cette horloge est très précise, puisque son écart théorique est de ±1 seconde pour 1 millions d'années. Grâce à sa position centrale en Europe, à sa puissance d'émission de 50 kW, les informations de cet émetteur peuvent être correctement reçues dans un rayon de 2000 km, c'est à dire dans une grande partie de l'Europe, et même dans l'extrême nord de l'Afrique. La porteuse a une fréquence très stable, de 77,5 kHz (d'où le nom DCF77), qui dérive de l'horloge atomique. Les faibles fluctuations de cette fréquence sont principalement dues à la propagation des grandes ondes dans l'atmosphère. Son écart relatif par rapport à la fréquence de 77,5 kHz est en moyenne sur, 100 jours, de moins de 2 x 10-13. Par conséquent, elle peut être utilisée pour la synchronisation d'oscillateurs nécessitant une grande précision. En cas de maintenance ou de dysfonctionnement, un émetteur de réserve est mis en fonction. Il arrive cependant que les signaux horaires cessent d'être émis, notamment lors d'orages, pendant un temps généralement très court. Il est donc nécessaire que l'horloge radiopilotée possède sa propre horloge interne. 4.1.3 Le signal horaire Le signal horaire DCF77 est composé d'une fréquence porteuse très stable de 77,5 kHz, modulée en amplitude par les signaux horaires codés en BCD (Binary Coded 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 71 Decimal). L'onde porteuse est modulée par des impulsions, au rythme d'une par seconde. Ces impulsions Se traduisent chaque seconde par une diminution de 25% de l'amplitude du signal reçu. La durée d'une impulsion, détermine le niveau du bit reçu, à savoir qu'une impulsion de 100 ms représente un bit à 0 et qu'une impulsion de 200 ms represente un bit à 1. Les informations horaires sont émises par trame d'une minute. Chaque trame est divisée en soixantes secondes, chacune d'entre elles débutant par le front de l'impulsion. Il faut noter que, pour la 59ème seconde, il n'y a pas d'impulsion afin de permettre au décodeur de repérer le début d'une trame. Ainsi, l'impulsion suivante détermine le début de la trame suivante. Toute absence d'impulsion plus grande que 999 ms doit donc être considérée comme le début d'une nouvelle trame. Trois fois par heure, durant les minutes 19, 39 et 59 (chaque fois durant les secondes 20 à 32), le signal « DCF77 » est émis deux fois en morse, à une fréquence de 250 Hz (diminution de l'amplitude de la porteuse de 85 à 100%), mais n'interfére pas sur la réception du signal horaire. Ce signal morse est en général filtré par le récepteur, et on ne le retrouve pas sur le signal logique. 4.1.4 Les informations contenues dans le signal horaire Voici, sous forme schématique, la signification des 59 bits reçus durant une minute : 0 (M) : Début de trame (bit à 1). 1 - 14 : Réservé pour une utilisation future. 15 (R) : L'emetteur de réserve est actif lorsque ce bit est à 1. 16 (A1) : Annonce de l'heure d'hiver. 17, 18 (Z1, Z2) : Ces deux bits codent le fuseau horaire actuel : Z1 0 1 Z2 Fuseau horaire 1 CET (Central European Time) = UTC + 1h 0 CEST (Central European Sommer Time) = UTC + 2h CET correspond à l'heure d'hiver, et CEST correspond à l'heure d'été. Il s'agit de l'heure légale de la plupart des pays d'Europe. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 72 19 (A2) : Indique qu'une seconde va être supprimée pour corriger les irrégularités de la rotation de la terre. 20 (S) : Bit de début de codage des informations horaires (toujours à 1). 21 - 27 : Minutes codées en BCD, bit de poids faible en premier : N° bit 21 Valeur 1 22 2 23 4 24 8 25 10 26 20 27 40 28 (P1) : Bit de parité (parité paire) des minutes (bits 21 à 27). 29 - 34 : Heures codées en BCD, bit de poids faible en premier : N° bit 29 Valeur 1 30 2 31 4 32 8 33 10 34 20 35 (P2) : Bit de parité (parité paire) des heures (bits 29 à 34). 36 - 41 : Jour codé en BCD, bit de poids faible en premier. N° bit 36 Valeur 1 37 2 38 4 39 8 40 10 41 20 42 - 44 : Jour de la semaine codé en BCD, bit de poids faible en premier : N° bit 42 Valeur 1 43 2 44 4 45 - 49 : Mois codé en BCD, bit de poids faible en premier : N° bit 45 Valeur 1 46 2 47 4 48 8 49 10 50 - 57 : Année (sur deux chiffres) codées en BCD, bit de poids faible en premier : N° bit 50 Valeur 1 51 2 52 4 53 8 54 10 55 20 56 40 57 80 58 (P3) : Bit de parité (parité paire) de la date (bits 36 à 57). 59 : Pas d'impulsion 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 73 Pour mieux fixer les idées, voici l'exemple du codage des bits 21 à 28 de la trame émise pendant la minute 34. Ils codent donc les informations de la minute suivante, à savoir la minute 35. 4.1.5 Le récepteur Le signal horaire DCF77 parvient sous forme de grandes ondes, à une fréquence de 77,5 kHz, sur une antenne puis est démodulé par un récepteur accordé sur cette fréquence. On obtient à la sortie de ce récepteur un signal logique, correspondant aux impulsions de 100 et 200 ms émises. Ce signal peut ensuite être traité par un décodeur afin d'obtenir les informations de date et heure. Il est possible de réaliser soit même un récepteur DCF77, mais il est plus simple d'acheter un module de réception DCF77 près à l'emploi, d'autant que cela revient moins cher. Les récepteurs sans décodeur produisent à partir du signal grandes ondes reçu, des impulsions de 100 ou 200 ms. Ces signaux doivent ensuite être traités par un décodeur adéquat (PC,microcontrôleur, etc.). Attention, suivant les récepteurs employés, il se peut que la sortie soit en logique inversée. Les modules avec décodeur intégré se composent d'un récepteur DCF77 et d'un décodeur intelligent intégrés dans le même module. Il s'agit en général d'horloges radiopilotés complètes, mais il existe aussi des récepteurs avec décodeur intégré qui possèdent une sortie RS232. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 74 4.2 Lexique – woordenlijst 1 2 3 4 5 6 7 8 9 10 Français adéquat amplitude bit de parite decodeur démoduler diminution émettre fréquence horaire horloge atomique Néerlandais adequaat amplitude, slingerwijdte pariteitsbit decoder demoduleren vermindering uitzenden frequentie uur atoomklok 11 12 13 14 15 16 17 18 19 20 Français horloge radiopilotée impulsion inverser microcontroleur oscillateur porteuse puissance d'émission récepteur réception trame Néerlandais radiogestuurde klok impuls inverteren, omkeren microcontroller oscillator drager uitzendingsmacht ontvanger ontvangst frame 4.3 Résumé en néerlandais – samenvatting in het Nederlands Het DCF77-signaal wordt gebruikt om de tijd in centraal Europa te verspreiden. Dit gebeurt door middel van radiogolven op een frequentie van 77,5 kHz. De radiozender staat in Mainflingen, een stadje in Duitsland. Het signaal kan opgepikt worden door een goedkope ontvanger. Het DCF77-signaal bevat onder andere de volgende informatie: zomeruur/winteruur, de minuten, het uur, dag van de maand, dag van de week, de maand, het jaar. Het signaal is een AM-gemoduleerde radiogolf, dit komt erop neer dat men een constant signaal zendt, maar waarvan men de amplitude gaat veranderen (verzwakken) op het moment dat er iets verzonden wordt. Er worden op die manier elke minuut 59 bits verzonden die elk een functie hebben. Elke seconde wordt er dus één bit verzonden, behalve op seconde 59. Hier wordt er geen bit verzonden zodat men het begin van de minuut kan aangeven. Een bit kan twee toestanden aannemen, een 0 of een 1. Duurt de verzwakking van de amplitude 100 milliseconden, dan is de verzonden bit een 0, duurt deze 200 milliseconden dan is de verzonden bit een 1. Als men alle 59 bits ontvangen heeft (een volledig frame) dan kan men gaan controleren of er geen bits fout ontvangen zijn. Dit doet men met behulp van de pariteitsbits. Als alle bits correct ontvangen zijn, dan mag men het frame goedkeuren en opslaan voor verwerking (of laten zien op het display), anders moet men het verwerpen (of de minuut op het display met 1 ophogen). Bij onweer gebeurt het soms dat de zender moet uitgeschakeld worden, het is dus van groot belang dat de radiogestuurde klok een interne klok heeft zodat deze geen foutieve tijd aangeeft als het DCF77-signaal wegvalt. Er zijn ook ontvangers die worden gebruikt om de tijd van een computer (of server) juist te zetten, deze zijn dan meestal uitgerust met een seriële poort (RS232). 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 75 5 Onderdeel Engels 5.1 Lead Een microcontroller is een elektronisch component dat men tegenwoordig in bijna elk elektronisch toestel tegenkomt. Een microcontroller bevat minstens een processor, een geheugen (EPROM, EEPROM, FLASH,...), ingangen en uitgangen. Verder kunnen ze nog extra functies ingebouwd hebben, de meeste beschikken bijvoorbeeld over de mogelijkheid om te communiceren met Pc’s of andere microcontrollers. Microcontrollers zijn in staat om zelfstandig taken uit te voeren. Dit doen ze aan de hand van een programma dat de programmeur in het geheugen van de microcontroller heeft gestoken. De microcontroller zal na het opstarten dit programma beginnen uitvoeren. Het artikel gaat over de PIC microcontrollers, dit type microcontrollers is ontworpen door Microchip. 5.2 Article 5.2.1 PIC Microcontroller PIC is a family of Harvard architecture microcontrollers made by Microchip Technology, derived1 from the PIC1650 originally developed by General Instrument's Microelectronics Division. The name PIC was originally an acronym for "Programmable Intelligent Computer". PIC’s are popular with developers and hobbyists alike due to their low cost, wide availability, large user base, extensive collection of application notes, availability of low cost or free development tools, and serial programming (and re-programming with flash memory) capability. Microchip recently announced the shipment of its five billionth PIC processor. 5.2.2 Core Architecture of the 8-bit CPUs The PIC architecture is minimalist. It is characterized by the following features2: separate code and data spaces (Harvard architecture); a small number of fixed length instructions; most instructions are single cycle execution3 (4 clock cycles), with single delay4 cycles upon branches and skips; a single accumulator (W), the use of which (as source operand) is implied (he is not encoded in the opcode); all RAM locations function as registers as both source and/or destination of math and other functions; a hardware stack for storing return addresses; a fairly small amount of addressable data space (typically 256 bytes), extended through banking; data space mapped CPU5, port, and peripheral6 registers; 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 76 the program counter is also mapped into the data space and writable (this is used to synthesize indirect jumps). Unlike most other CPUs, there is no distinction between "memory" and "register" space because the RAM serves the job of both memory and registers, and the RAM is usually just referred to as the register file or simply as the registers. 5.2.3 Data Space (RAM) PIC’s have a set of register files that function as general purpose7 RAM, special purpose control registers for on-chip hardware resources are also mapped into the data space. The addressability of memory varies depending on device series, and all PIC devices have some banking mechanism to extend the addressing to additional8 memory. Later series of devices feature move instructions which can cover the whole addressable space, independent of the selected bank. In earlier devices (the baseline and mid-range cores9), any register move had to be through the accumulator. To synthesize10 indirect addressing, a "file select register" (FSR) and "indirect register" (INDF) are used: A read or write to INDF will be to the memory pointed to by FSR. Later devices extended this concept with post and pre increment/decrement for greater efficiency in accessing sequentially stored data. This also allows FSR to be treated like a stack pointer. External data memory is not directly addressable except in some high pin count PIC18 devices. 5.2.4 Code Space All PIC’s feature Harvard architecture, so the code space and the data space are separate. PIC code space is generally implemented11 as EPROM, ROM, or FLASH ROM. In general, external code memory is not directly addressable due to the lack of an external memory interface. The exceptions are PIC17, select high pin count PIC18 devices, and PIC24/dsPIC. 5.2.5 Stacks PIC’s have a hardware call stack, which is used to save return addresses. The hardware stack is not software accessible12 on earlier devices, but this changed with the 18 series devices. Hardware support13 for a general purpose parameter stack was lacking14 in early series, but this greatly improved in the 18 series, making the 18 series architecture more friendly to high level language compilers. 6EE Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 77 5.2.6 Instruction Set PIC’s instructions vary in number from about 35 instructions for the low-end PIC’s to about 70 instructions for the high-end PIC’s. The instruction set includes instructions to perform a variety of operations on registers directly, the accumulator and a literal constant or the accumulator and a register, as well as for conditional execution, and program branching. Some operations, such as bit setting and testing, can be performed on any register, but bi-operand arithmetic15 operations always involve W, writing the result back to either W or the other operand register. To load a constant, it is necessary to load it into W before can be moved into another register. On the older cores, all register moves needed to pass through W, but this changed on the "high end" cores. PIC cores have skip instructions which are used for conditional execution and branching. The skip instructions are: 'skip if bit set', and, 'skip if bit not set'. Because cores before PIC18 had only unconditional branch instructions, conditional jumps are synthesized by a conditional skip (with the opposite condition) followed by a branch. Skips are also of utility for conditional execution of any immediate single following instruction. The PIC architecture has no (or very meager) hardware support for saving processor state when servicing interrupts16. The 18 series improved this situation by implementing shadow registers which save several important registers during an interrupt. 5.2.7 Criticisms PIC microcontrollers have a very small set of instructions, leading some to consider them RISC devices. However, the PIC architecture does not reflect many of the advantages of RISC design. For example: PIC does not have a load-store architecture, as memory is directly referenced in arithmetic and logic operations; it has a single working register, while RISC designs typically include 16 or more general purpose registers; it’s addressing modes are not orthogonal, since some instructions can address RAM or immediate data, while others can only use the working register; bank switching is required to access the entire RAM of many PIC devices, making the development of libraries of position-independent code complex and inefficient; a stack cannot be implemented efficiently, so it is difficult to generate reentrant17 code. These properties have made it difficult to microcontrollers. While several commercial software Small Device C Compiler has not contrast, Atmel's AVR microcontrollers (which 6EE develop compilers that target PIC compilers are available, the Free yet completed support for PIC. By are competitive with PIC in terms of Van Hoylandt Roel 2007-2008 DCF77 klok met PIC µC 78 hardware capabilities and price, but feature a RISC instruction set) have long been supported by the GNU C Compiler. PIC assembly language code can be difficult to comprehend due to the limited addressing modes, code obfuscation18 via the "skip" instruction, and register juggling19 through the accumulator. However, it should be noted that judicious20 use of simple macros can make PIC assembly language much more palatable, but at the cost of a reduction in performance. For example, the original Parallax PIC assembler "pasm" has macros which hide W and make the PIC look like a two-address machine. It has macroinstructions like "mov b,a" (move the data from address a to address b) and "add b,a" (add data from address a to data in address b). It also hides the skip instructions by providing three operand branch macroinstructions such as "cjne a,b,dest" (compare a with b and jump to dest if they are not equal). Other drawbacks have been addressed in the PIC18 and PIC24/dsPIC series, but still apply to earlier cores: data stored in program memory is space inefficient and/or time consuming to access, as it is not directly addressable. This is true of most Harvard architecture microcontrollers; the PIC architecture is somewhat unfriendly to high level language compilation; • a data stack implementation (for parameters and locals) would be dreadfully inefficient, leading to compilers storing these values at fixed memory locations. Thus, most C compilers do not generate re-entrant code; • the instruction set lacks an indexed addressing mode; the call stack is so small that program structure must often be flattened; the call stack is not addressable, so pre-emptive task switching cannot be implemented. 5.3 Lexicon English 1 To derive 2 Feature 3 Single cycle execution 4 Delay 5 CPU 6 7 8 9 10 Peripheral Purpose Additional Core To Synthesize 6EE Dutch Afleiden Eigenschappen In één keer uitvoerbaar English 11 To implement 12 Accessible 13 Support Dutch Uitvoeren Toegankelijk Steun Vertraging Centrale verwerkings eenheid Rand Doel Extra Kern Samenstellen 14 Lacking 15 Arithmetic Ontbreken Rekenkundig 16 17 18 19 20 Interrupt Re-entrant Obfuscation Juggling Judicious Van Hoylandt Roel Onderbreking Inspringend Verduistering Het jongleren met Oordeelkundig 2007-2008 DCF77 klok met PIC µC 79 6 Bibliografie http://home.scarlet.be/on4cp/cursus/radio/regul.htm http://home.iae.nl/users/pouweha/lcd/lcd0.shtml#general http://www.picbasic.nl http://www.wikipedia.com http://www.electronicengineering.nl/hogendorp/mplab%20files/Beschrijving%2 0PIC%20programmer.doc http://www.microchip.com Bron Frans artikel: http://www.aurel32.net/elec/dcf77.php Bron Engels artikel: http://en.wikipedia.org/wiki/Pic_microcontroller Alle figuren zijn ofwel gekopieerd uit bovenstaande referenties, ofwel door mezelf getekend of herwerkt. 6EE Van Hoylandt Roel 2007-2008