Categorie: Klokken

LED-Aftelklok V1

De bedoeling van deze klok is dat een tijd kan ingesteld worden en dat die dan afgeteld wordt.
Elke 20min gaat er een ledje uit.

LED-klok
LED-klok
LED-klok
LED-klok
LED-klok
LED-klok
LED-klok

IN-12 Nixie klok

Ik heb een tijd geleden besloten een nixie klok te gaan bouwen. Het ontwerp van de klok neemt Robert voor zijn rekening. Bedankt Robert!! De klok zal werken met een AVR daarom heb ik alvast een programmer gebouwd.

Op dit moment heb ik de hoogspanningsvoeding gebouwd voor te testen:

Schema:

Schema

(Als de enable hoog is stopt de schakeling.)

De foto’s:

Nixie_Sup

Nixie_Sup

De printlayout:
PDF met componten
PDF zonder componenten

IN-12 Nixie klok Update

Gisteren heb ik de nixies binnengekregen (Bedankt Robert en Pascal!!) en vandaag maar meteen mee aan het experimenteren gegaan:

Nixie vooraanzicht

Nixie zijaanzicht

Nixie met ledje naast

voorkant

Gegevens:

gegevens

De buisvoet:

buisvoet

IN-12 Nixie klok Update

Vandaag heb ik een behuizing getekend:

Behuizing

Behuizing

Behuizing

LED-Aftelklok V2

Omdat de eerste versie niet volledig voldoet moet er een tweede versie gemaakt worden.

Schema:

Schema
(Klikbaar)

Foto’s:

Keyboard:

Tobo

Keybord

Hoofdprint Ontwerp (Zitten nog fouten in die me niet waren opgevallen voor het etsten 🙁 ).

Printontwerp

Hoofdprint zonder componenten:

Hoofd Print

LED-Aftelklok V2 Update

De print is ondertussen bestukt:

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

LED-Aftelklok V2 Update

De code is ondertussen ook af:

'****************************************************************
'*  Name    : Aftelklok                                         *
'*  Author  : Coenen Stijn [Stynus]                             *
'*  Notice  : Copyright (c) 2008 ElektronicaStynus.be           *
'*          : All Rights Reserved                               *
'*  Date    : 26/04/2008                                        *
'*  Version : 2.8                                               *
'****************************************************************
'Declaraties:
    Device          16F877A
    Config XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, PWRTE_ON
    XTAL            3',2768 MHz
    ALL_DIGITAL     true
    
    'Lcd declaraties      
    Symbol  Lengte      = 16
    Symbol  Regels      = 2
    Declare LCD_DTPIN PORTD.4 
    Declare LCD_ENPIN PORTD.1
    Declare LCD_RSPIN PORTD.0
    Declare LCD_INTERFACE   4
    Declare LCD_LINES   Regels
    
    'Knoppen 
    Symbol  Knop1       = PORTE.2
    Symbol  Knop2       = PORTA.0
    Symbol  Knop3       = PORTA.4
    Symbol  Knop4       = PORTC.0
    Symbol  Knop5       = PORTA.1
    Symbol  Knop6       = PORTA.5
    Symbol  Knop7       = PORTC.1
    Symbol  Knop8       = PORTA.2
    Symbol  Knop9       = PORTE.0
    Symbol  Knop0       = PORTA.3
    Symbol  Knopenter   = PORTE.1
    Symbol  Knopback    = PORTC.2        
    Symbol  Back        = 10
    Symbol  Enter       = 11 
    Dim     Knop        As Byte    
    Dim     Uren10      As Byte
    Dim     Uren1       As Byte
    Dim     Min10       As Byte
    Dim     Min1        As Byte
    
    'Algemeen
    Dim     Index       As Byte
    Dim     intAan      As Bit
    Dim     temp        As Byte
    Dim     initbit     As Bit
    
    'Leds
    Symbol  rij0        = PORTC.7
    Symbol  rij1        = PORTC.6
    Symbol  rij2        = PORTC.5
    Symbol  rij3        = PORTC.4
    Symbol  rij4        = PORTD.3
    Symbol  rij5        = PORTD.2
    Symbol  ledKolom    = PORTB
    Dim     ledTabel[6] As Byte
    TRISB               = 0
    
     'Tijden
    Dim     Uren        As Byte
    Dim     Minuten     As Byte
    Dim     Seconden    As Byte
    Dim     Tijd        As DWord
    Dim     LedTijd     As Word
    
    'Interupt   
    Symbol  T0IE        = INTCON.5        'TMR0 Overflow Interrupt Enable 
    Symbol  T0IF        = INTCON.2        'TMR0 Overflow Interrupt Flag 
    Symbol  GIE         = INTCON.7        'Global Interrupt Enable 
    Symbol  PS0         = OPTION_REG.0    'Prescaler bit-0 
    Symbol  PS1         = OPTION_REG.1    'Prescaler bit-1 
    Symbol  PS2         = OPTION_REG.2    'Prescaler bit-2  
    Symbol  PSA         = OPTION_REG.3    'Prescaler Assignment  
    Symbol  T0CS        = OPTION_REG.5    'Timer0 Clock Source Select
    Dim     klaarBit    As Bit
    

