Heeft iemand een goede en simpele methode voor een PWM progje (in asm niet jal!) dat een ledje helemaal aan en uit kan sturen, het liefst langzaam (voor RGB leds later) Met de onderstaande testroutine kan ik een dutycycle generen van 1 tot 254, echter brandt de led nog zwakjes met een DC (dutycycle)van 1 en is deze ook niet volledig aan (minder vel dan rechtstreeks aan de +5v) met een DC van 254, als ik de switches op 0 of 255 zet gaat het fout.
bv een dc van 255 wordt: 255 x led_on dan 255-255=0 >> decfsz temp = weer 255!!! dus ook weer 255 x led_off!!!

p.s. de jal voorbeeldjes (van de rgbfan) werken niet mooi omdat het fade-to-on efffect niet alleen bij hhet nieuwe ledje dat aan gaat wordt uitgevoerd maar ook bij de leds die al aan stonden. veroorzaakt een lelijk knipper effect :-(

Mijn uiteindelijke doel is (voorlopig) een asm versie te maken van het jal RGBfan progje, dus een voor een 4 rgb-ledjes van alle kleuren te voorzien dus een led cycled doorr alle kleuren, blijft dan op een kleur staan en de volgende led doet hetzelfde totdat alle 4 leds geweest zijn en dan weer opnieuw.

;*************************************************
;test to determine dutycycle/led brightness
;active-low switches on PORT B0-7 via 10K to Vcc
;LED anode + 100ohm on port A0, LED kathode to GND

dutty equ 40h
temp equ 41h
;--- config ---
org 00h
bsf STATUS, RP0 ;switch to bank1
clrf TRISA ;porta as input
movlw h'ff' ;portb as output
movwf TRISB
bcf STATUS, RP0 ;switch to bank0
;--------------
pwm movf PORTB,w
movwf temp
comf temp ;ext-switches active-low, reverse

bsf PORTA,0 ;LED on a0
pwm_on nop
nop ;wait few cycles
decfsz temp
goto pwm_on

movlw h'ff' ;calc off dutycycle= 255 - (dutycycle on)
movwf temp
movf POTB,w
subwf temp,,f ;sub W from temp, rest. in temp

bcf PORTA,0 ;LED off a0
pwm_off nop
nop
decfsz temp
goto pwm_off
goto pwm

end
;*****************************************************

p.s. de PWM-routine gaat ook dienen om traploos met, twee switches, aan aantal witte leds (plafond-verlichting)volledig aan of uit te dimmen. vooral het traploos laten oplopen van de dutycycle vanaf 0 niet 1 lukt me niet.

ik gebruik een 4 Mhz cristal dus elke single cycle instructie duurt toch 1u sec? 1/(4 MHz/4)

ik heb er wel eentje geprogrammeerd in c taal
deze kan je later weer weer assembleren in een hex file:
#include "16f628.h"
#pragma bit RBPU @ OPTION.7

void delay(char sec)
{
OPTION=2;
do{
TMR0=0;
while(TMR0<128)
;
}while( -- sec >0);
}

void main(void)
{
PR2=138; //pr2 waarde 138 geven
CCPR1L=69; //waarde 39 naar ccpr1l schrijven
CCP1CON=bin(10); //WAARDE 10 NAAR CCP1CON
TRISB3=0; //portb als uitgang instel
TRISB0=1;
TRISB4=1;
RBPU=0;
TMR2=1; //Prescaler tmr2 op 1 zetten
TMR2ON=1; //enable timer 2
CCP1CON=bin(1111); //PWM modus activeren
char sec;

while(1)
{

if(RB0==1)
{
CCPR1L=CCPR1L-1;
delay(sec);
}

if(RB4==1)
{
CCPR1L=CCPR1L+1;
delay(sec);
}
}
}
de rb0 en rb4 zijn aangesloten op de schakelaars voor de rest werkt dit programma zo
met: PR2=138; //pr2 waarde 138 geven
CCPR1L=69; //waarde 39 naar ccpr1l schrijven
kan je de pulsbreedte veranderen.

Op 3 september 2003 16:08:52 schreef Tardis:
Heeft iemand een goede en simpele methode voor een PWM progje (in asm niet jal!) dat een ledje helemaal aan en uit kan sturen, het liefst langzaam (voor RGB leds later) Met de onderstaande testroutine kan ik een dutycycle generen van 1 tot 254, echter brandt de led nog zwakjes met een DC (dutycycle)van 1 en is deze ook niet volledig aan (minder vel dan rechtstreeks aan de +5v) met een DC van 254, als ik de switches op 0 of 255 zet gaat het fout.
bv een dc van 255 wordt: 255 x led_on dan 255-255=0 >> decfsz temp = weer 255!!! dus ook weer 255 x led_off!!!

p.s. de jal voorbeeldjes (van de rgbfan) werken niet mooi omdat het fade-to-on efffect niet alleen bij hhet nieuwe ledje dat aan gaat wordt uitgevoerd maar ook bij de leds die al aan stonden. veroorzaakt een lelijk knipper effect :-(

Mijn uiteindelijke doel is (voorlopig) een asm versie te maken van het jal RGBfan progje, dus een voor een 4 rgb-ledjes van alle kleuren te voorzien dus een led cycled doorr alle kleuren, blijft dan op een kleur staan en de volgende led doet hetzelfde totdat alle 4 leds geweest zijn en dan weer opnieuw.

;*************************************************
;test to determine dutycycle/led brightness
;active-low switches on PORT B0-7 via 10K to Vcc
;LED anode + 100ohm on port A0, LED kathode to GND

dutty equ 40h
temp equ 41h
;--- config ---
org 00h
bsf STATUS, RP0 ;switch to bank1
clrf TRISA ;porta as input
movlw h'ff' ;portb as output
movwf TRISB
bcf STATUS, RP0 ;switch to bank0
;--------------
pwm movf PORTB,w
movwf temp
comf temp ;ext-switches active-low, reverse

bsf PORTA,0 ;LED on a0
pwm_on nop
nop ;wait few cycles
decfsz temp
goto pwm_on

movlw h'ff' ;calc off dutycycle= 255 - (dutycycle on)
movwf temp
movf POTB,w
subwf temp,,f ;sub W from temp, rest. in temp

bcf PORTA,0 ;LED off a0
pwm_off nop
nop
decfsz temp
goto pwm_off
goto pwm

end
;*****************************************************

ja hoor kan je daar wel aan helpen gebruik ook een pic16f84a voor rgb leds