Gepost door Jeroen Vreuls op zaterdag 1 april 2023
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.