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
End

Ik 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

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.