Beste leden,

Ik heb zonet een programma geschreven dat je met 15 knoppen een RGB led kan sturen. De knoppen zijn dus 3 reeksen van elk 5 knoppen.
De 3 reeksen zijn voor rood, groen en blauw
De 5 knopen zijn de duty's die je kan kiezen dus 255(4/4) , 196(3/4), 128(2/4), 64(1/4) en 0(0/4) Dus zo kan je elke led op 4 standen zeten waardoor je iets van 200 kleuren kan bekomen.
Nu heb ik het programma al en dit werkt naar behoren op real pic simulator maar mss hebben jullie nog tips voor mij of mss hebben jullie er zelf wat aan ;)

Device 16F628
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

Symbol rood      = PORTA.0      ; knoppen multiplexing
Symbol groen     = PORTA.1
Symbol blauw     = PORTA.2
Symbol pwm255    = PORTA.3
Symbol pwm196    = PORTA.4
Symbol pwm128    = PORTA.5
Symbol pwm064    = PORTA.6
Symbol pwm000    = PORTA.7

Symbol Lrood     = PORTB.0      ; uitgangen leds
Symbol Lgroen    = PORTB.1
Symbol Lblauw    = PORTB.2

Dim Rpwm As Byte                ; duty waardes
Dim Gpwm As Byte
Dim Bpwm As Byte

While 1 = 1
    High rood                   ; porta.0 hoog maken
        If pwm255 = 1 Then      ; alser nu op knop 1 geduwt word
            Rpwm = 255
        ElseIf pwm196 = 1 Then  ; alser op knop 2 word geduwt
            Rpwm = 196
        ElseIf pwm128 = 1 Then  ; alser op knop 3 word geduwt
            Rpwm = 128
        ElseIf pwm064 = 1 Then  ; alser op knop 4 word geduwt
            Rpwm = 64
        ElseIf pwm000 = 1 Then  ; alser op knop 4 word geduwt
            Rpwm = 0
        EndIf
    Low rood                    ; porta.0 weer laag maken
        DelayMS 2               ; 2ms wachten
    High groen                  ; terug het zelfde als rood
        If pwm255 = 1 Then
            Gpwm = 255
        ElseIf pwm196 = 1 Then
            Gpwm = 196
        ElseIf pwm128 = 1 Then
            Gpwm = 128
        ElseIf pwm064 = 1 Then
            Gpwm = 64
        ElseIf pwm000 = 1 Then
            Gpwm = 0
        EndIf
    Low groen
        DelayMS 2                ; terug het zelfde als rood
    High blauw
        If pwm255 = 1 Then
            Bpwm = 255
        ElseIf pwm196 = 1 Then
            Bpwm = 196
        ElseIf pwm128 = 1 Then
            Bpwm = 128
        ElseIf pwm064 = 1 Then
            Bpwm = 64
        ElseIf pwm000 = 1 Then
            Bpwm = 0
        EndIf
    Low blauw
        DelayMS 2
        
PWM Lrood, Rpwm, 1               ; pwm's uitzenden 
PWM Lgroen, Gpwm, 1
PWM Lblauw, Bpwm, 1

Wend

End

Tips zijn heel welkom een programma is altijd aan verbetering toe ;)
Gelieven ook zeggen waarom iets anders kan zodat ik er nog wat van leer he ;)

Alvast bedankt

Cyclus naar 1 gewijzigd

200 kleuren lijkt me wat overdreven, met 3 kleuren in 5 standen, is 5^3=125. Dan neem ik nog niet eens mee dat alle drie de leds op een halve dutycycle dezelfde kleur is als alle leds op volle dutycycle, of 3/4 dutycycle.

Het programma is een beetje apart. Je lijkt maar 5 knoppen te hebben ingesteld, namelijk die voor pwm000 t/m pwm255. Misschien dat je die hebt gecombineerd met rood - groen - blauw uitgangen, maar dan heb je iedere cycle 2 milliseconden om de drie kleuren uit te kiezen.

Als je pwm's van 5 cycles hebt, heb je waarschijnlijk ook nog behoorlijk last van de rest van het programma, omdat dat (relatief) lang duurt.

Bovendien gaan de PWM's niet tegelijk, dus eerst brand je rode Led even, dan je groene, en dan je blauwe. Helaas kan een PIC niet meer dan 1 uitgang tegelijk PWM'en, tenzij je HPWM gebruikt, maar dan moet je een PIC zien te vinden die 3 uitgangen met HPWM heeft (Ik weet niet of dat bestaat, de 16F628 heeft er iig maar 1).

[Bericht gewijzigd door Hagdos op (13%)]

Ik denk niet dat het goed gaat werken. Zodra het rode ledje gaat branden heb je max 1ms om op het goede knopje te drukken, gaat je dus nooit lukken. De ontdendering mist ook, maar misschien heb je die in hardware.

En je pwm manier is ook niet echt mooi. Nu worden steeds 5 pulsen gegeven, en dan de volgende kleur. Netter is een timer en een tellertje. Elke interrupt de teller verhogen, dan de teller vergelijken met de duty die je wilt en dan de uitgang 1 of 0 maken.

243 kleuren want 3 leds met elk 5 combinaties dus das 3tot de 5de ;)
Jah ik dacht ook cycles van 1 is beter niet ?
Als iemand een PIC kent met 3HPWM poorten hoor ik het graag :D
En jah ik gebruik dus knop rood groen en blauw als uitgang en dan gaat hij gaan kijken welke van de knoppen 255,196 .., 0 welke 5V binnen krijgt opnieuw ;)

Op 13 oktober 2009 23:50:36 schreef Hagdos:
Helaas kan een PIC niet meer dan 1 uitgang tegelijk PWM'en, tenzij je HPWM gebruikt, maar dan moet je een PIC zien te vinden die 3 uitgangen met HPWM heeft (Ik weet niet of dat bestaat, de 16F628 heeft er iig maar 1).

Of je gebruikt wat externe logica en gaat HPWM multiplexen.

Of je gaat zelf software PWM maken met een interrupt routine.

@Henry S.: Dat lijkt me lastig als ze niet alle 3 dezelfde dutycycle moeten hebben.

@telefoon13: 3 leds met elk 5 combinaties dus das 5 tot de 3de ;)