Goedenavond mannen,
Vanavond ben ik weer aan de gang gegaan met m'n PIC12F629 en m'n CMOS 4017. Met m'n PIC wek ik een PWM signaal op met een duty van 0 tot 255. Nu wil, ik aan de hand van de waarde signaal, laten zien waar hij zit met PWM'en.
Deze code heb ik geschreven:
Device 12F629
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF
ALL_DIGITAL TRUE
GPIO = %110110
Dim signaal As Byte
Dim pulse_4017 As Byte
Dim teller As Byte
Symbol s_pwm = GPIO.0
Symbol pwmmin = GPIO.1
Symbol pwmplus = GPIO.2
Symbol clock_4017 = GPIO.4
Symbol reset_4017 = GPIO.5
GoTo hoofdprogram
;subroutine
tot_25:
reset_4017 = 0
reset_4017 = 1
For pulse_4017 = 0 To teller
Toggle clock_4017
Next
Return
hoofdprogram:
While 1=1
If pwmmin = 0 And signaal > 1 Then Dec signaal
If pwmplus = 0 And signaal < 254 Then Inc signaal
If signaal < 25 Then
teller = 1
GoSub tot_25
ElseIf signaal < 50 Then
teller = 2
GoSub tot_25
ElseIf signaal < 75 Then
teller = 3
GoSub tot_25
ElseIf signaal < 100 Then
teller = 4
GoSub tot_25
ElseIf signaal < 125 Then
teller = 5
GoSub tot_25
ElseIf signaal < 150 Then
teller = 6
GoSub tot_25
ElseIf signaal < 175 Then
teller = 7
GoSub tot_25
ElseIf signaal < 200 Then
teller = 8
GoSub tot_25
ElseIf signaal < 225 Then
teller = 9
GoSub tot_25
ElseIf signaal > 225 Then
teller = 10
GoSub tot_25
EndIf
PWM s_pwm, signaal, 5
Wend
EndIk heb 2 drukknoppen. Een drukknop om het signaal te verhogen en een knop om hem te verlagen. Nu wil ik met de variabele teller door geven aan Gosub tot_25 hoeveel pulsjes hij aan de 4017 moet doorgeven.
Blijkbaar komt die variabele niet door, want hij blijft gewoon bij led1 ( aan de 4017 ) branden.
Hoe kan ik dit oplossen?
Alvast bedankt,
Boeip
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Ruim eerst je programma even op Boeip.
Er zit een heleboel veelvuldig hetzelfde voorkomende gedeelte in.
Device 12F629
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF
ALL_DIGITAL TRUE
GPIO = %110110
Dim signaal As Byte
Dim pulse_4017 As Byte
Dim teller As Byte
Symbol s_pwm = GPIO.0
Symbol pwmmin = GPIO.1
Symbol pwmplus = GPIO.2
Symbol clock_4017 = GPIO.4
Symbol reset_4017 = GPIO.5
While 1=1
If pwmmin = 0 And signaal > 1 Then Dec signaal
If pwmplus = 0 And signaal < 254 Then Inc signaal
SELECT signaal
CASE < 25 : Teller = 1
CASE < 50 : Teller = 2
CASE < 75 : Teller = 3
CASE < 100 : Teller = 4
CASE < 125 : Teller = 5
CASE < 150 : Teller = 6
CASE < 175 : Teller = 7
CASE < 200 : Teller = 8
CASE < 225 : Teller = 9
CASE ELSE : Teller = 10
END SELECT
reset_4017 = 0
reset_4017 = 1
For pulse_4017 = 0 To teller
Toggle clock_4017
Next
PWM s_pwm, signaal, 5
Wend
End
Dit is hetzelfde programma, alleen dan opgeruimd.
Maar het kan nog eenvoudiger.
Er zit namelijk logica in de SELECT CASE lijst dus moet het ook met een berekening kunnen:
Device 12F629
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF
ALL_DIGITAL TRUE
GPIO = %110110
Dim signaal As Byte
Dim pulse_4017 As Byte
Dim teller As Byte
Symbol s_pwm = GPIO.0
Symbol pwmmin = GPIO.1
Symbol pwmplus = GPIO.2
Symbol clock_4017 = GPIO.4
Symbol reset_4017 = GPIO.5
While 1=1
If pwmmin = 0 And signaal > 1 Then Dec signaal
If pwmplus = 0 And signaal < 254 Then Inc signaal
teller = (signaal / 25) + 1
if teller > 10 then teller = 10
reset_4017 = 0
reset_4017 = 1
For pulse_4017 = 0 To teller
Toggle clock_4017
Next
PWM s_pwm, signaal, 5
Wend
End
Nu weet ik niet of je probleem is verholpen, maar dit programma is in principe nog steeds hetzelfde als jouw programma.
Nu het probleem nog:
Test eerst of je drukknoppen wel goed doorkomen door een programmaatje te schrijven die de drukknoppen rechtstreeks doorsturen naar de LED.
Test dat eerst.
Bovendien mis ik CLEAR in je programma.