'****************************************************************
Init: 
    'Interupt (Maar nog niet inschakelen)    
        '3276800/4*256*128*25=1sec               
        PSA                 = 0 'Prescaler op het externe cristal zetten
        PS0                 = 1 'De prescaler op 255x zetten 
        PS1                 = 1
        PS2                 = 1 
        T0CS                = 0                 
        TMR0                = 128 
        T0IF                = 0
        T0IE                = 0
        GIE                 = 0
    'Lcd wissen
        Cls
        DelayMS 30
        GoSub DispClear
    'registers clearen  
        Clear
    'Opstartscherm
        Print At 1, 1, " Elektro-Stynus "

        Print At 2, 1, "Led-Aftelklok V2"  
        DelayMS 1000
    'Tijd instellen
        GoSub Instellen
        If initbit = 1 Then
            initbit = 0
            GoTo Init
        EndIf 
        Uren = Uren10 * 10
        Uren = Uren + Uren1
        Minuten = Min10 * 10
        Minuten = Minuten + Min1
    'Tijd per led uitrekenen
        Tijd = Uren * 60
        Tijd = Tijd + Minuten
        LedTijd = Tijd / 37
        GoSub DispClear
        Print At 1, 1, "Resterende tijd:" 
        T0IE = 1
        GIE  = 1
    'Alle leds aan
        ledTabel[0] = 255
        ledTabel[1] = 255       
        ledTabel[2] = 255
        ledTabel[3] = 255
        ledTabel[4] = 255
        ledTabel[5] = 255      

