Gepost door Jeroen Vreuls op donderdag 24 augustus 2023
Device 16F887 ; Processor type
Xtal 10 ; Crystal 10 MHz
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 CCP1_Pin PORTC.2 ; PWM 1 op poort C.2
Declare CCP2_Pin PORTC.1 ; PWM 2 op poort C.1
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 poort D.4 t/m D.7
Declare LCD_Lines 2 ; Twee lijns display
Symbol STANDBY_SCHAK = PORTA.0 ; Ingang standby schakelaar
Symbol RESET_FAILSAFE = PORTA.1 ; Ingang reset failsafe
Symbol JUMPER = PORTA.2 ; Ingang failsafe aan / uit
Symbol FUNCTIE_LED = PORTA.3 ; Uitgang functie led
Symbol VRIJGAVE = PORTC.0 ; Uitgang vrijgave regelaar
Symbol FREQUENTIE = 10000 ; PWM frequentie 10KHz
Dim VAR1 As Word ; Variabele var1
Dim WAARDE As Word ; Variabele waarde
Clear ; Wis geheugen
DelayMS 2000 ; Wacht 2 seconden
;543210 ; Hulpregel poort A
PORTA = %000000 ; Maak poort A laag
TRISA = %100111 ; Poort_A I/O
;543210 ; Hulpregel poort B
PORTB = %000000 ; Maak poort B is laag
TRISB = %000000 ; Poort_B I/O
;76543210 ; Hulpregel poort C
PORTC = %00000000 ; Maak poort C laag
TRISC = %00000000 ; 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 = %000 ; Maak poort E laag
TRISE = %000 ; Poort_E I/O
;76543210 ; Hulpregel analoog
ANSEL = %00000000 ; ANSEL register analoog poort_A
;76543210 ; Hulpregel analoog
ADCON0 = %00000011 ; ADCON0 register analoog 8 bit
;76543210 ; Hupregel analoog
ADCON1 = %10000000 ; ADCON1 register analoog 10 bit
;76543210 ; Hulpregel analoog poort_B
;ANSELH = %00000000 ; ANSEL register analoog poort_B
;---------------------------------------------------------
; PROGRAMMA MODELBOUW REGELAAR VOOR GRAUPNER C4-X 40 SSM.
;---------------------------------------------------------
;-----------------------------
; ALLE UITGANGEN LAAG ZETTEN.
;-----------------------------
FUNCTIE_LED = 0
VRIJGAVE = 0
HPWM 1,0,0
HPWM 2,0,0
;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; FUNCTIE LED AANSTUREN.
; SIGNAAL LINKS RECHTS CONTROLEREN.
; SCHAKELAAR STANDBY INLEZEN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------
START:
VAR1 = PulsIn PORTA.5 , 1
WAARDE = (VAR1-243)*1.20
Print At 1,1,"H.v.Z-PRODUCT"
Print At 2,1,"WAARDE: STOP"
Print At 2,8,Dec3, WAARDE
VRIJGAVE = 0
FUNCTIE_LED = 0
If WAARDE > 137 Then
Cls
GoTo RECHTS_OM
EndIf
If WAARDE < 117 Then
Cls
GoTo LINKS_OM
EndIf
If STANDBY_SCHAK = 0 Then
Cls
GoTo STANDBY
EndIf
If JUMPER = 1 Then
If VAR1 < 50 Then
Cls
GoTo FAILSAFE
EndIf
If VAR1 > 650 Then
Cls
GoTo FAILSAFE
EndIf
EndIf
GoTo START
;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; SCHAKELAAR STANDBY INLEZEN.
; REGELAAR VRIJGEVEN.
; FUNCTIE LED AANSTUREN.
; WAARDE BLOKKEREN OP 255.
; MOTOR AANSTUREN EN REGELEN.
; WAARDE CONTROLEREN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------
RECHTS_OM:
VAR1 = PulsIn PORTA.5 , 1
WAARDE = (var1-243)*1.20
Print At 1,1,"H.v.Z-PRODUCT"
Print At 2,1,"WAARDE: FORW"
Print At 2,8,Dec3, WAARDE
If STANDBY_SCHAK = 0 Then
Cls
GoTo STANDBY
EndIf
VRIJGAVE = 1
FUNCTIE_LED = 1
If WAARDE > 254 Then
WAARDE = 255
Print At 2,1,"WAARDE:255 FORW"
EndIf
HPWM 1 , WAARDE , FREQUENTIE
HPWM 2 , ~ WAARDE , FREQUENTIE
If WAARDE < 138 Then
Cls
GoTo START
EndIf
If JUMPER = 1 Then
If VAR1 < 50 Then
Cls
GoTo FAILSAFE
EndIf
If VAR1 > 650 Then
Cls
GoTo FAILSAFE
EndIf
EndIf
GoTo RECHTS_OM
;-------------------------------------------------------
; ONTVANGER SIGNAAL INLEZEN EN VERWERKEN.
; PRINT OPDRACHT GEVEN.
; SCHAKELAAR STANDBY INLEZEN.
; REGELAAR VRIJGEVEN.
; FUNCTIE LED AANSTUREN.
; WAARDE BLOKKEREN OP 0.
; MOTOR AANSTUREN EN REGELEN.
; WAARDE CONTROLEREN.
; ALS JUMPER GEPLAATST IS FAILSAFE FUNCTIE CONTROLEREN.
;-------------------------------------------------------
LINKS_OM:
VAR1 = PulsIn PORTA.5 , 1
WAARDE = (var1-243)*1.20
Print At 1,1,"H.v.Z-PRODUCT"
Print At 2,1,"WAARDE: REV"
Print At 2,8,Dec3, WAARDE
If STANDBY_SCHAK = 0 Then
Cls
GoTo STANDBY
EndIf
VRIJGAVE = 1
FUNCTIE_LED = 1
If WAARDE < 0 Then
WAARDE = 0
Print At 2,1,"WAARDE:000 REV"
EndIf
HPWM 1 , WAARDE , FREQUENTIE
HPWM 2 , ~ WAARDE , FREQUENTIE
If WAARDE > 120 Then
Cls
GoTo START
EndIf
If JUMPER = 1 Then
If VAR1 < 50 Then
Cls
GoTo FAILSAFE
EndIf
If VAR1 > 650 Then
Cls
GoTo FAILSAFE
EndIf
EndIf
GoTo LINKS_OM
;---------------------------------
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; HPWM-1 EN HPWM-2 OP NUL ZETTEN.
; FUNCTIE LED AANSTUREN.
; SCHAKELAAR STANDBY INLEZEN.
;---------------------------------
STANDBY:
Print At 1,1,"H.v.Z-PRODUCT"
Print At 2,1,"STANDBY"
VRIJGAVE = 0
HPWM 1,0,0
HPWM 2,0,0
FUNCTIE_LED = 1
DelayMS 500
FUNCTIE_LED = 0
DelayMS 500
If STANDBY_SCHAK = 1 Then
Cls
GoTo START
EndIf
GoTo STANDBY
;------------------------------------
; PRINT OPDRACHT GEVEN.
; REGELAAR BLOKKEREN.
; HPWM-1 EN HPWM-2 OP NUL ZETTEN.
; FUNCTIE LED AANSTUREN.
; SCHAKELAAR RESET FAILSAFE INLEZEN.
;------------------------------------
FAILSAFE:
Print At 1,1,"H.v.Z-PRODUCT"
Print At 2,1,"FAILSAFE"
VRIJGAVE = 0
HPWM 1,0,0
HPWM 2,0,0
FUNCTIE_LED = 1
DelayMS 50
FUNCTIE_LED = 0
DelayMS 50
If RESET_FAILSAFE = 1 Then
Cls
GoTo START
EndIf
GoTo FAILSAFE
End
Dit is het hele programma voor de modelbouw regelaar, ik heb boven de lussen wat tekst gezet die uitlegt wat er in de desbetreffende lus gebeurt. Ik hoop dat het duidelijk is op deze manier.
De PWM-frequentie staat hier op 10 KHz zodat je niet het irritante gepiep hoort van de regelaar.
Er zijn twee variabelen gebruikt VAR1
en WAARDE
, beide staan als woord om dat de WAARDE
iets groter kan worden dan 0 tot 255. VAR1
wordt sowieso groter dan 255.
Om de HPWM
waarde tussen de 0 en 255 te houden heb ik dit gedaan:
If WAARDE > 254 Then
WAARDE = 255
Print At 2,1,"WAARDE:255 FORW"
EndIf
Dat is er voor om te zorgen dat de waarde niet boven de 255 uit kan komen, we hebben in de formule gezien dat die waarde iets groter kan worden. Namelijk 256.8 en als we de trim functie van de zender gebruiken kan dat verschil nog iets groter worden. En om de HPWM
waarde niet kleiner te laten worden dan 0, doen we dit:
If WAARDE < 0 Then
WAARDE = 0
Print At 2,1,"WAARDE:000 REV"
EndIf
Op deze manier blijft de HPWM waarde keurig tussen de 0 en 255.
Met de functie LED kunnen we mooi kijken of het ontvanger signaal in het midden staat, de functie LED gaat branden als we de knuppel naar boven of naar beneden bewegen. In de middenstand is de functie LED uit. De functie LED heeft nog twee functies, als de regelaar in de standby stand staat knippert de LED langzaam en als de regelaar in de failsafe staat knippert de LED snel.
Dit was het wel zo'n beetje wat de software betreft voor de modelbouw regelaar zonder stroommeting. Ik ga toch nog even laten zien wat er voor nodig is om de regelaar met een stroommeting uit te rusten.