geïntegreerde proef: dcf77-klok met pic microcontroller
DESCRIPTION
Geïntegreerde Proef: DCF77-klok met PIC microcontroller. Van Hoylandt Roel 2007 - 2008 6EE - 4. Hoofdmenu. Inhoud Presentatie 1:. Inhoud Presentatie 2:. Omschrijving. Blokschema. Motivatie. Herhaling: DCF77. Blokschema. PIC µC. DCF77. Software. Ontvanger. Extra. Voeding. Display. - PowerPoint PPT PresentationTRANSCRIPT
Geïntegreerde Proef:
DCF77-klok met PIC microcontroller
Van Hoylandt Roel2007 - 2008
6EE - 4
Hoofdmenu
Voorstelling beëindigen
Inhoud Presentatie 1:OmschrijvingMotivatieBlokschema
DCF77OntvangerVoedingDisplay
Schema en printontwerpBehuizing
Inhoud Presentatie 2:
Stand van zakenExtra
BlokschemaHerhaling: DCF77PIC µC
SoftwareExtra
OmschrijvingPresentatie 1 >
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
MotivatiePresentatie 1 >
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
BlokschemaPresentatie 1 >
Voeding
PIC µCAntenne
DCF77
Display
Antenne: Ontvangt het DCF77 signaal en zet het om naar een bruikbaar signaal
DCF77: AM-Signaal met tijd en datum informatie
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
DCF77Presentatie 1 >
Voeding
PIC µCAntenne
DCF77
Display
AlgemeenInformatie in het signaalBitstructuur
AMProtocolPariteit
AlgemeenDCF77 >
Mainflingen
Deutschland
C Kenteken lange golf
Frankfurt (op 25 km van Mainflingen)
77 Freq. uitgezonden signaal (77,5 kHz)
Signaal is zo goed als constant te ontvangen (99.87 % van de tijd)
Als tijdbasis worden er 3 atoomklokken gebruikt
Informatie in het signaalDCF77 >
Reserve/hoofd antenne in gebruik
Zomertijd/wintertijd
Minuten (0-59)
Uren (0-23)
Dag van de maand (1-31)
Dag van de week (1-7)
Maand (1-12)
Jaar (bv: 2008)
Meteotime (Licentie verplicht)
BitstructuurDCF77 >
Elke seconde wordt er 1 bit uitgezonden, behalve op seconde 59 → 59 bits per minuut
AMDCF77 >
Het DCF77-signaal wordt uitgezonden als een AM-signaal
Freq. signaal = constant
Amplitude signaal afhankelijk van inkomend signaal
ProtocolDCF77 >
Gemoduleerd tot 25% gedurende:
100 ms: ontvangen bit is een 0
200 ms: ontvangen bit is een 1
Willekeurige moment Minuutovergang
PariteitDCF77 >
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
OntvangerPresentatie 1 >
Voeding
PIC µCAntenne
DCF77
Display
OntvangstmoduleOpen collector uitgangenPrincipe werking
OntvangstmoduleOntvanger >
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
Open collector uitgangenOntvanger >
“H”0 V
“L”5 V
→ 10 kOhm → Imax = 0,5 mA
Principe werkingOntvanger >
Amplitude verzwakt tot 25 % → Uu = 5 V
Signaal is uitleesbaar door de microcontroller
VoedingPresentatie 1 >
Voeding
PIC µCAntenne
DCF77
Display
SchemaAfvlakcondensatorenSpanningsregelaar 7805
ZenerstabelisatieSpanningsstabbelisatie
SchemaVoeding >
Diode
Afvlakcondensatoren
Spanningsregelaar
AfvlakcondensatorenVoeding >
Laagfrequente afvlakking
Richtlijn:
2200 µF per opgenomen Ampère
Hoogfrequente afvlakking
Typische waarde: 100 nF
Spanningsregelaar 7805 Voeding >
Maakt van een variabele spanning een stabiele 5 Volt spanning
Eigenschappen:
TO220 behuizing
Stroombegrenzing (1 A)
Temperatuurbegrenzing (150 °C)
Opgewekt vermogen:
ZenerstabbelisatieVoeding >
Te grote belasting haalt de zener uit stabelisatie
SpanningsstabbelisatieVoeding >
Stel Uuit stijgt:
Ub2 stijgt
T2 gaat meer in doorlaat
UR1 stijgt
Ub1 daalt
T1 gaat meer is sper
Uuit daalt
Stel Uuit daalt:
Ub2 daalt
T2 gaat meer in sper
UR1 daalt
Ub1 stijgt
T1 gaat meer doorlaat
Uuit stijgt
Stel Iuit wordt te groot:
UR5 > 0.7 Volt
T3 gaat (meer) in doorlaat
UR1 stijgt
Ub1 daalt
T1 gaat meer sper
Uuit daalt
D1
R1
R2
T2
T1
Q3
R5
R4
R3
In Out
GND
UZ
Ub2
Ub1
UR5
DisplayPresentatie 1 >
Voeding
PIC µCAntenne
DCF77
Display
AlgemeenAansluitpinnenHD44780 controller
DDRAMCGROMInstructies
AlgemeenDisplay >
16 Karakters
2 Karakters
PLED (Polymer Light Emitting Diodes) display: Laag verbruik, Helder
LCD (Liquid Crystal Display): Groot verbruik (achtergrond verlichting), van ver moeilijk leesbaar
32 karakters x 40 pixels = 1280 pixels
→ Onmogelijk om aan te sturen met µC
→ Aparte controller voor display
Aansluitpinnen Display >
Deze pinnen dienen voor:
Aansluiten voeding
Regelen Helderheid
Communicatie met display controller
AansluitpinnenPinfunctie:
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
HD44780 controller Display >
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 ü )
DDRAM Display >
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
CGROM Display >
Character Generator Read Only Memory
HD44780A02: Europees HD44780A00: Japanees
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
Instructies (1)Display >
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
Return home
Entry mode set
Display on/off control
Cursor or display shift
Function set
Set CGRAM address
Set DDRAM address
Write data to CGRAM or DDRAM
Instructies (2)Display >
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
Instructies (3)Display >
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
Instructies (4)Display >
Cursor or display shift
Verplaatst de cursor en schuift display naar links of rechts.
DL=0: 4 bits communicatie N = 0: Display met 1 lijn
DL=1: 8 bits communicatie N = 1: Display met 2 lijnen
F = 0: Karakters opgebouwd uit 5 x 8 pixels
F = 1: Karakters opgebouwd uit 5 x 10 pixels
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.
Instructies (5)Display >
Set CGRAM address
Stelt het CGRAM adres in, de CGRAM data moet verzonden worden achter deze instructie.
ADD: DDRAM adres
ACG: CGRAM adres
Set DDRAM address
Stelt het DDRAM adres in, de DDRAM data moet verzonden worden achter deze instructie.
D7-D0: Te verzenden byte (data)
Write data to CGRAM or DDRAM
Schrijft data in het GGRAM of DDRAM
ProtocolDisplay >
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: voedingSchema >
Schema: microcontrollerDisplay >
Schema: externSchema >
PrintontwerpPrintontwerp >
BehuizingExtra >
Stand van zakenExtra >
Reeds af:
Schema
Printontwerp
Prototype
Software (grootste deel)
Nog te doen:
Print solderen
Behuizing maken
Software afwerken
Dossier verder afwerken
ExtraExtra >
Opstarten displayTekst schrijven naar het displayZelf ontworpen karakters
FM-AMUitbreiding op zenerstabbelisatie
FM-AMExtra >
De meeste storingen (bv: bliksem) hebben invloed op de amplitude van het signaal,
FM is storingsongevoeliger
AM is te ontvangen met kleine goedkope ontvangers
Uitbreiding op zenerstabbelisatieExtra >
Opstarten displayExtra >
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
Tekst schrijven naar het displayExtra >
“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”
Zelf ontworpen karaktersExtra >
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
BlokschemaPresentatie 2 >
Voeding
PIC µCAntenne
DCF77
Display
Antenne: Ontvangt het DCF77 signaal en zet het om naar een bruikbaar signaal
DCF77: AM-Signaal met tijd en datum informatie
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
Herhaling: DCF77Presentatie 2 >
100 ms = 0
200 ms = 1
PIC µCPresentatie 2 >
Voeding
PIC µCAntenne
DCF77
Display
AlgemeenPIC microcontroller16F648A
Blokschema: 16F648AAansluitpinnenInterrupts
TMR0Oscillator RA5/MCLR/Vpp -pin
AlgemeenPIC µC >
Een µC steunt op de volgende basispijlers:
Invoer,
Geheugen,
Verwerking,
Uitvoer.
µC (microcontroller) ↔ µP (microprocessor)
Invoer, geheugen, verwerking en uitvoer in één IC.
Enkel verwerking (= processor) in één IC.
Weinig (tot geen) extra randcomponenten nodig.
Geheugenchips en invoer-, uitvoer schakelingen zijn nog nodig.
Zelfde basispijlers dan bij een PC
PIC microcontrollerPIC µC >
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)
16F648APIC µC >
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.
…
Blokschema 16F648APIC µC >
AansluitpinnenPIC µC >
Poort APoort BVoeding
InterruptsPIC µC >
Interrupt = Onderbreking
Start
Hoofdprog.
Instructie 1Instructie 2…Instructie x
Start
Hoofdprog.
Instructie 1Instructie 2…Instructie x
Bij Interrupt
ISR
Instructie 1Instructie 2…Instructie x
Normaal programma verloop Programma verloop met interrupt
TMR0PIC µC >
Instructie klok
= fosc / 4
TMR0
Prescaler
1 :256128643216842
PS2, PS1, PS0
RA4/T0CKI/CMP2
0
T0CS
1T0SE
TMR0 Source Edge select
0: Reageer op pos. flank
1: Regaeer op neg. flankTMR0 Clock Source Select
0: Instruction Cycle clock
1: RA4/T0CKI/CMP2 pin
Prescaler (= voorpulsteller)
Deelt de inkomende pulsen door 2, 4, 8, … Timer 0
8-bits breed register, overlopen van 255 naar 0 geeft een interrupt
OscillatorPIC µC >
Wekt een signaal met vaste frequentie op,
→ Deze frequentie bepaalt de “snelheid” van de µC
→ Kristal in een Pierce oscillator schakeling
RA5/MCLR/Vpp -pinDeze 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
SoftwarePresentatie 2 >
AlgemeenPrincipe
Blokschema
AlgemeenSoftware >
bestand.jal
bestand.asm
bestand.hex
Mens ↔ Machine
Lagere programmeertaal
Hogere programmeertaal
vb: LED_rood = off
vb: BCF PORTB,2
vb: 020000040000FA
PrincipeSoftware >
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:02DCFcontrole = 17:06
Klokdisp = DCFontvangen
17:07:01 17:07 17:07 17:07DCFcontrole = 17:07
Klokdisp = DCFontvangen
17:08:01 14:45 17:08 17:08 Geen
17:09:01 17:09 17:09 17:09DCFcontrole = 17:09
Klokdisp = DCFontvangen
Ontvangen pariteit juist → DCFcontrole = DCFontvangen
DCFontvangen = DCFcontrole → Klokdisp = DCFontvangen
BlokschemaSoftware >
Start
Variabelen declareren
Display instellen + zelf ontworpen tekens doorsturen
Timer 0 module instellen
Welkomstteksten tonen
Antenne opgestart?
Startbit?
DCF77 signaal decoderen en foutencontrole
Displaytekst vernieuwen
NeeJa
NeeJa
ISR:
Verhoog de klok met 1 seconde
Var. declareren/Disp. instellenBlokschema >
;============================================
;Variabelen declareren
;============================================
var bit DCF_IN is pin_a2
pin_a2_direction = input
var dword INTCNTR1
INTCNTR1 = 0
…
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 = 0var byte uur_dcf uur_dcf = 0
…var bit DCF_bit[60]
…const byte msg1[16] = {" ", 0 ," ","D","C","F","7","7",
"-","K","l","o","k"," ", 0 ," "}
…
;============================================
;Display intstellingen
;============================================
hd44780_clear
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 e
Start
TMR0/Start-teksten/Ant. Opstarten Blokschema >
;==============================================================
;Start-teksten
;==============================================================
;msg1 & msg2
hd44780_line1
i = 0
for 16 loop
hd44780 = msg1[i]
i = i + 1
end loop
hd44780_line2
i = 0
for 16 loop
hd44780 = msg2[i]
i = i + 1
end loop
delay_100ms( 10 )
…
;=======================================================================;Antenne laten opstarten
;=======================================================================
while DCF_IN == on loop
end loop ;antenne is opgestart !
;============================================;TMR0 intstellingen
;============================================
GIE = on ;global interrupts enabled
T0IE = on ;TMR0 interrupts enabled
T0CS = off ;Internal instruction cycle clock (CLKOUT)
PSA = off ;Prescaler is assigned to the Timer0 module
PS2 = off ;000 => prescaler = 1:2
PS1 = off ;9765,625 interrupts/sec
PS0 = off ;=> 78125 interrupts/ 8 Seconds
T0IF = off ;TMR0 flag bit
Startbit zoekenBlokschema >
while START_BIT_GEVONDEN == off loop
time_off = 0
while DCF_IN == off loop
delay_1ms(10)
time_off = time_off + 1
end loop
if i == 0 then ;maak valse starbit aan
i = 1
START_BIT_GEVONDEN = on
geen_signaal = on
end if
i = i - 1
hd44780_position(69)
format_byte_dec(hd44780,i,2,0)
hd44780 = "/" hd44780 = "6" hd44780 = "0"
while DCF_IN == on loop end loop
if time_off >= 100 then
T0IE = off ;TMR0 disabled
T0IE = on ;TMR0 enabled
START_BIT_GEVONDEN = on
sec_teller = 0
end if
end loop
;============================================;Startbit zoeken
;============================================
hd44780_clear
hd44780_line1
i = 0
for 16 loop ;”Starbit zoeken !”
hd44780 = msg7[i]
i = i + 1
end loop
while DCF_IN == off loop end loop
while DCF_IN == on loop end loop
;dcf_in wordt laag !
START_BIT_GEVONDEN = off
i = 60
hd44780_position(69)
hd44780 = "6" hd44780 = "0" hd44780 = "/" hd44780 = "6" hd44780 = "0" ;60/60
Neem time_off op
time_off = 1000 ms
→ Startbit
Hoofdlus
forever loopif startbit == on & pos_flank == on then sec_teller = 0end ifif 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 decode_dcf neg_flank = offend ifif 9277 < uit_tijd & uit_tijd <= 13671 then startbit = onend ifif 19531 <= aan_tijd then dcf_frame_error = on geen_signaal = onend ifif 65400 <= aan_tijd then aan_tijd = 65400end ifif 65400 <= uit_tijd then uit_tijd = 65400end ifif sec_teller == 58 then eerste_minuut = 0end ifif uur_disp == 0 & min_disp == 0 & sec_disp == 2 then initialiseren = onend 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 = offend ifif 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 ifend if if geen_signaal == off & copy_geen_signaal == on then initialiseren = onend if copy_geen_signaal = geen_signaal refresh_disp end loop
Status DCF-bit ?
Pariteit goed → waardes
wegschrijven
ISR
procedure isr is ; elke 102.4 µs pragma interrupt INTCNTR1 = INTCNTR1 + 1 INTCNTR2 = INTCNTR2 + 1 ani_counter = ani_counter + 1 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
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 pos_flank = on aan_tijd_enable = 1 uit_tijd_enable = 0 aan_tijd = 0 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 ;TMR0 flag bitend procedure
1 sec. Timer
aan_tijd/ uit_tijd timer
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
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) for 4 loop hd44780 = " " end loop
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 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 = " " end if
...
23:59:14
Maa./Din./Woe./…
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) end procedure
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 ifend procedure
ProgrammeertoestelSoftware >
USB RS232►USB
RS232 Galva-wisp
Galvanische scheiding
DCF77-klok
5
Bestand.hex&
Bumblebee.exe
ExtraExtra >
Codeformaten
Film, na synchronisatieCode
Bumblebee
Bedankt voor de aandacht
Naar hoofdmenu Voorstelling beëindigen
CodeformatenExtra >
Byte-oriented file register operations
Bit-oriented file register operations
Literal and control operations
CALL en GOTO instructies
General instructions
Vb: CLRF, INCF, MOVWF, …
Vb: BCF, BTFSC, …
Vb: ADDLW, MOVLW, …
Vb: CALL & GOTO