GoTo Main
'****************************************************************
Main:
    'Leds berekenen
    'Array's invullen
    If Tijd > (LedTijd * 30) Then
        '5de rij array plaatsen
        If Tijd > (LedTijd * 36) Then
            ledTabel[5] = %00111111
        Else 
            If Tijd > (LedTijd * 35) Then
                ledTabel[5] = %00011111
            Else 
                If Tijd > (LedTijd * 34) Then
                    ledTabel[5] = %00001111
                Else        
                    If Tijd > (LedTijd * 33) Then
                        ledTabel[5] = %00000111
                    Else 
                        If Tijd > (LedTijd * 32) Then
                            ledTabel[5] = %00000011
                        Else 
                            ledTabel[5] = %00000001
                        EndIf
                    EndIf
                EndIf
            EndIf
        EndIf
        ledTabel[0] = 255
        ledTabel[1] = 255       
        ledTabel[2] = 255
        ledTabel[3] = 255
        ledTabel[4] = 255
    Else
        '4de rij array plaatsen
        If Tijd > (LedTijd * 24) Then
            If Tijd > (LedTijd * 30) Then
                ledTabel[4] = %00111111
            Else 
                If Tijd > (LedTijd * 29) Then
                    ledTabel[4] = %00011111
                Else 
                    If Tijd > (LedTijd * 28) Then
                        ledTabel[4] = %00001111
                    Else        
                        If Tijd > (LedTijd * 27) Then
                            ledTabel[4] = %00000111
                        Else 
                            If Tijd > (LedTijd * 26) Then
                                ledTabel[4] = %00000011
                            Else 
                                ledTabel[4] = %00000001
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
            ledTabel[0] = 255
            ledTabel[1] = 255       
            ledTabel[2] = 255
            ledTabel[3] = 255
            ledTabel[5] = 0
        Else
            '3de rij array plaatsen
            If Tijd > (LedTijd * 18) Then
                If Tijd > (LedTijd * 24) Then
                    ledTabel[3] = %00111111
                Else 
                    If Tijd > (LedTijd * 23) Then
                        ledTabel[3] = %00011111
                    Else 
                        If Tijd > (LedTijd * 22) Then
                            ledTabel[3] = %00001111
                        Else        
                            If Tijd > (LedTijd * 21) Then
                                ledTabel[3] = %00000111
                            Else 
                                If Tijd > (LedTijd * 20) Then
                                    ledTabel[3] = %00000011
                                Else 
                                    ledTabel[3] = %00000001
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
                ledTabel[0] = 255
                ledTabel[1] = 255       
                ledTabel[2] = 255
                ledTabel[4] = 0
                ledTabel[5] = 0
            Else
                '2de rij array plaatsen
                If Tijd > (LedTijd * 12) Then
                    If Tijd > (LedTijd * 18) Then
                        ledTabel[2] = %00111111
                    Else 
                        If Tijd > (LedTijd * 17) Then
                            ledTabel[2] = %00011111
                        Else 
                            If Tijd > (LedTijd * 16) Then
                                ledTabel[2] = %00001111
                            Else        
                                If Tijd > (LedTijd * 15) Then
                                    ledTabel[2] = %00000111
                                Else 
                                    If Tijd > (LedTijd * 14) Then
                                        ledTabel[2] = %00000011
                                    Else 
                                        ledTabel[2] = %00000001
                                    EndIf
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                    ledTabel[0] = 255
                    ledTabel[1] = 255       
                    ledTabel[3] = 0
                    ledTabel[4] = 0
                    ledTabel[5] = 0
                Else
                    '1ste rij array plaatsen
                    If Tijd > (LedTijd * 6) Then
                        If Tijd > (LedTijd * 12) Then
                            ledTabel[1] = %00111111
                        Else 
                            If Tijd > (LedTijd * 11) Then
                                ledTabel[1] = %00011111
                            Else 
                                If Tijd > (LedTijd * 10) Then
                                    ledTabel[1] = %00001111
                                Else        
                                    If Tijd > (LedTijd * 9) Then
                                        ledTabel[1] = %00000111
                                    Else 
                                        If Tijd > (LedTijd * 8) Then
                                            ledTabel[1] = %00000011
                                        Else 
                                            ledTabel[1] = %00000001
                                        EndIf
                                    EndIf
                                EndIf
                            EndIf
                        EndIf
                        ledTabel[0] = 255
                        ledTabel[2] = 0       
                        ledTabel[3] = 0
                        ledTabel[4] = 0
                        ledTabel[5] = 0
                    Else
                        '0ste rij array plaatsen
                            If Tijd > (LedTijd * 6) Then
                                ledTabel[0] = %00111111
                            Else 
                                If Tijd > (LedTijd * 5) Then
                                    ledTabel[0] = %00011111
                                Else 
                                    If Tijd > (LedTijd * 4) Then
                                        ledTabel[0] = %00001111
                                    Else        
                                        If Tijd > (LedTijd * 3) Then
                                            ledTabel[0] = %00000111
                                        Else 
                                            If Tijd > (LedTijd * 2) Then
                                                ledTabel[0] = %00000011
                                            Else 
                                                ledTabel[0] = %00000001
                                            EndIf
                                        EndIf
                                    EndIf
                                EndIf
                            EndIf
                            ledTabel[1] = 0
                            ledTabel[2] = 0       
                            ledTabel[3] = 0
                            ledTabel[4] = 0
                            ledTabel[5] = 0
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf
    TRISB = 0
    
    'Leds aansturen
    Call ledUit

    'Display aansturen
    Print At 2, 4, DEC2 Uren, ":", DEC2 Minuten, ":", DEC2 Seconden
    
    If klaarBit = 1 Then
        GoTo Klaar
    EndIf
    
    If Knopback = 0 Then
        GoTo cancel
    EndIf
    
GoTo Main


'****************************************************************
Klaar:
    klaarBit = 0
    T0IE     = 0
    GIE      = 0 
    GoSub DispClear 
    Print At 1, 1, "     Klaar!      "
    Print At 2, 1, " (enter = reset) "
    While 1 = 1                       
        If Knopenter = 0 Then
            GoTo Init
        EndIf        
    Wend

'****************************************************************
cancel:
    klaarBit = 0
    T0IE     = 0
    GIE      = 0 
    GoSub DispClear 
    Print At 1, 1, " Druk op Enter om"
    Print At 2, 1, "   te resetten   "
    While 1 = 1
        If Knopenter = 0 Then
            GoTo Init
        EndIf        
    Wend
           

'****************************************************************
'Interrupt routine
ON_HARDWARE_INTERRUPT GoTo Interupt
Interupt:
    'Checken of de interrrupt wel van timer0 komt
    If T0IF = 1 Then
        T0IF = 0    'Timer overflow flag weer resetten
        TMR0 = 118  'Normaal 128 maar door afweiking kristal 118
        Inc Index   
        
        '1 sec is afgelopen
        If Index = 26 Then
            Index = 0
            
            'Tijd aftellen
            Dec Seconden
            'Als de seconden "op zijn" dan minuut aftellen
            If Seconden = 255 Then
                Seconden = 59
                Dec Minuten
                Dec Tijd
                'Als de minuten "op zijn" dan uur aftellen
                If Minuten = 255 Then
                    Minuten = 59
                    Dec Uren
                    'Als uren "op" zijn dan klaar
                    If Uren = 255 Then
                        'Klaar!
                        T0IE = 1
                        GIE  = 1
                        klaarBit = 1
                    EndIf
                EndIf
            EndIf  
                  
        EndIf
        
    EndIf
