Stijn Coenen

Most commented posts

  1. Resistor Decade Box — 15 comments
  2. Desoldering Station — 12 comments
  3. 3D Printer UV Curing Device — 6 comments
  4. ESR-Meter – Update — 4 comments
  5. Dust extraction – Part 4: Solid State Relay — 4 comments

Author's posts

LED-countdown clock V2 – Update

The code is ready:

    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 

PIC Dev Board V1

My Velleman K8048 board didn’t always work. When I wanted to program a knightrider it failed again. Then I decided to throw it away and create a new development board that connects to my galvawisp. Today I etched and build this pcb. The microcontroller is a 16F628A, on port A there are 8 dipswitches and on port B there are 8 leds connected.

Circuit:

Schema PIC ontwikkelbordje

PCB:

pcb PIC ontwikkelbordje

The pcb layout pdf: Link.

Pictures:

foto PIC ontwikkelbordje

foto PIC ontwikkelbordje

Knightrider Code that I used for testing:

'****************************************************************
'*                      knightrider                             *
'****************************************************************
'Config
    Device 16F628A               
    Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
    ALL_DIGITAL TRUE                ;Alle ingangen digitaal
'****************************************************************
'Ingangen declareren
    Symbol switch   = PORTA
    Symbol sw1      = PORTA.7
    Symbol sw2      = PORTA.6
    Symbol sw3      = PORTA.5
    Symbol sw4      = PORTA.4
    Symbol sw5      = PORTA.3
    Symbol sw6      = PORTA.2
    Symbol sw7      = PORTA.1
    Symbol sw8      = PORTA.0
    'TrisA register instellen (alles ingang)
    TRISA           = 255 

'****************************************************************
'Uitgangen declareren
    Symbol ledjes   = PORTB
    Symbol led1     = PORTB.7
    Symbol led2     = PORTB.6
    Symbol led3     = PORTB.5
    Symbol led4     = PORTB.4
    Symbol led5     = PORTB.3
    Symbol led6     = PORTB.2
    Symbol led7     = PORTB.1
    Symbol led8     = PORTB.0
    'TrisB register instellen (alles uitgang)
    TRISB = 0                       

'****************************************************************    
'Decraraties voor programma:
    Symbol LedTijd  = 70 'doorschuif snelheid LED    
    Dim    index    As Byte
    ledjes          = %10000000 '1 led aanzetten
'****************************************************************
'Hoofdprogramma                                               
    While 1 = 1                     'Oneindige loop
        'Links schuiven
        For index = 0 To 6          'Uitvoren tot dat index 6 is
            ledjes = ledjes >> 1    'Ledjes naar rechts doorschuiven
            DelayMS LedTijd         'Wachten
        Next
        'Rechts schuiven
        For index = 0 To 6          'Uitvoren tot dat index 6 is
            ledjes = ledjes << 1    'Ledjes naar links doorschuiven
            DelayMS LedTijd         'Wachten
        Next       
    Wend

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

The hex file: link

Moodlight – Update

Yesterday I went to buy some aluminium and today I made the enclosure out of it. The lid will be made of plexi but I don’t have that yet.

A couple of pictures:

moodlight behuizing

moodlight behuizing

Binary BCD clock

As recreation after studying for my exams I have made an binary bcd clock. The base is a PIC16F628A.

Main circuit:

Schema binaire BCD klok

Power supply circuit:

Schema voeding

Led matrix circuit:

Led matrix circuit

Main pcb layout:

pcb binaire BCD klok

The pcb as pdf: link

Pictures:

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

The code:

'****************************************************************
'*                       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    

The hex file: link.

Moodlight – Update

At request the pcb layout:

Top with components

Top without components

Bottom without components

Bottom with components

Moodlight – Update

Today I have completed the code and build the pcb’s in the enclosure:

moodlight behuizing

moodlight behuizing

The code:

    Device          16F627A
    Config          WDT_OFF, PWRTE_ON, MCLRE_ON, HS_OSC, LVP_off
    XTAL            = 20
    ALL_DIGITAL     = true    

