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 ⃔ ⃕