Context Restore ' Restore the registers and exit the interrupt    

'****************************************************************

subroutines:
    '************************************************************
    'Tijden instellen
        Instellen:
            'Scherm wissen
                GoSub DispClear
                Print At 1, 1, "Tijd: uu:mm"
          
            '****************************************************                     
            'Tientallen van de uren
            urenInstellenHoog:
            
                'Cursor op positie 6 zetten 
                Print $FE ,128
                For Index = 1 To 6  
                    Print $FE, $14     
                Next
                Print $FE, $0F
                
                GoSub   Inlezen
                'Terug
                If Knop = Back Then 
                     DelayMS 500    
                    GoTo urenInstellenHoog
                EndIf 
                'Enter
                If Knop = Enter Then
                    GoTo urenInstellenHoog
                EndIf
                'Lcd aansturen
                Print Dec Knop
                'Tijd in variabele zetten
                Uren10 = Knop * 10 
                DelayMS 500
                
            '****************************************************    
            'Eenheden uren
            urenInstellenLaag:
                'Cursor op positie 7 zetten 
                Print $FE ,128      'cursor naar pos 1,1
                For Index = 1 To 7  
                    Print $FE, $14  'Cursor 1 positie naar rechts opschuiven    
                Next  
                Print $FE, $0F
                          
                GoSub   Inlezen
                'Terug
                If Knop = Back Then
                     DelayMS 500  
                    GoTo urenInstellenHoog
                EndIf 
                'Enter
                If Knop = Enter Then
                    GoTo urenInstellenLaag
                EndIf
                'Lcd aansturen
                Print Dec Knop
                'Tijd in variabele zetten
                Uren1 = Knop 
                DelayMS 500
            
            '****************************************************    
            'Tientallen van de Minuten
            minutenInstellenHoog:
            
                'Cursor op positie 9 zetten 
                Print $FE ,128    
                For Index = 1 To 9  
                    Print $FE, $14    
                Next
                Print $FE, $0F
                
                GoSub   Inlezen
                'Terug
                If Knop = Back Then 
                    DelayMS 500     
                    GoTo urenInstellenLaag
                EndIf 
                
                'Kijken of het aantal niet hoger is dan 6
                If Knop > 5 And Knop < 10 Then
                    'Bij 6 accepteren maar volgende input automatisch 0 maken
                    If Knop = 6 Then
                        Min10   = 6
                        Min1    = 0
                        Print   "60"

                        GoTo    StartenOfTerug 
                    Else
                        GoTo minutenInstellenHoog
                    EndIf
                EndIf
                
                'Enter
                If Knop = Enter Then
                    GoTo minutenInstellenHoog
                EndIf
                'Lcd aansturen
                Print Dec Knop
                'Tijd in variabele zetten
                Min10 = Knop 
                DelayMS 500
              
            '****************************************************  
            'Eenheden Minuten
            minutenInstellenLaag:
            
                'Cursor op positie 10 zetten 
                Print $FE ,128      'cursor naar pos 1,1
                For Index = 1 To 10  
                    Print $FE, $14  
                Next
                Print $FE, $0F
                
                GoSub   Inlezen
                'Terug
                If Knop = Back Then
                    DelayMS 500  
                    GoTo minutenInstellenHoog
                EndIf 
                'Enter
                If Knop = Enter Then
                    GoTo minutenInstellenLaag
                EndIf
                'Lcd aansturen
                Print Dec Knop
                'Tijd in variabele zetten
                Min1 = Knop 
                DelayMS 500
                
            '****************************************************
            'Starten of terug?
            StartenOfTerug:
                Print           $FE, $0C
                Print At 2, 11, "KLAAR?" 
                DelayMS 500
                If Knopback = 0 Then
                    DelayMS 500
                    GoTo minutenInstellenLaag
                EndIf 
                'Enter
                If Knopenter = 0 Then
                    GoTo Vergrendelen
                EndIf          
            GoTo StartenOfTerug
            '****************************************************                 
            Vergrendelen:         
                Print At 1,1, " Tijd Ingesteld "

                Print At 2,1, "    Starten?    "
                DelayMS 500
                While 1 = 1
                    If Knopback = 0 Then
                        initbit = 1
                        Return
                    EndIf
                    If Knopenter = 0 Then
                        DelayMS 1000
                        Return
                    EndIf  
                Wend 
        Return
    '************************************************************       
    'Knoppen inlezen
        Inlezen:
            While 1 = 1
                If Knop0 = 0 Then
                    Knop = 0
                    Return
                EndIf
                If Knop1 = 0 Then
                    Knop = 1
                    Return
                EndIf
                If Knop2 = 0 Then
                    Knop = 2
                    Return
                EndIf
                If Knop3 = 0 Then
                    Knop = 3
                    Return
                EndIf
                If Knop4 = 0 Then
                    Knop = 4
                    Return
                EndIf
                If Knop5 = 0 Then
                    Knop = 5
                    Return
                EndIf
                If Knop6 = 0 Then
                    Knop = 6
                    Return
                EndIf
                If Knop7 = 0 Then
                    Knop = 7
                    Return
                EndIf
                If Knop8 = 0 Then
                    Knop = 8
                    Return
                EndIf
                If Knop9 = 0 Then
                    Knop = 9
                    Return
                EndIf
                If Knopback = 0 Then
                    Knop = 10
                    Return
                EndIf
                If Knopenter = 0 Then
                    Knop = 11
                    Return
                EndIf
            Wend
        Return
    '************************************************************
    'cls wil niet werken bij dit lcd dus daarom zo:
    DispClear:
        Print At 1, 1, "                "

        Print At 2, 1, "                "
        DelayMS 500        
    Return
    '************************************************************   
    'Led matrix aansturen 
    ledUit:
        'Rij 0
            High rij0
                ledKolom = ledTabel[0]                
                DelayMS 1
            Low rij0
        'Rij 1
            High rij1
                ledKolom = ledTabel[1]
                DelayMS 1
            Low rij1
        'Rij 2
            High rij2
                ledKolom = ledTabel[2]
                DelayMS 1
            Low rij2
        'Rij 3
            High rij3
                ledKolom = ledTabel[3]
                DelayMS 1
            Low rij3
        'Rij 0
            High rij4
                ledKolom = ledTabel[4]
                DelayMS 1
            Low rij4
        'Rij 5
            High rij5
                ledKolom = ledTabel[5]
                DelayMS 1
            Low rij5
        'Rij 0
            High rij5
                ledKolom = ledTabel[5]
                DelayMS 1
            Low rij5
    Return

