Categorie: Projecten

PIC bestuurde robotwagen Update

De code is ondertussen klaar.

De code in de robotauto:

    Device              16F628A
    Config WDT_OFF, PWRTE_Off, LVP_OFF, MCLRE_on, INTRC_OSC_NOCLKOUT
    ALL_DIGITAL         TRUE 
    PORTB_PULLUPS       = 1
'Declaraties    
    'Sensoren
    Symbol sensorR      = PORTA.6
    Symbol sensorL      = PORTA.7
    'Motoren
    Symbol motorvooruit = PORTA.2
    Symbol motorachteruit  = PORTA.3
    Symbol stuurLinks   = PORTA.1
    Symbol stuurRechts  = PORTA.0
    'Terugkoppeling stuur
    Symbol stuursensL   = PORTB.0
    Symbol stuursensM   = PORTB.1
    Symbol stuursensR   = PORTB.2
    'Leds
    Symbol led1         = PORTB.3
    Symbol led2         = PORTB.4
    Symbol led3         = PORTB.5
    Symbol led4         = PORTB.6
    Symbol led5         = PORTB.7
    

'Wachten voor dat er bogonnen wordt 
'(De sensoren hebben tijd nodig om op te starten)    
    DelayMS 1000
    
'Stuur initialiseren
    'Staat het stuur in het midden?
    If stuursensM = 0 Then
        GoTo klaarinit      'Direct naar klaarinit gaan
    EndIf
    'Staat het stuur links?
    If stuursensL = 0 Then 
        GoTo links         'Naar links gaan
    EndIf
    'Staat het stuur rechts?
    If stuursensR = 0 Then
        GoTo rechts        'Naar rechts gaan
    EndIf
    'In geen stand (geen terugkoppeling)
    'Eerst volledig naar rechts draaien
    High    stuurRechts
    While   stuursensR = 1 
        ;Lusje totdat de stuursensor rechts laag wordt
    Wend
    Low     stuurRechts
    DelayMS 500 
    'Naar gedeelte gaan voor als het stuur naar rechst staat    
    GoTo    rechts      
    
rechts:
    'Naar links sturen    
    High    stuurLinks
    While   stuursensM = 1 
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 500
    GoTo    klaarinit
    
links:
    ;Naar rechts sturen
    High    stuurLinks
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 500

klaarinit:        
    High motorvooruit
    Low  motorachteruit
    High led3
    GoTo main
    

'Hoofdprogramma
main:   
    ;links opstakel
    If sensorL = 0 Then
        DelayMS 10
        High    led1
        GoSub   linksDect
    EndIf
    Low led1 
    ;rechts opstakel
    If sensorR = 0 Then
        DelayMS 10
        High    led5
        GoSub   rechtsDect 
    EndIf
    Low led5  

GoTo main
            
rechtsDect:  
    High led4  
    ;stukje achteruit
    Low     motorvooruit
    DelayMS 10
    High    motorachteruit
    DelayMS 1000
    Low  motorachteruit
    Low     led4
    ;Draaien
    High    stuurLinks    
    While stuursensL = 1
        ;Lusje totdat de stuursensor links laag wordt
    Wend
    Low     stuurLinks   
    ;Stukje vooruit
    DelayMS 10
    High    motorvooruit
    DelayMS 1000
    Low     motorvooruit
    ;Stuur  terug recht zetten
    High    stuurRechts
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurRechts
    DelayMS 10
    High    motorvooruit

Return

linksDect:
    High  led2
    ;stukje achteruit
    Low     motorvooruit
    DelayMS 10
    High    motorachteruit
    DelayMS 1000
    Low  motorachteruit
    Low     led2
    ;Draaien
    High    stuurRechts    
    While stuursensR = 1
        ;Lusje totdat de stuursensor links laag wordt
    Wend
    Low     stuurRechts
    ;Stukje vooruit
    DelayMS 10
    High    motorvooruit
    DelayMS 1000
    Low     motorvooruit
    ;Stuur  terug recht zetten
    High    stuurLinks
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 10
    High    motorvooruit

Return

;bij fout
GoTo main
End

 

De code in de tank:

Device 16F628A
Config WDT_OFF,PWRTE_OFF,LVP_OFF,MCLRE_ON,INTRC_OSC_NOCLKOUT, BODEN_OFF

ALL_DIGITAL true 

Symbol      motorLinksV = PORTA.2
Symbol      motorLinksA = PORTA.3
Symbol      motorRechtsV = PORTA.6