'****************************************************************
'Declaraties
    Symbol Rood     = PORTB.7
    Symbol Groen    = PORTB.5
    Symbol Blauw    = PORTB.6
    Symbol Master   = PORTB.4 
    Symbol Slave    = PORTB.3 
    TRISB.7         = 0
    TRISB.6         = 0
    TRISB.5         = 0
    TRISB.4         = 1
    TRISA.3         = 1
    PORTB_PULLUPS   = 1
    Dim MasterSlave As Bit
    Dim Geval       As Byte
    Dim index       As Word
    Dim vertraging  As Byte
    'PWM
    Dim WaardeRood  As Byte
    Dim WaardeGroen As Byte
    Dim WaardeBlauw As Byte
    Dim WaardePWM   As Byte
    Dim roodUpDown  As Bit
    Dim groenUpDown As Bit
    Dim blauwUpDown As Bit
    Symbol snelheid = 5 'Hoe hoger dit getal hoe trager het prog
    'Seriele interface
    Dim serdata     As Byte
    Dim sergeval    As Byte
    Dim dataOfGeval As Bit
    HSERIAL_CLEAR   = On            

    HSERIAL_RCSTA   = 144
    HSERIAL_TXSTA   = 36
    HSERIAL_BAUD    = 2400			
    Symbol RCIF	    = PIR1.5		
    Symbol OERR	    = RCSTA.1		

    Symbol CREN	    = RCSTA.4			
    ON_INTERRUPT GoTo SeriIn		

    Clear                                                                        
'****************************************************************
'Checken voor master/slave 
    While 1 = 1
        If Master = 0 Then
            GoTo Masterprog
        EndIf
        If Slave = 0 Then
            GoTo Slaveprog
        EndIf
        High Rood
    Wend

'****************************************************************    
Masterprog:
    PIE1.5 = 0
    WaardeRood  = 255
    WaardeGroen = 0
    WaardeBlauw = 0
    Geval       = 0   
    
    HRSOut 1
    DelayUS 10
    HRSOut WaardeRood
    DelayUS 10
    HRSOut 2
    DelayUS 10
    HRSOut WaardeGroen 
    DelayUS 10
    HRSOut 3     
    DelayUS 10
    HRSOut WaardeBlauw 
    
    While 1 = 1
        For index = 0 To 255
            'Rood
            If WaardeRood >= index Then
                High Rood
            Else
                Low Rood
            EndIf
            'Groen
            If WaardeGroen >= index Then
                High Groen
            Else
                Low Groen
            EndIf
            'Blauw           
            If WaardeBlauw >= index Then
                High Blauw
            Else
                Low Blauw
            EndIf
        Next 
        Inc vertraging
        If vertraging = snelheid Then
            Select Geval
                Case 0
                    Inc WaardeGroen
                    GoSub GroenUit
                    If WaardeGroen = 255 Then
                        Geval = 1
                    EndIf      
                Case 1
                    Dec WaardeRood
                    GoSub RoodUit
                    If WaardeRood = 0 Then
                        Geval = 2
                    EndIf 
                Case 2
                    Inc WaardeBlauw
                    GoSub BlauwUit
                    If WaardeBlauw = 255 Then
                        Geval = 3
                    EndIf
                Case 3
                    Dec WaardeGroen
                    GoSub GroenUit
                    If WaardeGroen =  0 Then
                        Geval = 4
                    EndIf
                Case 4 
                    Inc WaardeRood
                    GoSub RoodUit
                    If WaardeRood = 255 Then
                        Geval = 5
                    EndIf
                Case 5 
                    Dec WaardeBlauw
                    GoSub BlauwUit
                    If WaardeBlauw = 0 Then
                        Geval = 0
                    EndIf
                Case Else
                    'Bij fout reset
                    WaardeRood  = 255
                    WaardeGroen = 0
                    WaardeBlauw = 0
                    Geval       = 0
            EndSelect
            vertraging = 0
            'GoSub seruit  
        EndIf
        
        If Slave = 0 Then
            GoTo Slaveprog
        EndIf
    Wend