'****************************************************************  
End 

Binaire BCD Klok

Als ontspanning tijdens het leren voor de examens heb ik een binaire klok ontworpen en gemaakt op basis van een PIC16F628A.

Schema hoofdprint:

Schema binaire BCD klok
Schema voeding:

Schema voeding

Schema led matrix:

schema led matrix

Pcb lay-out hoofdprint:

pcb binaire BCD klok

Printlay-out als pdf: Link

Foto’s:

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

De code voor in de pic:

'****************************************************************
'*                       Binaire klok                           *
'*  Auteur  : Coenen Stijn [Stynus]                             *
'*            Copyright (c) 2008 ElektronicaStynus.be           * 
'*  Datum   : 12/06/2008                                        *
'*  Versie  : 1.0                                               *
'****************************************************************
    Device              16F628A
    Config WDT_OFF, PWRTE_ON, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_off
    ALL_DIGITAL         = true   
'****************************************************************   
'Leds 
    Dim     tijduur10   As Byte
    Dim     tijduur1    As Byte
    Dim     tijdmin10   As Byte
    Dim     tijdmin1    As Byte
    Symbol  leds        = PORTB   
    Symbol  uren10      = PORTA.0
    Symbol  uren1       = PORTA.1
    Symbol  minu10      = PORTA.2
    Symbol  minu1       = PORTA.3 
    TRISB               = %11000000
    TRISA               = %00010000
'instellen
    Symbol  incMin      = PORTB.6
    Symbol  incUur      = PORTB.7
    Dim     minBit      As Bit
    Dim     uurBit      As Bit
    PORTB_PULLUPS       = 1 
'interrupt
    Symbol  klok50      = PORTA.4
    Dim     tussenCount As Byte
    Clear
    
    Symbol T0IF         = INTCON.2      'Bit die hoog wordt bij overflow    
    Symbol T0IE         = INTCON.5      'Timer Overflow Interupt Enable bit
    Symbol GIE          = INTCON.7      'Global interupt enable bit
    Symbol PSA          = OPTION_REG.3  'Prescaler Assignment bit
    Symbol TOSE         = OPTION_REG.4  'Stijgende of dalende flank kiezen.
    Symbol T0CS         = OPTION_REG.5  'selecteren timer ingang    
    TOSE                = 0             'stijgende flank
    T0CS                = 1             'RA4 selecteren als timer ingang 
    PSA                 = 1             'Prescaler uit
    T0IE                = 1             'Interupt opzetten voor timer 0
    T0IF                = 0             'Timer 0 vlag clearen
    TMR0                = 206           '206 in register TMR0 gooien zoadat bij 
                                        '50Hz 1 keer per seconde interupt is
    GIE                 = 1             'Interupt opzetten  
GoTo over_interupt

