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