Ik wil met een rotary encoder een rgb led van kleur laten veranderen .
eerste opzet was een 16F688 met een potmeter en de instructie adin.
Dit werkte perfect.
Nu heb ik een 16f628a met en rotary encoder, ik krijg dit tot 1 pwm kanaal goed. zie dit:

hoofdmenu:

 while 1=1
  kleur = teller
    pwm roodled,kleur,1
  wend
 end

De waarde teller krijg ik van de rotary encoder.
Als ik nu 3 pwm kanalen gebruik zou ik verwachten dat deze 3 kanalen tegelijk zouden dimmen als de waarde teller veranderd.

hoofdmenu:

 while 1=1
  kleur = teller
    pwm roodled,kleur,1
    pwm blauwled,kleur,1
    pwm groenled,kleur,1
  wend
 end

Dit is dus niet zo.
Watkan ik hier aan doen dat dit wel gebeurd?

Softwarematige PWM gaat alleen goed met 1 kanaal.
HPWM gebruiken op een PIC met 3 PWM kanalen.
http://www.picbasic.nl/beginners7.htm

@ Henry S.

De 16f688 heeft geen enkel HPWM kanaal en de 16f628a heeft er 1.
In de 16f688 heb ik dit in staan en dat werkt:


PWM roodled,kleurrood,1
PWM groenled,kleurgroen,1
PWM blauwled,kleurblauw,1

De waarde's kleurrood ,kleurblauw en kleurgroen worden berekend vanuit de adc met ADIN
Als ik i.p.v ADIN een waarde gebuik die ik vanuit een rotary encoder krijg werkt het niet .(alleen 1 kanaal zoals vermeld in de eerste post

[Bericht gewijzigd door 19roland70 op (18%)]

Bij de een werk je met een waarde afgeleidt van ADCIN, de ander via een rotary encoder, wissel dat eens om.

Ik heb dit omgewisseld dus rotary op de 16f688 ,maar met de rotary werkt het niet.(alleen met 1 PWM kanaal)
Ik heb het vermoeden dat de waarde bij de eerste keer PWM goed is en dat bij de tweede keer PWM de waarde van de rotary weer 0 is .
zou dit kunnen?

Ik heb zitten denken om deze waarde van de teller naar de eeprom te schrijven alleen als deze 1.000.000 beschreven kan worden is deze zo kapot.
Is hier nog een andere manier voor?

Op 15 december 2009 17:31:10 schreef 19roland70:
Ik heb het vermoeden dat de waarde bij de eerste keer PWM goed is en dat bij de tweede keer PWM de waarde van de rotary weer 0 is .
zou dit kunnen?

Daarvoor moet je in de assembly code kijken, juist voor dit soort dingen is de assemblertool.

Op 16 december 2009 17:04:36 schreef 19roland70:
Ik heb zitten denken om deze waarde van de teller naar de eeprom te schrijven

Waarom niet in RAM?

Op 16 december 2009 17:04:36 schreef 19roland70:
Ik heb zitten denken om deze waarde van de teller naar de eeprom te schrijven alleen als deze 1.000.000 beschreven kan worden is deze zo kapot.
Is hier nog een andere manier voor?

Als je de waarde wil backuppen in het EEPROM kan je best een vertraging maken, die bijvoorbeeld na 4 seconden niet aanpassen de waarde schrijft naar het EEPROM geheugen. Levensduur kan je dan even narekenen, stel dat ie elke 4 seconden een schrijfactie doet gaat het EEPROM 46 dagen mee, ik denk niet dat je vingers het overleven om zo lang aan dat knopje te draaien.

@ Henry S.
dan zou ik dat met CWRITE en CREAD moeten doen ?

Nou nee, dat hoeft niet eens, je kan ook gewoon een variabele gebruiken...
CWRITE en CREAD zijn voor self-modifying code, en dat is tricky.

Mijn vraag is waarom je het perse op EEPROM hebben wilt. Kan de spanning wegvallen en is het belangrijk om de laatste stand te bewaren?

Op 16 december 2009 22:06:54 schreef Videomodulator:
Levensduur kan je dan even narekenen, stel dat ie elke 4 seconden een schrijfactie doet gaat het EEPROM 46 dagen mee, ik denk niet dat je vingers het overleven om zo lang aan dat knopje te draaien.

Ga maar na wat er gebeurt als je elke minuut een backup in EEPROM zet, of elke 5 minuten ;)

Het is niet nodig om een waarde continue naar EEPROM te schrijven, je kan het gerust eerst in RAM houden en zo nu en dan deze te backuppen. En dat natuurlijk alleen als de waarde afwijkt van de vorige waarde.

De variabele die ik heb heet teller ,gedeclareerd als byte en komt van de rotary encoder.

hoofdmenu:

 while 1=1
  kleur = teller
    pwm roodled,kleur,1
    pwm blauwled,kleur,1
    pwm groenled,kleur,1
  wend
 end

EEprom zou niet echt nodig zijn.
CWRITE en CREAD werken trouwens niet met een 16f628a.

hoofdmenu:

kleur = teller
SELECT CASE kleur
    CASE <84
        groen=kleur
        rood=84-groen
        blauw=0
    CASE 85 TO 169
        kleur=kleur-85
        blauw=kleur
        groen=84-blauw
        rood=0
    CASE 170 TO 255
        kleur=kleur-170
        rood=kleur
        blauw=84-rood
        groen=0
END SELECT

PWM blauwled,blauw,1
;PWM groenled,groen,1
;PWM roodled,rood,1
GOTO hoofdmenu 

Ik heb nu dit gedaan en waarde van de rotary ( teller ) word kleur .
Dit gaat alleen goed met 1 kleur en met 2 x of 3 x pwm niet
hoe kan dit?

Ik heb de vraag ook gepost op picbasic.org, daar word gezegt dat het aan de hardware ligt.
Dit is onwaarschijnlijk want als ik de commando's 1 voor 1 geef dan gaat het wel

  
PWM blauwled,teller,1
;PWM groenled,teller,1
;PWM roodled,teller,1

Nu kan ik dus de blauwe led dimmen van 1 tot 100%, dit geld voor iedere kleur apart.
Zodra ik 2 of 3 PWM kanalen tegelijk doe gaat alles 100% branden

Ik heb nu de PWM instructie gewisseld voor PULSOUT.
Nu werkt het geheel wel en kan ik met de rotary de kleur instellen die ik wil hebben.

PULSOUT  roodled,rood
PULSOUT  blauwled,blauw
PULSOUT groenled,groen

Het rare vind ik dat het met PWM niet werkt , het lijkt wel als je meerdere instructie geeft met PWM dat deze niet meer werkt .
Heeft iemand hier een logische verklaring voor?

PWM werkt ook:


;16F628A PWM test

Device 16F628A               
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF             

Dim Duty As Byte              

While 1 = 1                   
  For Duty = 1 To 255       
    PWM PORTA.0, Duty, 1
    PWM PORTA.1, Duty, 1
    PWM PORTA.2, Duty, 1
  Next
Wend                          
End 

Geen enkel probleem.