on_hardware_interrupt GoTo Interupt 
Interupt: 
    T0IF = 0    'Overflow vlag terug afzetten
    TMR0 = 206  'Terug 205 in het TMR0 reg zetten 
                '(voor 1 interupt per sec bij 50 hz)
    Inc tussenCount
    If tussenCount = 60 Then
        tussenCount = 0
        Inc tijdmin1
        'minuten eenheden
         If tijdmin1 = 10 Then
            tijdmin1 = 0
            'Minuten tientallen
            Inc tijdmin10
            If tijdmin10 = 6 Then
                Inc tijduur1
                tijdmin1 = 0
                tijdmin10 = 0
                'Uren
                If tijduur1 = 4 And tijduur10 = 2 Then
                   tijduur1 = 0
                   tijduur10 = 0
                EndIf
                If tijduur1 = 10 Then
                   tijduur1 = 0
                   Inc tijduur10
                EndIf
            EndIf
        EndIf 
    EndIf
Context Restore  

over_interupt:
    
'preset waarde meegeven
    tijduur10           = 0 
    tijduur1            = 0
    tijdmin10           = 0
    tijdmin1            = 0
        
Hoofdprog:
    'leds aansturen
    'minuten eenheden
        High minu1
            leds = tijdmin1 
            DelayMS 1 
        Low minu1
        leds = 0
    DelayUS 50
    'Minuten tientallen
        High minu10
            leds = tijdmin10 
            DelayMS 1    
        Low minu10
        leds = 0
    DelayUS 50
    'Uren eenheden
        High uren1
            leds = tijduur1
            DelayMS 1    
        Low uren1
        leds = 0
    DelayUS 50
        'Uren tientallen
        High uren10
            leds = tijduur10  
            DelayMS 1   
        Low uren10
        leds = 0
    DelayMS 2
    GoSub Instellen
GoTo Hoofdprog

Instellen:
    'Minuten instellen
    If incMin = 0 And minBit = 0 Then
        Inc tijdmin1
        If tijdmin1 = 10 Then
            tijdmin1 = 0
            'Minuten tientallen
            Inc tijdmin10
            If tijdmin10 = 6 Then
                tijdmin1 = 0
                tijdmin10 = 0
            EndIf
        EndIf
        minBit = 1
    Else
        If incMin = 1 And minBit = 1  Then
            minBit = 0    
        EndIf
    EndIf
    'Uren instellen
    If incUur = 0 And uurBit = 0 Then
        Inc tijduur1
        If tijduur1 = 10 Then
            tijduur1 = 0
            'Minuten tientallen
            Inc tijduur10
            If tijduur10 = 6 Then
                tijduur1 = 0
                tijduur10 = 0
            EndIf
        EndIf
        uurBit = 1
    Else
        If incUur = 1 And uurBit = 1 Then
            uurBit = 0    
        EndIf
    EndIf
Return
End    

De hex file: link.

IN-12 Nixie klok Update

Ik heb beslist om niet op Robert te wachten voor de code enzo. Dus heb ik zelf wat ontworpen en gemaakt. De klok werkt nu met een pic16f628a. De tijd wordt bijgehouden door een DS1307 en de temperatuur wordt gemeten door een TC74. Omdat de 16f628a niet genoeg uitgangen heeft heb ik er 4 74HC595 schuifregisters bijgezet, zo kan ik alle nixies en neonlampjes met 3 uitgangen aansturen.

Schema:

schema

Pcb layout:

pcb

Foto van de opgebouwde print:

print

Filmpje van de schakeling in werking:

De code:

Device  16F628A
Config  INTRC_OSC_NOCLKOUT, WDT_off, PWRTE_off, LVP_off, MCLRE_on
ALL_DIGITAL     TRUE 
PORTB_PULLUPS   = On
'In en uitgangen
    'Nixies en neons
        Symbol  klok      = PORTA.1
        Symbol  ZetVast   = PORTA.0
        Symbol  Data_Pin  = PORTA.2
    'Temperatuursensor en RTC
        Symbol  SDA       = PORTB.4
        Symbol  SLC       = PORTB.3
    'Knoppen
        Symbol  KnopR     = PORTB.7 : TRISB.7 = 1
        Symbol  KnopM     = PORTB.6 : TRISB.6 = 1
        Symbol  KnopL     = PORTB.5 : TRISB.5 = 1

