Geïntegreerde Proef: DCF77-klok met PIC microcontroller

advertisement
Geïntegreerde Proef:
DCF77-klok met PIC
microcontroller
Van Hoylandt Roel
2007 - 2008
6EE - 4
Hoofdmenu
Inhoud Presentatie 1:
Omschrijving
Inhoud Presentatie 2:
Blokschema
Motivatie
Herhaling: DCF77
Blokschema
PIC µC
DCF77
Software
Ontvanger
Extra
Voeding
Display
Schema en printontwerp
Behuizing
Stand van zaken
Extra
Voorstelling beëindigen
Presentatie 1 >
Omschrijving
 Haalt uit zichzelf de juiste tijd en datum op doormiddel van het DCF77 signaal
 Gebruikt een PIC microcontroller voor alle berekeningen
 HD44780 compatibel PLED-display
 7805 Spanningsregelaar als voeding
Gebruiksvriendelijk,
Geen instellingen nodig, geen knoppen, enkel aansluiten van voeding en
ontvanger
⃔ ⃕
Presentatie 1 >
Motivatie
 Microcontrollers zijn boeiende dingen
 Een klok die altijd juist staat is handig om te hebben
 Ik vindt het leuk om er achter te komen hoe iets werkt
 Combinatie van elektronica/computers/programmeren
 Ik had basiskennis van zaken voor ik er aan begon
⃔ ⃕
Presentatie 1 >
Blokschema
Voeding
DCF77
Antenne
DCF77:
PIC µC
Display
AM-Signaal met tijd en datum informatie
Antenne: Ontvangt het DCF77 signaal en zet het om naar een bruikbaar signaal
PIC µC:
Hart van de schakeling, ontvangt, decodeert de informatie, laat de
tijd en datum zien op het display
Display: Maakt de tijd en datum zichtbaar
Voeding: Zorgt ervoor dat elke onderdeel een correcte spanning krijgt
⃔ ⃕
Presentatie 1 >
DCF77
Voeding
DCF77
Antenne
PIC µC
Display
Algemeen
Informatie in het signaal
Bitstructuur
AM
Protocol
Pariteit
⃔ ⃕
DCF77 >
Algemeen
Deutschland
C Kenteken lange golf
Frankfurt (op 25 km van Mainflingen)
77 Freq. uitgezonden signaal (77,5 kHz)
Mainflingen
Signaal is zo goed als constant te ontvangen
(99.87 % van de tijd)
Als tijdbasis worden er 3 atoomklokken gebruikt
⃔ ⃕
DCF77 >
Informatie in het signaal
 Reserve/hoofd antenne in gebruik
 Dag van de week (1-7)
 Zomertijd/wintertijd
 Maand (1-12)
 Minuten (0-59)
 Jaar (bv: 2008)
 Uren (0-23)
 Meteotime (Licentie verplicht)
 Dag van de maand (1-31)
⃔ ⃕
DCF77 >
Bitstructuur
Elke seconde wordt er 1 bit uitgezonden,
behalve op seconde 59 → 59 bits per minuut
⃔ ⃕
DCF77 >
AM
Het DCF77-signaal wordt uitgezonden als een AM-signaal
 Freq. signaal = constant
 Amplitude signaal afhankelijk van
inkomend signaal
⃔ ⃕
DCF77 >
Protocol
Gemoduleerd tot 25% gedurende:
 100 ms: ontvangen bit is een 0
 200 ms: ontvangen bit is een 1
Willekeurige moment
Minuutovergang
⃔ ⃕
DCF77 >
Pariteit
Pariteit is dient voor controle van de ontvangen data
DCF77 maakt gebruik van even pariteit
Aantal ontvangen énen is altijd even
0110 1011 1 → Even → Juist
0110 1010 1 → Oneven → Fout
⃔ ⃕
Presentatie 1 >
Ontvanger
Voeding
DCF77
Antenne
PIC µC
Display
Ontvangstmodule
Open collector uitgangen
Principe werking
⃔ ⃕
Ontvanger >
Ontvangstmodule
1.
Massa
2.
Voedingsspanning
3.
DCF77 uitgang (open collector)
4.
Geïnverteerde DCF77 uitgang (open collector)
Uin = 1,2 - 15 V DC
Iin gebruik = 3 mA
Iuit max = 1 mA
Uuit max = 30 V
⃔ ⃕
Ontvanger >
Open collector uitgangen
“H”
0V
5V
“L”
→ 10 kOhm → Imax = 0,5 mA
⃔ ⃕
Ontvanger >
Principe werking
Amplitude verzwakt tot 25 % → Uu = 5 V
Signaal is uitleesbaar door de microcontroller
⃔ ⃕
Presentatie 1 >
Voeding
Voeding
DCF77
Antenne
PIC µC
Display
Schema
Afvlakcondensatoren
Spanningsregelaar 7805
Zenerstabelisatie
Spanningsstabbelisatie
⃔ ⃕
Voeding >
Schema
 Diode
 Afvlakcondensatoren
 Spanningsregelaar