'**************************************************************** 
Slaveprog:
    INTCON = %11000000
    PIE1.5 = 1
    WaardeRood = 0
    WaardeGroen = 0
    WaardeBlauw = 0
    Low Groen
    Low Rood
    Low Blauw
    While 1 = 1
        For vertraging = 0 To snelheid     
            For index = 0 To 255
                'Rood
                If WaardeRood >= index Then
                    High Rood
                Else
                    Low Rood
                EndIf
                'Groen
                If WaardeGroen >= index Then
                    High Groen
                Else
                    Low Groen
                EndIf
                'Blauw           
                If WaardeBlauw >= index Then
                    High Blauw
                Else
                    Low Blauw
                EndIf
            Next 
            If Master = 0 Then
                GoTo Masterprog
            EndIf
        Next
    Wend

'**************************************************************** 
'Subroutines:    
RoodUit:
    HRSOut 1
    DelayUS 10
    HRSOut WaardeRood
Return

GroenUit:
    HRSOut 2
    DelayUS 10
    HRSOut WaardeGroen 
Return


BlauwUit:
   HRSOut 3
   DelayUS 10
   HRSOut WaardeBlauw 
   sergeval = 0
Return

SeriIn:
    If dataOfGeval = 0 Then
        HSerIn [sergeval]
        dataOfGeval = 1
    Else
        HSerIn [serdata]
        Select sergeval
            Case 1
                WaardeRood = serdata
            Case 2
                WaardeGroen = serdata
            Case 3
                WaardeBlauw = serdata
            Case Else
                GoTo SeriIn
        EndSelect  
        dataOfGeval = 0
    EndIf
Context Restore

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

The hex file of this code: link.

You-tube clip of the moodlight working:

(Sorry for the bad picture quality)

Peltier controller – Update

Yesterday I finally got the code to read the temperature sensor value working. Today I’ve build a experimental setup with a small peltier. On the hot side I used an old Pentium 2 heat sink. On the cold side a piece of scrap aluminium with the temperature sensor attached to it.

 

The temperature controller working:

print Peltier regeling

The temperature sensor mounted:

Peltier regeling

On the next picture u can see how the peltier is squeezed between the aluminum and the heat sink:

Peltier regeling

The heat sink is of an old P2 processor.

 

schema V2 peltier regeling

 

Component list:

Name: Value:
R1, R2, R3, R4, R5, R6, R7 180 Ohm
R9, R11, R12 1 KOhm
R13, R14 4k7
C1, C2, C3, C4 100nF
7Seg1, 7Seg2 7-Segment display CC
T1 High power darlington
T3, T4 BC547
VR1 7805
IC1 PIC16F628
IC2 TC74A0

 

The code:

    Device              16F628A
    Config WDT_OFF, PWRTE_ON, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_off
    ALL_DIGITAL         = true  
'****************************************************************    
    Symbol  digit1   = PORTB.5
    Symbol  digit2   = PORTA.1
    Symbol  digitA   = PORTA.0
    Symbol  digitB   = PORTA.7
    Symbol  digitC   = PORTA.2
    Symbol  digitD   = PORTB.6
    Symbol  digitE   = PORTB.3
    Symbol  digitF   = PORTA.6
    Symbol  digitG   = PORTB.2
    
    Symbol  peltier  = PORTB.4

    Symbol  SCL      = PORTB.0
    Symbol  SDA      = PORTB.1
    
    Dim     getal1   As Byte
    Dim     getal2   As Byte
    Dim     getal    As Byte
    Dim     index    As Byte
    Dim  temperatuur As Byte
        
    Symbol gewenst   = 10    

'****************************************************************     
init:
    Clear
    I2Cin SDA,SCL,$90,[$00]   
'****************************************************************
main:
    While 1 = 1
        GoSub sensorIn
       
        getal1 = temperatuur / 10
        getal2 = (temperatuur - (getal1 * 10))
        GoSub dispUit
        
        If temperatuur < gewenst Then
            Low peltier
        Else
            High peltier
        EndIf
    Wend

'****************************************************************      
sensorIn:
    I2Cin SDA, SCL,$91,[temperatuur] 