'Variabelen declareren
    Dim     Teller          As Byte
    Dim     Temp1           As Byte
    Dim     Temp2           As Byte 
    Dim     BCD_Opt         As Byte   
    Dim     index           As Byte
    Dim     Seconden        As Byte
    Dim     Minuten         As Byte
    Dim     Uren            As Byte
    Dim     Datum           As Byte
    Dim     Maand           As Byte
    Dim     Jaar            As Byte
    Dim     Temperatuur     As Byte
    Dim     neon            As Byte
    Symbol  Reg_Seconden    =  $00 
    Symbol  Reg_Minuten     =  $01
    Symbol  Reg_Uren        =  $02
    Symbol  Reg_Dag         =  $03
    Symbol  Reg_Datum       =  $04
    Symbol  Reg_Maand       =  $05
    Symbol  Reg_Jaar        =  $06
    Symbol  Lezen           =  %11010001
    Symbol  Schrijven       =  %11010000

    Clear

    While 1 = 1 
        Tijd:
            For index = 0 To 50
                I2CIN  SDA, SLC, Lezen, Reg_Uren, [Uren]     
                I2CIN  SDA, SLC, Lezen, Reg_Minuten, [Minuten]
                I2CIN  SDA, SLC, Lezen, Reg_Seconden, [Seconden] 
                neon = %01111001
                
                SHOut Data_Pin, klok, msbfirst, [neon \ 8]
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Uren \ 8]
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Minuten \ 8]   
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Seconden \ 8]   
                High ZetVast
                DelayUS 20
                Low ZetVast
                If KnopR = 0 Or KnopM = 0 Or KnopL = 0 Then
                    GoSub TijdInst
                EndIf
                DelayMS 200
            Next
        Date:
            For index = 0 To 10
                I2CIN  SDA, SLC, Lezen, Reg_Jaar, [Jaar]
                I2CIN  SDA, SLC, Lezen, Reg_Maand, [Maand]
                I2CIN  SDA, SLC, Lezen, Reg_Datum, [Datum] 
                neon = %01111010
                    
                SHOut Data_Pin, klok, msbfirst, [neon \ 8]
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Datum \ 8]
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Maand \ 8]   
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Jaar \ 8]   
                High ZetVast
                DelayUS 20
                Low ZetVast
                If KnopR = 0 Or KnopM = 0 Or KnopL = 0 Then
                    GoSub DatumInst
                EndIf 
                DelayMS 200
            Next       
        Temp: 
            For index = 0 To 10
                I2Cin SDA, SLC,$91,[Temperatuur] 
                Temp1 = Temperatuur / 10
                Temp2 = (Temperatuur - (Temp1 * 10))
                Temperatuur = Temp2
                Temperatuur.7 = Temp1.3 
                Temperatuur.6 = Temp1.2
                Temperatuur.5 = Temp1.1
                Temperatuur.4 = Temp1.0
                   
                neon = %00100100
                
                SHOut Data_Pin, klok, msbfirst, [neon \ 8]
                DelayUS 20        
                SHOut Data_Pin, klok, msbfirst, [$FF \ 8]
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [Temperatuur \ 8]   
                DelayUS 20
                SHOut Data_Pin, klok, msbfirst, [$FF \ 8]   
                High ZetVast
                DelayUS 20
                Low ZetVast
                DelayMS 200
            Next
    Wend  

TijdInst:
    I2CIN  SDA, SLC, Lezen, Reg_Uren, [Uren]     
    I2CIN  SDA, SLC, Lezen, Reg_Minuten, [Minuten]
    I2CIN  SDA, SLC, Lezen, Reg_Seconden, [Seconden] 
    neon = %01111001
    While 1 = 1 
        SHOut Data_Pin, klok, msbfirst, [neon \ 8]
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Uren \ 8]
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Minuten \ 8]   
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Seconden \ 8]   
        High ZetVast
        DelayUS 20
        Low ZetVast
        DelayMS 200
        Inc Teller
        If KnopR = 0 Then
            BCD_Opt = Seconden
            GoSub bcd_tellen
            Seconden = BCD_Opt
            Teller = 0
        EndIf
        If KnopM = 0 Then
            BCD_Opt = Minuten
            GoSub bcd_tellen
            Minuten = BCD_Opt
            Teller = 0
        EndIf
        If KnopL = 0 Then
            BCD_Opt = Uren
            GoSub bcd_uur
            Uren = BCD_Opt
            Teller = 0
        EndIf
        DelayMS 250
        If Teller = 12 Then Break
    Wend
    'Wegschrijven
    I2COUT SDA, SLC, Schrijven ,Reg_Seconden, [Seconden]
    I2COUT SDA, SLC, Schrijven ,Reg_Minuten, [Minuten]
    I2COUT SDA, SLC, Schrijven ,Reg_Uren, [Uren]

Return
bcd_tellen:
    Temp1 = BCD_Opt & %00001111 'Xor
    Temp2 = BCD_Opt - Temp1
    Temp2 = Temp2 >> 4
    Inc Temp1
    If Temp1 > 9 Then
        Temp1 = 0
        Inc Temp2
        If Temp2 > 5 Then
            Temp2 = 0
        EndIf
    EndIf  
    Temp2   = Temp2 << 4   
    BCD_Opt = Temp2 + Temp1

