K16F887 interface met Profilab Expert

Gepost door Jeroen Vreuls op zaterdag 1 april 2023

De software voor de controller

We gaan nu naar de software voor de controller kijken.

'*  Name    : K16F887 - INTERFACE VIA PROFILAB.                                     
'*  Author  : H. van Zwieten                                    
'*  Notice  : Copyright (c) 2023 H.v.Z.                         
'*          : All Rights Reserved                               
'*  Date    : 23-2-2023                                         
'*  Version : 1.0                                                                                                 
'*  Notes   : POORT C.7 = RX EN POORT C.6 = TX BIJ GEBRUIK HSERIAL.
'*  Notes   : POORT B.0 = RX EN POORT B.1 = TX BIJ GEBRUIK RSIN.
                                                  
Device 16F887                               ; Processor type

Xtal 10                                     ; Crystal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display D.4 t/m D.7
Declare LCD_Lines 2                         ; Twee lijns display

Declare Hserial_Baud 9600                   ; Set baudrate op 9600
Declare Hserial_RCSTA  %10010000            ; Register instelling
Declare Hserial_TXSTA  %10100110            ; Register instelling 
Declare Hserial_Clear = On                  ; Reset buffer bij een overflow 

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

Symbol FREQUENTIE = 10000                   ; PWM frequentie is 10KHz

Symbol IN1  = PORTA.0                       ; Ingang 1
Symbol IN2  = PORTA.1                       ; Ingang 2
Symbol IN3  = PORTA.2                       ; Ingang 3
Symbol IN4  = PORTA.3                       ; Ingang 4
Symbol IN5  = PORTA.5                       ; Ingang 5
Symbol IN6  = PORTE.0                       ; Ingang 6
Symbol IN7  = PORTE.1                       ; Ingang 7
Symbol IN8  = PORTE.2                       ; Ingang 8
Symbol IN9  = PORTC.0                       ; Ingang 9
Symbol IN10 = PORTC.3                       ; Ingang 10

Symbol LED1  = PORTB.0                      ; Uitgang 1
Symbol LED2  = PORTB.1                      ; Uitgang 2
Symbol LED3  = PORTB.2                      ; Uitgang 3
Symbol LED4  = PORTB.3                      ; Uitgang 4
Symbol LED5  = PORTB.4                      ; Uitgang 5
Symbol LED6  = PORTB.5                      ; Uitgang 6
Symbol LED7  = PORTD.0                      ; Uitgang 7
Symbol LED8  = PORTD.1                      ; Uitgang 8
Symbol LED9  = PORTC.5                      ; Uitgang 9
Symbol LED10 = PORTC.4                      ; Uitgang 1

Dim ADRES As Byte                           ; Variabele adres
Dim DATA_IN As Byte                         ; Data in compoort

Cls                                         ; Wis display

DelayMS 1000                                ; Pauze 1 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00001001                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %111                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

;---------------------------
; ALLE UITGANGEN ZIJN LAAG.
;---------------------------

LED1  = 0
LED2  = 0
LED3  = 0
LED4  = 0
LED5  = 0
LED6  = 0
LED7  = 0
LED8  = 0
LED9  = 0
LED10 = 0

;-------------------------------------------------
; DATA IN ADRES VAN PROFILAB.
; SPRING NAAR ADRES.
; ALS HET LANGER DUURT DAN 100MS SPRING NAAR UIT.
;-------------------------------------------------

RUN:


    HSerIn 100, UIT, [ADRES] 
    DelayMS 1
    
    If ADRES = 1 Then
       GoSub ADRES_1
    EndIf
    
    If ADRES = 2 Then
       GoSub ADRES_2
    EndIf
    
    If ADRES = 3 Then
       GoSub ADRES_3
    EndIf
    
    If ADRES = 4 Then
       GoSub ADRES_4
    EndIf
    
    If ADRES = 5 Then
       GoSub ADRES_5
    EndIf
    
    If ADRES = 6 Then
       GoSub ADRES_6
    EndIf
    
    If ADRES = 7 Then
       GoSub ADRES_7
    EndIf
    
    If ADRES = 8 Then
       GoSub ADRES_8
    EndIf
    
    If ADRES = 9 Then
       GoSub ADRES_9
    EndIf
    
    If ADRES = 10 Then
       GoSub ADRES_10
    EndIf
    
    If ADRES = 11 Then
       GoSub ADRES_11
    EndIf
    
    If ADRES = 12 Then
       GoSub ADRES_12
    EndIf
    
    If ADRES = 13 Then 
       GoSub ADRES_13
    EndIf
    
;-------------------------
; DATA UIT NAAR PROFILAB. 
;-------------------------
  