Return
'****************************************************************    
dispUit:
    '    A
    '  F   B
    '    G
    '  E   C
    '    D
    For index = 0 To 1
        If index = 0 Then
            getal = getal1  
            High digit1 
        EndIf
        If index = 1 Then   
            High digit2
            getal = getal2   
        EndIf 
        Select getal
            Case 0    
                High digitA
                High digitB
                High digitC
                High digitD
                High digitE
                High digitF
                Low  digitG            
            Case 1
                Low  digitA
                High digitB
                High digitC
                Low  digitD
                Low  digitE
                Low  digitF
                Low  digitG        
            Case 2
                High digitA
                High digitB
                Low  digitC
                High digitD
                High digitE
                Low  digitF
                High digitG        
            Case 3
                High digitA
                High digitB
                High digitC
                High digitD
                Low  digitE
                Low  digitF
                High digitG        
            Case 4
                Low  digitA
                High digitB
                High digitC
                Low  digitD
                Low  digitE
                High digitF
                High digitG        
            Case 5
                High digitA
                Low  digitB
                High digitC
                High digitD
                Low  digitE
                High digitF
                High digitG        
            Case 6
                High digitA
                Low  digitB
                High digitC
                High digitD
                High digitE
                High digitF
                High digitG        
            Case 7
                High digitA
                High digitB
                High digitC
                Low  digitD
                Low  digitE
                Low  digitF
                Low  digitG        
            Case 8
                High digitA
                High digitB
                High digitC
                High digitD
                High digitE
                High digitF
                High digitG
            Case 9
                High digitA
                High digitB
                High digitC
                High digitD
                Low  digitE
                High digitF
                High digitG            
        EndSelect
        DelayMS 2   
        Low digitA
        Low digitB
        Low digitC
        Low digitD
        Low digitE
        Low digitF
        Low digitG 
        Low digit1
        Low digit2 
    Next  
Return

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

If I have some time in the future maybe I will write a program of a PID controller.

CNC drill/mill machine V2 – Mechanical Part – Update

Today I mounted an aluminium plate to my Z-axis for the connection between the Z and X axis. Then I made some slide bearings for on the rails of the Y-axis. The slide bearings are mounted on the back on the aluminium plate.

cnc

cnc

cnc

cnc

CNC drill/mill machine V2 – Mechanical Part – Update

The last couple of days I’ve been busy making a table for my cnc. I already mounted the Y-axis.

cnc tafel

cnc tafel

Mini Lab Power Supply

Some time ago I saw Turbokeu’s his mini power supply, and I thought “I can build a smaller one”. A month later I got an enclosure from a 12Vdc => 230Vac inverter (Thanks Jeroen!). This case was perfect for my mini psu. The volume off Turbokeu his supply is 1323cm³and mine will be 588cm³.

The circuit I used is based on an article Elektor published in march 98 (Called “Regelbare voeding” in Dutch). The displays are DPM125 witch I bought at an electronics flea market. The power supply delivers 3-24V at 1A. But this is only for short times because the case is used as heat sink.

Circuit mainboard:

schema Mini Lab Voeding

Circuit display supply:

schema Mini Lab Voeding

Pcb mainboard:

print Mini Lab Voeding

Pcb display supply:

print Mini Lab Voeding

Part list (only from the mainboard):

R1 1K 1206
R2, R3 47K 0805
R4, R6 270K 0805
R5 3K9 0805
R7 15K 0805
R8, R9, R14 4K7 0805
R10, R11 220R 0805
R12, R13 1R 1W
R15 3K3 1W
C1 4700µF
C2, C4, C5, C6, C7 100nF 0805
C3 100µF
D1, D2, D3, D4, D6, D9 1N4007 SMD DO214BA
D5, D7 BAT85
D8 5V6 zener
IC1, IC2 TLC271
IC3 78L09
POT1, POT2 1K
Q1, Q2 IRF540
TR1 transformer

Pictures:

Mini Lab Voeding

The top side of the mainboard:

print Mini Lab Voeding

Bottom side:

print Mini Lab Voeding

Bottom side of the display supply:

print Mini Lab Voeding

Top side:

print Mini Lab Voeding

Here you can see how much space is left:p:

Mini Lab Voeding

Mini Lab Voeding

Closed:

Mini Lab Voeding

Mini Lab Voeding

2 pictures with my hand as size reference.

Mini Lab Voeding

Mini Lab Voeding