⃔ ⃕
Voeding >
Afvlakcondensatoren
Laagfrequente afvlakking
Richtlijn:
2200 µF per opgenomen Ampère
Hoogfrequente afvlakking
Typische waarde: 100 nF
⃔ ⃕
Voeding >
Spanningsregelaar 7805
Maakt van een variabele spanning een stabiele 5 Volt spanning
Eigenschappen:
 TO220 behuizing
 Stroombegrenzing (1 A)
 Temperatuurbegrenzing (150 °C)
Opgewekt vermogen:
⃔ ⃕
Voeding >
Zenerstabbelisatie
Te grote belasting haalt de zener uit stabelisatie
⃔ ⃕
Voeding >
Spanningsstabbelisatie
Stel Uuit stijgt:
Stel Uuit daalt:
 Ub2 stijgt
 Ub2 daalt
 T2 gaat meer in doorlaat  T2 gaat meer in sper
 UR1 stijgt
 UR1 daalt
 Ub1 daalt
 Ub1 stijgt
 T1 gaat meer is sper
 T1 gaat meer doorlaat
 Uuit daalt
Uuit stijgt
Stel Iuit wordt te groot:
UR5
R5
T1
In
Out
Ub1
R1
R3
R2
T2
UZ
Ub2
 UR5 > 0.7 Volt
 T3 gaat (meer) in doorlaat
Q3
R4
D1
 UR1 stijgt
 Ub1 daalt
 T1 gaat meer sper
GND
Uuit daalt
⃔ ⃕
Presentatie 1 >
Display
Voeding
DCF77
Antenne
PIC µC
Display
Algemeen
Aansluitpinnen
HD44780 controller
DDRAM
CGROM
Instructies
⃔ ⃕
Display >
Algemeen
PLED (Polymer Light Emitting Diodes) display: Laag verbruik, Helder
LCD (Liquid Crystal Display): Groot verbruik (achtergrond verlichting), van ver moeilijk leesbaar
2 Karakters
16 Karakters
32 karakters x 40 pixels = 1280 pixels
→ Onmogelijk om aan te sturen met µC
→ Aparte controller voor display
⃔ ⃕
Display >
Aansluitpinnen
Deze pinnen dienen voor:
 Aansluiten voeding
 Regelen Helderheid
 Communicatie met display controller
Pinfunctie:
Aansluitpinnen
1: Massa (0 V)
2: Power Supply (+ 5 V)
3: Contrast/Brightness
4: Function Select (IR/DR)
5: Read/Write
6: Enable
7-14: Databus
15-16: No connection
⃔ ⃕
Display >
HD44780 controller
Deze controller van Hitachi is zeer populair,
een bekende kloon is KS0066 (van SEC).
Eigenschappen:
 Kan displays van verschillende groottes aansturen (1 x 8, 2 x 8, 1 x 16, 2 x 16, …)
 Kan displays met verschillende karaktergroottes aansturen (5 x 8 of 5 x 10 pixels)
 Laag verbruik (batterijvoeding)
 Simpel aan te sturen
 4 of 8 bits mode
Er zijn verschillende versies verkrijgbaar
 HD44780A00 (met Japaneese karakters)
 HD44780A02 (met Europeese karakters bv: ç, è, é, ê, ë, ù, ú, û en ü )
⃔ ⃕
Display >
DDRAM
Display Data Random Acces Memory
Houdt bij welke en waar de karakters op het display staan.
Elke geheugenplaats:
 Heeft een eigen nummer (adres)
 Is 1 byte groot (kan 1 karakter opslaan)
 Kan op elk moment beschreven worden
 Kan op elk moment uitgelezen worden
