Gemeentelijk Technisch Instituut

advertisement
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
Download