Sida 2 av 2

Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)

Postat: 26 mars 2009, 15:50:46
av dangraf
Om du vill experimentera ännu mer med din diod (om du har många) så skulle du kunna överladda den och få den att lysa mer än vad som egentligen är specat i databladet.

om man läser t.ex i databladet
https://www1.elfa.se/data1/wwwroot/webr ... 500010.pdf

så står det i kapitlet: Absolute Maximum Ratings
"forward current 30mS" och
"PulseForward Current 100mA"

Om du pulsar ut 100mA med 1/10 duty som står i databladet så kan ögat uppfatta ljusstyrkan som mycket starkare än att bränna på med konstant ström på 30mA helatiden.

Risken finns givetvis att när man håller på såhär och leker så kan man bränna sönder dioden av misstag (t.ex om man råkar lägga på 100% duty av misstag)
Jag vet inte vilken diod du använder och du får givetvis titta i rätt datablad om du ska testa vidare.. ;-)

Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)

Postat: 11 april 2009, 23:47:04
av Swech
Du kommer nog att låsa in dig i ett hörn om du tar din dimmerrutin och gör om den till en
subrutin som du anropar för olika dioder.

Din rutin gör följande i dagsläget.
Tänder en diod
Startar en delay i mjukvara....
När delayen är slut så släcker du dioden igen
och väntar ytterligare en tid.

Första problemet. Mjukvarudelay. Om man räknar ned med hjälp av processorn så är
den ju upptagen med detta och kan inte göra något annat......
Därför har processorerna oavsett familj inbyggda timers. Dessa räknar ned automatiskt
(förutsatt att man ställt in dem). Så medans timern räknar kan processorn pyssla med annat.

Problem nr 2. Din rutin är ihopknuten på så sätt att du låter rutinen både räkna och sköta lysdiodsutgången.
Dela upp problemet i följande delar.
1. Jag behöver en rutin som kan räkna tid.
2. jag behöver en rutin som när inställd tid har passerat tänder/släcker en lysdiod.

Din första rutin behöver inte vara längre än.

Kod: Markera allt

   
   Incfsz,delay_div_count,same ;öka delay div count med 1  
   Return                               ;delay div count <> 0 så återgå
   incf delay_count,same          ; öka delay count med 1   
   Return 
dock bättre att läsa på och använda sig av en inbyggd timer, exemplet ovan ger en mycket
snabb timer...

Din andra rutin kan se ut som följer.

Kod: Markera allt

 bcf     portx,my_led_pin       
 movf   delay_count,w
 subwf  pwm_value,w  
 btfss status,c
 bsf    portx,my_led_pin
 return 


Med reservation för att jag är rostig på PIC kod.

Själva poängen är att dela upp problem i rutiner som vid första anblick verkar lite
märkliga, varför ha en rutin som räknar och en som kollar... Men efter ett tag
inser man hur lätt allt blir då arbetet delas upp.

Sedan kommer säkert någon att påpeka att det finns inbyggda PWM moduler också men
det är inte poängen med exemplen.

Swech

Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)

Postat: 12 april 2009, 17:20:24
av v-g
Brukar använda WREG som ett register när det ska skickas med en variabel.