Een cursor duidt het actieve adres aan
⃔ ⃕
Display >
CGROM
Character Generator Read Only Memory
Vanuit het DDRAM wordt er naar dit geheugen verwezen
Het CGROM vertelt hoe een karakter wordt opgebouwd
De tabel volgt zoveel mogelijk de ASCII code
bv: (65) 10 = (0100 0001) 2 = “A”
De eerste 8 geheugenplaatsen kunnen zelf beschreven
worden → CGRAM
HD44780A02: Europees
HD44780A00: Japanees
⃔ ⃕
Display >
Instructies (1)
Datalijnen (juist) wijzigen → Instructie uitvoeren
Er zijn twee soorten instructie’s:
 Instructies die schrijven naar het display
 Instructies die uitlezen van het display
Uitlezen van het display is overbodig in deze schakeling,
→ Read/Write lijn is met de massa verbonden
→ Er kunnen nog 9 verschillende instructie’s worden uitgevoerd
Clear Display
Display on/off control
Set CGRAM address
Return home
Cursor or display shift
Set DDRAM address
Entry mode set
Function set
Write data to CGRAM or DDRAM
⃔ ⃕
Display >
Instructies (2)
Clear Display
Maakt het volledige display leeg en zet de cursor op positie 0.
Return home
Zet de cursor op positie 0 en maakt alle schuif acties ongedaan.
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.
I/D=0: cursor telt af
S = 0: schuiven niet toegestaan
I/D=1: cursor telt op S = 1: schuiven toegestaan
⃔ ⃕
Display >
Instructies (3)
Display on/off control
Zet het hele display, cursoraanduiding (lijn) of pinkende cursoraanduiding (blok) aan of uit.
D = 0: Display uit
C = 0: Cursoraanduiding (lijn) uit
B = 0: Cursoraanduiding (blok) uit
D = 1: Display aan
C = 1: Cursoraanduiding (lijn) aan
B = 1: Cursoraanduiding (blok) aan
⃔ ⃕
Display >
Instructies (4)
Cursor or display shift
Verplaatst de cursor en schuift display naar links of rechts.
S/C = 0: Verplaats cursor R/L = 0: Schuif naar links
S/C = 1: Schuif display
R/L = 1: Schuif naar rechts
Function set
Stelt in of er met 8 of 4 bits communicatie wordt gewerkt, hoeveel lijnen het display bestaat en
uit hoeveel pixels 1 karakter bestaat.
DL=0:
4 bits communicatie
DL=1: 8 bits communicatie
N = 0: Display met 1 lijn
N = 1:
F = 0:
Karakters opgebouwd uit 5 x 8 pixels
F = 1:
Karakters opgebouwd uit 5 x 10 pixels
Display met 2 lijnen
⃔ ⃕
Display >
Instructies (5)
Set CGRAM address
Stelt het CGRAM adres in, de CGRAM data moet verzonden worden achter deze instructie.
ACG: CGRAM adres
Set DDRAM address
Stelt het DDRAM adres in, de DDRAM data moet verzonden worden achter deze instructie.
ADD: DDRAM adres
Write data to CGRAM or DDRAM
Schrijft data in het GGRAM of DDRAM
D7-D0: Te verzenden byte (data)
⃔ ⃕
Display >
Protocol
De display kan aangestuurd worden in 4 of 8 bits modus.
 8 Bits modus: Verstuur instructie/data per byte
 4 Bits modus: Verstuur instructie/data in twee halve byte’s
Er wordt gebruik gemaakt van de 4 bits modus:
→ datalijnen 0-3 blijven ongebruikt (pull-up weerstanden in de controller)
⃔ ⃕
Schema >
Schema: voeding
⃔ ⃕
Display >
Schema: microcontroller
⃔ ⃕
Schema >
Schema: extern
⃔ ⃕
Printontwerp >
Printontwerp
⃔ ⃕
Extra >
Behuizing
⃔ ⃕
Extra >
Stand van zaken
Reeds af:
 Schema
 Printontwerp
 Prototype
 Print
 Software (grootste deel)
Nog te doen:
 Print solderen
 Behuizing maken
 Software afwerken
 Dossier verder afwerken