Symbol      motorRechtsA = PORTA.7

Symbol      sensorL = PORTA.0
Symbol      sensorR = PORTA.1

Symbol      led1 = PORTB.0
Symbol      led2 = PORTB.1

Symbol      led3 = PORTB.2
Symbol      led4 = PORTB.3
Symbol      led5 = PORTB.4 

Clear 

High motorLinksV
DelayMS 10
High motorRechtsV

Low motorRechtsA
Low motorLinksA

main:
If sensorL = 0 Then
            'hoog maken van led1
            High led1
            'stoppen van motoren vooruit
            Low motorLinksV
            Low motorRechtsV
            '100ms wachten
            DelayMS 100
            'achteruit rijden
            High motorLinksA
            DelayMS 10
            High motorRechtsA
            'hoogmaken van led3 en Led4
            High led3
            High led4
            '1 s wachten
            DelayMS 1000
            'stoppen met rijden 
            Low motorLinksA
            Low motorRechtsA
            Low motorLinksV
            Low motorRechtsV
            'laag maken van led3 en led4
            Low led3
            Low led4
            '100 ms wachten
            DelayMS 100
            'led2 hoogmaken
            High led2
            'draaien van tank
            High motorLinksV
            DelayMS 10
            High motorRechtsA
            '500ms draaien
            DelayMS 500
            'laagmaken led2            
            Low led2
            'stoppen met draaien
            Low motorLinksV
            Low motorRechtsA
            '10 ms stoppen
            DelayMS 10
            'terug vooruit rijden
            High motorLinksV
            DelayMS 10
            High motorRechtsV


Else
            'als sensor links niets detecteert gaat led1 niet branden
            Low led1
EndIf
If sensorR = 0 Then
            'hoog maken van led5
            High led5
            'stoppen van motoren vooruit
            Low motorLinksV
            Low motorRechtsV
            '100ms wachten
            DelayMS 100
            'achteruit rijden
            High motorLinksA
            DelayMS 10
            High motorRechtsA
            'hoogmaken van led3 en Led4
            High led3
            High led4
            '1 s wachten
            DelayMS 1000
            'stoppen met rijden 
            Low motorLinksA
            Low motorRechtsA
            Low motorLinksV
            Low motorRechtsV
            'laag maken van led3 en led4
            Low led3
            Low led4
            '100 ms wachten
            DelayMS 100
            'led2 hoogmaken
            High led2
            'draaien van tank
            High motorLinksA
            DelayMS 10
            High motorRechtsV
            '500ms draaien
            DelayMS 500
            'laagmaken led2            
            Low led2
            'stoppen met draaien
            Low motorLinksA
            Low motorRechtsV
            '10 ms stoppen
            DelayMS 10
            'terug vooruit rijden
            High motorLinksV
            DelayMS 10
            High motorRechtsV


Else
            'als sensor rechts niets detecteert gaat led5 niet branden
            Low led5
EndIf

GoTo main
End

Raambediening Update

Ik heb besloten om de pcb layout en de code ook vrij te geven.

De layout van V2.1:
Printplaat V2_1Printplaat V2_1

De layout van V2.2:
Printplaat V2_2
Printplaat V2_2

In deze layouts zitten nog fouten dus even vergelijken met het schema en corrigeren als je dit wil nabouwen. Als er intresse is kan ik wel even een nieuw printplaat tekenen.

 

De code:

'****************************************************************
'*  Name    : Comfortconsole.BAS                                *
'*  Author  : [Stynus]                                          *
'*  Notice  : Copyright (c) 2008 [www.elektronicastynus.be]     *
'*          : All Rights Reserved                               *
'*  Date    : 14/02/2008                                        *
'*  Version : 4.1                                               *
'*  Notes   : Comfortconsole                                    *
'****************************************************************
    Device 12F629
    Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_ON, CP_ON
    ALL_DIGITAL     TRUE
    
    Dim tellerlaag  As Byte
    Dim tellerhoog  As Byte
    Dim ICounter    As Byte
    Clear
    
    Symbol stroomSensor = PORTB.0
    Symbol knopOmhoog   = PORTB.4
    Symbol knopOmlaag   = PORTB.5
    Symbol UitR         = PORTB.2
    Symbol UitL         = PORTB.1
    
    Low UitR
    Low UitL
   