UIT:


    If IN1 = 1 Then   
       HSerOut [5]
       Else HSerOut [10] 
    EndIf

    If IN2 = 1 Then
       HSerOut [15]
       Else HSerOut [20] 
    EndIf 
    
    If IN3 = 1 Then   
       HSerOut [25]
       Else HSerOut [30] 
    EndIf

    If IN4 = 1 Then
       HSerOut [35]
       Else HSerOut [40] 
    EndIf
    
    If IN5 = 1 Then   
       HSerOut [45]
       Else HSerOut [50] 
    EndIf

    If IN6 = 1 Then
       HSerOut [55]
       Else HSerOut [60] 
    EndIf 
    
    If IN7 = 1 Then   
       HSerOut [65]
       Else HSerOut [70] 
    EndIf

    If IN8 = 1 Then
       HSerOut [75]
       Else HSerOut [80] 
    EndIf  
    
    If IN9 = 1 Then
       HSerOut [85]
       Else HSerOut [90] 
    EndIf  
    
    If IN10 = 1 Then
       HSerOut [95]
       Else HSerOut [100] 
    EndIf  

GoTo RUN

;----------------------------------------------------
; DATA STUURT PWM_2 AAN VANUIT PROFILAB VIA POTMETER.
;----------------------------------------------------
       
ADRES_1:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    Print At 1,1,Dec3, DATA_IN
    
    HPWM 2,DATA_IN,FREQUENTIE
    
    Return
    
;----------------------------------------------------
; DATA STUURT PWM_1 AAN VANUIT PROFILAB VIA POTMETER.
;----------------------------------------------------
    
ADRES_2:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    Print At 2,1,Dec3, DATA_IN
    
    HPWM 1,DATA_IN,FREQUENTIE
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.0 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_3:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED1 = 1
       Else LED1 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.1 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_4:


    HSerIn [DATA_IN] 
    DelayMS 1

    If DATA_IN > 2 Then
       LED2 = 1
       Else LED2 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.2 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_5:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED3 = 1
       Else LED3 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.3 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_6:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED4 = 1
       Else LED4 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.4 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_7:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED5 = 1
       Else LED5 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG B.5 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_8:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED6 = 1
       Else LED6 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG D.0 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_9:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED7 = 1
       Else LED7 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG D.1 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_10:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED8 = 1
       Else LED8 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG C.4 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_11:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED9 = 1
       Else LED9 = 0
    EndIf
    
    Return
    
;------------------------------------------------------------
; DATA STUURT UITGANG C.5 AAN VANUIT PROFILAB VIA SCHAKELAAR.
;------------------------------------------------------------
    
ADRES_12:


    HSerIn [DATA_IN] 
    DelayMS 1
    
    If DATA_IN > 2 Then
       LED10 = 1
       Else LED10 = 0
    EndIf
    
    Return
    
;--------------------------------------------------------------------
; HIER WORDEN ALLE UITGANGSPINNEN LAAG GEZET, PLUS DE TWEE PWM PINNEN.
; DIT GEBEURT DOOR DE RESET PIN BINNEN PROFILAB.
;--------------------------------------------------------------------
    
ADRES_13:


     HSerIn [DATA_IN]
     DelayMS 1
     
     If DATA_IN > 2 Then
        LED1  = 0
        LED2  = 0
        LED3  = 0
        LED4  = 0
        LED5  = 0
        LED6  = 0
        LED7  = 0
        LED8  = 0
        LED9  = 0
        LED10 = 0
        
        HPWM 1,0,FREQUENTIE
        
        HPWM 2,0,FREQUENTIE
     EndIf
     
     Return
             
End

Zoals je kunt zien valt het programma wel mee qua grootte, helemaal bovenin zie je de declaratie van het display, COM/USB-poort en de PWM-poort. Daaronder de benaming en de verwijzing naar de poort pinnen. Daaronder de variabele en de instelling van de poortpinnen.

Voordat het programma de lus RUN in gaat worden alle uitgangspinnen laag gezet, LED1 tot en met LED10.

In de RUN lus wordt er gekeken welk adres er binnen komt (verzonden door Profilab) en daar wordt dan naar gehandeld door naar het adres te springen en daar een opdracht uit te voeren.

Als er geen data binnen komt vanuit Profilab wordt er iedere 100 ms naar UIT gesprongen en kijkt daar of er eventueel een schakelaar bediend wordt. Is dat het geval, dan wordt er data naar Profilab gezonden en zet daar de desbetreffende uitgang hoog. Is er geen schakelaar bediend dan wordt er toch data verzonden, maar die vertelt Profilab dat er niets hoeft te gebeuren.

Dan hebben we nog de reset functie binnen Profilab, ADRES_13. Daar worden alle uitgangen op de controller mee uit gezet. Dit gebeurt als het programma uitgezet wordt, op deze manier blijft er nooit een uitgang hoog op de controller.