⃔ ⃕
Extra >
Extra
FM-AM
Uitbreiding op zenerstabbelisatie
Opstarten display
Tekst schrijven naar het display
Zelf ontworpen karakters
⃔ ⃕
Extra >
FM-AM
De meeste storingen (bv: bliksem) hebben invloed op de amplitude van het signaal,
FM is storingsongevoeliger
AM is te ontvangen met kleine goedkope ontvangers
⃔ ⃕
Extra >
Uitbreiding op zenerstabbelisatie
⃔ ⃕
Extra >
Opstarten display
 Voedingsspanning
 Wacht (controller reset zich zelf)
 RS lijn laag → er volgens instructies
 “Function set”: 4 bits modus
 Herhaal de vorige stap 3 keer
 “Function set”: 4 bits modus, 2 lijnen, 5 x 8 pixels
 “Clear Display”
 “Entry mode set”: cursor optellen, niet schuiven
 “Display on/off control”: display aan, cursoraanduidigen uit
⃔ ⃕
Extra >
Tekst schrijven naar het display
 “Set DDRAM address” met adres A
bv: A = ( 64 )10 = ( 0100 0000 )2
 “Write data to CGRAM or DDRAM” met data D
bv: D = ( 68 )10 = ( 0100 0100 )2 = “D”
 “Write data to CGRAM or DDRAM” met data D
bv: D = ( 67 )10 = ( 0100 0011 )2 = “C”
“Write data to CGRAM or DDRAM” met data D
bv: D = ( 70 )10 = ( 0100 0110 )2 = “F”
⃔ ⃕
Extra >
Zelf ontworpen karakters
Splits op in 5 bytes:
Byte 0: 00010101
Byte 1: 00010110
Byte 2: 01111100
Byte 3: 00010110
Byte 4: 00010101
 “Set CGRAM address” met adres A
bv: A = ( 0 )10 = ( 0000 0000 )2
 “Write data to CGRAM or DDRAM” met byte 0
…
 “Write data to CGRAM or DDRAM” met byte 4
⃔ ⃕
Presentatie 2 >
Blokschema
Voeding
DCF77
Antenne
DCF77:
PIC µC
Display
AM-Signaal met tijd en datum informatie
Antenne: Ontvangt het DCF77 signaal en zet het om naar een bruikbaar signaal
PIC µC:
Hart van de schakeling, ontvangt, decodeert de informatie, laat de
tijd en datum zien op het display
Display: Maakt de tijd en datum zichtbaar
Voeding: Zorgt ervoor dat elke onderdeel een correcte spanning krijgt
⃔ ⃕
Presentatie 2 >
Herhaling: DCF77
100 ms = 0
200 ms = 1
⃔ ⃕
Presentatie 2 >
PIC µC
Voeding
DCF77
Antenne
PIC µC
Display
Algemeen
PIC microcontroller
16F648A
Blokschema: 16F648A
Aansluitpinnen
Interrupts
TMR0
Oscillator
RA5/MCLR/Vpp -pin
⃔ ⃕
PIC µC >
Algemeen
Een µC steunt op de volgende basispijlers:
 Invoer,
 Geheugen,
 Verwerking,
Zelfde basispijlers dan bij een PC
 Uitvoer.
µC (microcontroller) ↔ µP (microprocessor)
Invoer, geheugen, verwerking en uitvoer
in één IC.
Weinig (tot geen) extra randcomponenten
nodig.
Enkel verwerking (= processor) in één IC.
Geheugenchips en invoer-, uitvoer
schakelingen zijn nog nodig.
⃔ ⃕
PIC µC >
PIC microcontroller
Gebruikte type µC is een PIC µC.
PIC staat voor:
 Programmable Interface Controller,
 Programmable Intelligent Computer,
 Peripheral Interface Controller.
PIC µC’s:
 Zijn opgebouwd volgens de Harvard-architectuur.
 Gescheiden bussen en adresruimtes voor data en instructies.
→ Snellere processors dan “Von Neumann”-processors
 Bevaten een RISC (Reduced Instruction Set Computer) processor.