Main:
    While 1 = 1
        If knopOmhoog = 0 And knopOmlaag = 1 And stroomSensor = 0 Then
            GoSub Omhoog
        EndIf
        If knopOmlaag = 0 And knopOmhoog = 1 And stroomSensor = 0 Then
            GoSub Omlaag
        EndIf
    Wend

Omhoog:
    Low UitL
    High UitR 
    DelayMS 500
    While 1 = 1 
        If knopOmlaag = 0  Or stroomSensor = 1 Then
            Low UitR
            GoTo wachten
        EndIf 
    Wend

Omlaag:
    Low UitR
    High UitL 
    DelayMS 500
    While 1 = 1 
        If knopOmhoog = 0  Or stroomSensor = 1 Then 
            Low UitL
            GoTo wachten
        EndIf 
    Wend

wachten:
    DelayMS 1000
    Return
    
End      

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 

PIC ontwikkelbordje

Mijn K8048 development bordje werkte gisteren weeral tegen toen ik snel een knightrider wilde testen. Daarom heb ik die toen in een hoekje gesmeten en snel een nieuw bordje ontworpen dat op mijn galvawisp komt. Vandaag heb ik dat printje ge-etst en bestukt. De microcontroller is een 16F628A. Op port A hangen 8 dipswitchen en op port B hangen 8 leds.

Schema:

Schema PIC ontwikkelbordje

PCB:

pcb PIC ontwikkelbordje

De pcb layout als pdf: Link.

Foto’s:

foto PIC ontwikkelbordje

foto PIC ontwikkelbordje

Code knightrider die ik voor het testen heb gebruikt:

'****************************************************************
'*                      knightrider                             *
'*                                                              *
'*  Auteur  : Stijn Coenen [Stynus]                             *
'*  Notice  : Copyright (c) 2008 Stijn Coenen                   *
'*          : All Rights Reserved                               *
'*  Datum   : 29/05/2008                                        *
'*  Version : 1.0                                               *
'*  Website : www.elektronicastynus.be                          *
'****************************************************************
'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                  

De hex file: link

Filmpje van de knightrider in actie:

Moodlight Update

Gisteren ben ik aluminium gaan kopen en vandaag heb ik daar een behuizing met in elkaar gezet. Het deksel moet uit plexiglas gemaakt worden en dat heb ik nog niet liggen.

Een paar foto’s:

moodlight behuizing

moodlight behuizing

Moodlight Update

De pcb layout:

– Top met componenten

– Top zonder componenten

– Bottom zonder componenten

– Bottom met componenten

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.

Moodlight Update

Vandaag heb ik de code afgewerkt en de printen in de behuizing ingebouwd:

moodlight behuizing

moodlight behuizing

 

De code:

'****************************************************************
'*  Author  : Coenen Stijn [Stynus]                             *
'*  Notice  : Copyright (c) 2007 [www.elektronicastynus.be]     *
'*          : All Rights Reserved                               *
'*  Date    : 15/06/2008                                        *
'*  Version : 1.5                                               *
'*  Notes   : Ledstrip controller module                        *
'*          :                                                   *
'****************************************************************
    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

De hex file van deze code: link.

You-tube filmpje van de moodlight in werking:

 

(Sorry voor de slechte beeldkwaliteit)

Peltier regeling Update

Gisteren heb ik de code eindelijk werkend gekregen en vandaag heb ik de temperatuursensor gemonteerd op de koude kant van de peltier.

De regelprint in werking:

print Peltier regeling

De temperatuursensor gemonteerd:

Peltier regeling

Hier is goed te zien hoe de peltier tussen de koelplaat en het aluminium plaatje is geklemd:

Peltier regeling

De koelblok is van een oude P2 processor.

 

Het nieuwe schema:

schema V2 peltier regeling

 

Componenten lijst:

Naam: Waarde:
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

 

De code:

'****************************************************************
'*  Author  : Coenen Stijn [Stynus]                             *
'*  Notice  : Copyright (c) 2008 ElektronicaStynus.be           *
'*          : All Rights Reserved                               *
'*  Date    : 15/06/2008                                        *
'*  Version : 1.2                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
    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    

CNC boor/frees machine V2 – Mechanica – Update

Vandaag heb ik de aluminium plaat die ik in Eksel had gekocht aan men Z as gemaakt voor de verbinding te maken tussen de Z en de X-as. Daarna heb ik “glij lagers” gemaakt voor op de rails van de X-as en die gemonteerd om de aluminium plaat.

 

Foto’s:

cnc

cnc

cnc

cnc