Return   
bcd_uur:
    Temp1 = BCD_Opt & %00001111 'Laagste bits doorlaten 
    Temp2 = BCD_Opt - Temp1
    Temp2 = Temp2 >> 4
    Inc Temp1
    If Temp1 > 9 Then
        Temp1 = 0
        Inc Temp2
        If Temp2 > 5 Then
            Temp2 = 0
        EndIf
    EndIf  
    Temp2   = Temp2 << 4   
    BCD_Opt = Temp2 + Temp1
    If BCD_Opt > 23 Then
        BCD_Opt = 0
    EndIf
Return    

DatumInst:
    I2CIN  SDA, SLC, Lezen, Reg_Jaar, [Jaar]
    I2CIN  SDA, SLC, Lezen, Reg_Maand, [Maand]
    I2CIN  SDA, SLC, Lezen, Reg_Datum, [Datum]
    neon = %01111010
    While 1 = 1 
        SHOut Data_Pin, klok, msbfirst, [neon \ 8]
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Datum \ 8]
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Maand \ 8]   
        DelayUS 20
        SHOut Data_Pin, klok, msbfirst, [Jaar \ 8]    
        High ZetVast
        DelayUS 20
        Low ZetVast
        DelayMS 200
        Inc Teller
        If KnopR = 0 Then
            BCD_Opt = Jaar
            GoSub bcd_jaar
            Jaar = BCD_Opt
            Teller = 0
        EndIf
        If KnopM = 0 Then
            BCD_Opt = Maand
            GoSub bcd_Maand
            Maand = BCD_Opt
            Teller = 0
        EndIf
        If KnopL = 0 Then
            BCD_Opt = Datum
            GoSub bcd_Datum
            Datum = BCD_Opt
            Teller = 0
        EndIf
        DelayMS 250
        If Teller = 12 Then Break
    Wend
    'Wegschrijven
    I2COUT SDA, SLC, Schrijven ,Reg_Jaar, [Jaar]
    I2COUT SDA, SLC, Schrijven ,Reg_Maand, [Maand]
    I2COUT SDA, SLC, Schrijven ,Reg_Datum, [Datum]

Return
bcd_jaar:
    Temp1 = BCD_Opt & %00001111 'Xor
    Temp2 = BCD_Opt - Temp1
    Temp2 = Temp2 >> 4
    Inc Temp1
    If Temp1 > 9 Then
        Temp1 = 0
        Inc Temp2
        If Temp2 > 9 Then
            Temp2 = 0
        EndIf
    EndIf  
    Temp2   = Temp2 << 4   
    BCD_Opt = Temp2 + Temp1

Return  
bcd_Maand:
   Temp1 = BCD_Opt & %00001111 'Laagste bits doorlaten 
    Temp2 = BCD_Opt - Temp1
    Temp2 = Temp2 >> 4
    Inc Temp1
    If Temp1 > 9 Then
        Temp1 = 0
        Inc Temp2
    EndIf  
    Temp2   = Temp2 << 4   
    BCD_Opt = Temp2 + Temp1
    If BCD_Opt = $13 Then
        BCD_Opt = 1
    EndIf    
    If BCD_Opt = 0 Then
        BCD_Opt = 1
    EndIf
Return

bcd_Datum:
   Temp1 = BCD_Opt & %00001111 'Laagste bits doorlaten 
    Temp2 = BCD_Opt - Temp1
    Temp2 = Temp2 >> 4
    Inc Temp1
    If Temp1 > 9 Then
        Temp1 = 0
        Inc Temp2
    EndIf  
    Temp2   = Temp2 << 4   
    BCD_Opt = Temp2 + Temp1
    If BCD_Opt = $32 Then
        BCD_Opt = 1
    EndIf
    If BCD_Opt = 0 Then
        BCD_Opt = 1
    EndIf
Return
End

De hex file: Link.

Nu nog iemand zoeken om de behuizing te frezen uit een blok hout en het project is af.

PC Klok

Ik wil een pc automatisch laten opstarten om 0u en een ingestelde tijd later terug laten afsluiten, dit om enkele back-ups van databases binnen te halen in de daluren. De pc is nogal een oude pc dus de bios ondersteund het automatisch opstarten niet. Ook moet er niet elke dag een back-up gemaakt worden maar alleen op de dagen dat ik het even ervoor instel.

Daarom heb ik dit printje gebouwd. Met 1 relais wordt de spanning naar de voeding onderbroken en met het andere wordt de aan/uitknop bediend.

Schema:

Schema

Foto’s:

De print:

PC Klok

PC Klok

PC Klok

Het voorfrontje:

PC-KlokPC-Klok

Een filmpje van de schakeling in werking:

De code.