→ Kleine instructieset (35 intructies)
⃔ ⃕
PIC µC >
16F648A
Het gebruikte type µC is de 16F648A.
Programmageheugen is 4 kB groot, 16F628A heeft 2 kB.
Belangrijkste eigenschappen:
 Isink = 25 mA, Isource = 20 mA,
 In-circuit serial programming (ISCP) ondersteuning,
 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,
 TMR0 8-bit timer/counter met 8-bit programmeerbare prescaler,
 3,0 Volt < Uvoeding < 5,5 Volt.
…
⃔ ⃕
PIC µC >
Blokschema 16F648A
⃔ ⃕
PIC µC >
Aansluitpinnen
Poort A
Poort B
Voeding
⃔ ⃕
PIC µC >
Interrupts
Interrupt = Onderbreking
Normaal programma verloop
Programma verloop met interrupt
Start
Start
Hoofdprog.
Hoofdprog.
Instructie 1
Instructie 2
…
Instructie x
Instructie 1
Instructie 2
…
Instructie x
Bij Interrupt
ISR
Instructie 1
Instructie 2
…
Instructie x
⃔ ⃕
PIC µC >
TMR0
Prescaler (= voorpulsteller)
Deelt de inkomende
pulsen door 2, 4, 8, …
Timer 0
Prescaler
1:
Instructie klok
= fosc / 4
0
2
4
8 16 32 64 128 256
8-bits breed register,
overlopen van 255 naar 0
geeft een interrupt
T0CS
RA4/T0CKI/
CMP2
T0SE
1
PS2, PS1, PS0
TMR0
TMR0 Source Edge select
0: Reageer op pos. flank
1: Regaeer op neg. flank
TMR0 Clock Source Select
0: Instruction Cycle clock
1: RA4/T0CKI/CMP2 pin
⃔ ⃕
PIC µC >
Oscillator
Wekt een signaal met vaste frequentie op,
→ Deze frequentie bepaalt de “snelheid” van de µC
→ Kristal in een Pierce oscillator schakeling
RA5/MCLR/Vpp -pin
Deze pin kan men gebruiken als:
 Digitale ingang
 Reset ingang
→ 0 Volt: µC in reset
→ 5 Volt: µC in run
 VRA5 = Vpp = 13 V
→ Programmeermodus
→ RB6 = Program-clock
→ RB7 = Program-data
⃔ ⃕
Presentatie 2 >
Software
Algemeen
Principe
Blokschema
⃔ ⃕
Software >
Algemeen
Hogere programmeertaal
Mens ↔ Machine
bestand.jal
vb: LED_rood = off
bestand.asm
vb: BCF PORTB,2
bestand.hex
vb: 020000040000FA
Lagere programmeertaal
⃔ ⃕
Software >
Principe
Ontvangen pariteit juist → DCFcontrole = DCFontvangen
DCFontvangen = DCFcontrole → Klokdisp = DCFontvangen
Echte tijd
DCFontvangen
DCFcontrole
KlokDisp
Actie
17:04:01
00:00
00:00
00:00
Geen
17:05:01
17:05
00:01
00:01
DCFcontrole = 17:05
17:06:01
17:06
17:06
00:02
DCFcontrole = 17:06
Klokdisp = DCFontvangen
17:07:01
17:07
17:07
17:07
DCFcontrole = 17:07
Klokdisp = DCFontvangen
17:08:01
14:45
17:08
17:08
Geen
17:09:01
17:09
17:09
17:09
DCFcontrole = 17:09
Klokdisp = DCFontvangen
⃔ ⃕
Software >
Blokschema
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
⃔ ⃕
Blokschema >
Var. declareren/Disp. instellen
Start
;============================================
;Variabelen declareren
;============================================
var bit DCF_IN is pin_a2
pin_a2_direction = input
;============================================
;Display intstellingen
;============================================
var dword INTCNTR1
INTCNTR1 = 0
hd44780_clear
…
var word INTCNTR2
INTCNTR2 = 0
…
var byte i
var byte sec_disp
var byte sec_teller
sec_teller = 0
var byte min_dcf
min_dcf = 0
var byte uur_dcf
uur_dcf = 0
hd44780_define(0,14,21,21,23,17,17,14,0)
-- klokje
hd44780_define(1,0,4,21,14,4,4,4,0)
-- antenne
hd44780_define(2,0,0,14,14,14,0,0,0)
-- puntje
hd44780_define(3,16,24,24,24,24,24,24,16)
-- links2
a
hd44780_define(4,1,3,3,3,3,3,3,1)
-- rechts2
b
hd44780_define(5,31,31,0,0,0,0,0,0)
-- boven
c
hd44780_define(6,31,31,0,0,0,0,31,31)
-- boven_onder d
hd44780_define(7,0,0,0,0,0,0,31,31)
-- onder
…
var bit DCF_bit[60]
…
const byte msg1[16] = {" ", 0 ," ","D","C","F","7","7",
"-","K","l","o","k"," ", 0 ," "}
…
⃔ ⃕
e
Blokschema >
TMR0/Start-teksten/Ant. Opstarten
;==============================================================
;Start-teksten
;==============================================================
;============================================
;TMR0 intstellingen
;============================================
;msg1 & msg2
hd44780_line1
i = 0
for 16 loop
GIE = on
;global interrupts enabled
hd44780 = msg1[i]
T0IE = on
;TMR0 interrupts enabled
i = i + 1
T0CS = off
(CLKOUT)
;Internal instruction cycle clock
end loop
PSA = off
;Prescaler is assigned to the
Timer0 module
hd44780_line2
PS2 = off
;000 => prescaler = 1:2
i = 0
PS1 = off
;9765,625 interrupts/sec
for 16 loop
PS0 = off
;=> 78125 interrupts/ 8 Seconds
hd44780 = msg2[i]
T0IF = off
;TMR0 flag bit
i = i + 1
end loop
delay_100ms( 10 )
…
;=======================================================================
;Antenne laten opstarten
;=======================================================================
while DCF_IN == on loop
end loop ;antenne is opgestart !
⃔ ⃕
while START_BIT_GEVONDEN == off loop
Blokschema >
Startbit zoeken
time_off = 0
while DCF_IN == off loop
delay_1ms(10)
time_off = time_off + 1
Neem time_off op
end loop
;============================================
;Startbit zoeken
;============================================
if i == 0 then
;maak valse starbit aan
i = 1
START_BIT_GEVONDEN = on
geen_signaal = on
hd44780_clear
end if
hd44780_line1
i = 0
for 16 loop
i = i - 1
;”Starbit zoeken !”
hd44780 = msg7[i]
hd44780_position(69)
i = i + 1
format_byte_dec(hd44780,i,2,0)
end loop
hd44780 = "/" hd44780 = "6" hd44780 = "0"
while DCF_IN == off loop end loop
while DCF_IN == on loop end loop
while DCF_IN == on loop end loop
;dcf_in wordt laag !
if time_off >= 100 then
T0IE = off
;TMR0 disabled
START_BIT_GEVONDEN = off
T0IE = on
;TMR0 enabled
i = 60
START_BIT_GEVONDEN = on
hd44780_position(69)
sec_teller = 0
hd44780 = "6" hd44780 = "0" hd44780 = "/"
hd44780 = "6" hd44780 = "0" ;60/60
time_off = 1000 ms
→ Startbit
end if
end loop
⃔ ⃕
Hoofdlus
forever loop
if startbit == on & pos_flank == on then
sec_teller = 0
end if
if neg_flank == on then
geen_signaal = off
startbit = off
if 585 < aan_tijd & aan_tijd < 1367
then
bit_dcf = off
elsif 1562 < aan_tijd & aan_tijd < 2343 then
bit_dcf = on
elsif 2342 <= aan_tijd then
dcf_frame_error = on
end if
if sec_disp == 0 & sec_0_eenmaal == on then
min_dcf2 = min_dcf2 + 1
if min_dcf2 == 60 then
min_dcf2 = 0
uur_dcf2 = uur_dcf2 + 1
if uur_dcf2 == 24 then
uur_dcf2 = 0
end if
end if
sec_0_eenmaal = off
end if
if sec_teller == 1 then
sec_0_eenmaal = on
if pos_flank == on & par_min_error == off &
par_uur_error == off & par_dat_error == off &
dcf_frame_error == off then
sec_disp = 1
pos_flank = off
INTCNTR2 = 0
INTCNTR1 = 0
end if
if par_min_error == off & par_uur_error == off &
par_dat_error == off & dcf_frame_error == off &
eerste_minuut == 0 then
min_disp = min_dcf
uur_disp = uur_dcf
dag_disp = dag_dcf
dag_week_disp = dag_week_dcf
maand_disp = maand_dcf
jaar_disp = jaar_dcf
initialiseren = off
end if
end if
Status
DCF-bit ?
decode_dcf
neg_flank = off
end if
if 9277 < uit_tijd & uit_tijd <= 13671 then
startbit = on
end if
if 19531 <= aan_tijd then
dcf_frame_error = on
geen_signaal = on
end if
if 65400 <= aan_tijd then
aan_tijd = 65400
end if
if 65400 <= uit_tijd then
uit_tijd = 65400
end if
if sec_teller == 58 then
eerste_minuut = 0
end if
if uur_disp == 0 & min_disp == 0 & sec_disp == 2 then
initialiseren = on
end if
Pariteit goed
→ waardes
wegschrijven
if geen_signaal == off & copy_geen_signaal == on then
initialiseren = on
end if
copy_geen_signaal = geen_signaal
refresh_disp
end loop
⃔ ⃕
ISR
DCF_IN_copy1 = DCF_IN
if DCF_IN_copy1 == on & DCF_IN_copy2 == off then
; positieve flank
if aan_tijd > 488 then ; +/- 0,05 sec, tegen "dender"
sec_teller = sec_teller + 1
end if
procedure isr is ; elke 102.4 µs
pragma interrupt
INTCNTR1 = INTCNTR1 + 1
INTCNTR2 = INTCNTR2 + 1
ani_counter = ani_counter + 1
pos_flank = on
aan_tijd_enable = 1
uit_tijd_enable = 0
aan_tijd = 0
if INTCNTR1 == 78124 then
;elke 8 sec (100 % juist)
INTCNTR2 = 0
INTCNTR1 = 0
disp_groot = ! disp_groot
end if
If INTCNTR2 == 9765 then
;elke 0,999936 sec (64 µs vertraagt)
INTCNTR2 = 0
sec_disp = sec_disp + 1
if sec_disp == 60 then
sec_disp = 0
min_disp = min_disp + 1
if min_disp == 60 then
min_disp = 0
uur_disp = uur_disp + 1
if uur_disp == 24 then
uur_disp = 0
end if
end if
end if
end if
1 sec.
Timer
elsif DCF_IN_copy1 == off & DCF_IN_copy2 == on then
;negatieve flank
neg_flank = on
aan_tijd_enable = 0
uit_tijd_enable = 1
uit_tijd = 0
end if
DCF_IN_copy2 = DCF_IN_copy1
if aan_tijd_enable == 1 & DCF_IN_copy1 == on then
aan_tijd = aan_tijd + 1
end if
if uit_tijd_enable == 1 & DCF_IN_copy1 == off then
uit_tijd = uit_tijd + 1
end if
LED = DCF_IN
T0IF = off
end procedure
aan_tijd/
uit_tijd
timer
;TMR0 flag bit
⃔ ⃕
Decode_dcf
procedure decode_dcf is
;==BIT 20========================================
if sec_teller == 20 & bit_dcf == off then
;bit 20 moet 1 zijn
par_min_error = on
par_uur_error = on
par_dat_error = on
dcf_frame_error = on
elsif sec_teller == 20 & bit_dcf == on then
par_min_error = on
par_uur_error = on
par_dat_error = on
dcf_frame_error = off
min_dcf = 0
uur_dcf = 0
dag_dcf = 0
dag_week_dcf = 0
maand_dcf = 0
jaar_dcf = 0
P1 = off
P2 = off
P3 = off
end if
;==MINUTEN=======================================
if sec_teller == 21 & bit_dcf == on then
;waarde 1 bij de minuten
min_dcf = min_dcf + 1
P1 = ! P1
elsif sec_teller == 22 & bit_dcf == on then
;waarde 2 bij de minuten
min_dcf = min_dcf + 2
P1 = ! P1
elsif sec_teller == 23 & bit_dcf == on then
;waarde 4 bij de minuten
min_dcf = min_dcf + 4
P1 = ! P1
elsif sec_te...
...
elsif sec_teller == 27 & bit_dcf == on then
;waarde 40 bij de minuten
min_dcf = min_dcf + 40
P1 = ! P1
elsif sec_teller == 28 then
;pariteit bij de minuten
if P1 != bit_dcf | min_dcf >= 60 then
par_min_error = on
;foute pariteit
else
;goede pariteit
if min_dcf == min_dcf2 then
par_min_error = off
else
par_min_error = on
end if
min_dcf2 = min_dcf
end if
end if
...
end procedure
⃔ ⃕
if geen_signaal == on then
hd44780_line2
i = 0
for 16 loop
hd44780 = msg9[i]
i = i + 1
end loop
elsif initialiseren == on then
hd44780_line2
i = 0
for 16 loop
hd44780 = msg8[i]
i = i + 1
end loop
else
hd44780_line2
hd44780 = " "
if dag_week_disp == 1 then
hd44780 = "M"
hd44780 = "a"
hd44780 = "a"
elsif dag_week_disp == 2 then
hd44780 = "D"
hd44780 = "i"
hd44780 = "n"
...
elsif dag_week_disp == 7 then
hd44780 = "Z"
hd44780 = "o"
hd44780 = "n"
end if
Refresh_disp (1)
procedure refresh_disp is
if disp_groot == on then
if aantal_schuif == 20 then
ani_counter = 0
end if
if ani_counter >= 160 then
hd44780_shift_left( 1 )
aantal_schuif = aantal_schuif + 1
ani_counter = 0
end if
else
if aantal_schuif == 0 then
ani_counter = 0
end if
if ani_counter >= 160 then
hd44780_shift_right( 1 )
aantal_schuif = aantal_schuif - 1
ani_counter = 0
end if
end if
hd44780_line1
for 4 loop
hd44780 = " "
end loop
format_byte_dec(hd44780,uur_disp,2,0)
hd44780 = ":"
format_byte_dec(hd44780,min_disp,2,0)
hd44780 = ":"
format_byte_dec(hd44780,sec_disp,2,0)
Maa./
Din./
Woe./
…
hd44780 = "."
hd44780 = " "
format_byte_dec(hd44780,dag_disp,2,0)
hd44780 = "-"
format_byte_dec(hd44780,maand_disp,2,0)
hd44780 = "-"
format_byte_dec(hd44780,jaar_disp,2,0)
hd44780 = " "
hd44780 = " "
23:59:14
for 4 loop
hd44780 = " "
end loop
end if
...
23-06-08
⃔ ⃕
Refresh_disp (2)
...
eenh_uur = uur_disp % 10
tien_uur = uur_disp / 10
eenh_min = min_disp % 10
tien_min = min_disp / 10
hd44780_line3
bigchar_line1(tien_uur)
bigchar_line1(eenh_uur)
hd44780 = segp
bigchar_line1(tien_min)
bigchar_line1(eenh_min)
for 3 loop
hd44780 = " "
end loop
hd44780_line4
bigchar_line2(tien_uur)
bigchar_line2(eenh_uur)
hd44780 = segp
bigchar_line2(tien_min)
bigchar_line2(eenh_min)
hd44780 = " "
format_byte_dec(hd44780,sec_disp,2,0)
procedure bigchar_line1(byte in char) is
if char == 0 then
hd44780 = segb
hd44780 = segc
hd44780 = sega
elsif char == 1 then
hd44780 = " "
hd44780 = " "
hd44780 = sega
elsif char == 2 then
hd44780 = " "
hd44780 = segd
hd44780 = sega
...
elsif char == 9 then
hd44780 = segb
hd44780 = segd
hd44780 = sega
end if
end procedure
end procedure
⃔ ⃕
Software >
Programmeertoestel
Bestand.hex
&
Bumblebee.exe
Galvanische scheiding
5
RS232
USB
Galva-wisp
USB ► RS232
DCF77-klok
⃔ ⃕
Extra >
Extra
Codeformaten
Film, na synchronisatie
Code
Bumblebee
⃔ ⃕
Bedankt voor de aandacht
Naar hoofdmenu
Voorstelling beëindigen
⃔ ⃕
Extra >
Codeformaten
Byte-oriented file register operations
Vb:
CLRF, INCF, MOVWF, …
Bit-oriented file register operations
Vb:
BCF, BTFSC, …
Literal and control operations
General instructions
Vb:
ADDLW, MOVLW, …
CALL en GOTO instructies
Vb:
CALL & GOTO
⃔ ⃕
Download