上菜啦.... 請慢用 .....haha ..
這是用12F508 寫的 Dual PWM.還有一些小虫虫..
基本上會Work ,目前暫時丟一邊 ,
又回到10F200 寫的 PWM ,兩個PIC 同步問題也解決了..
明日再上菜 .. 免得漲肚子囉 ..哈..哈..
Sorry , Yahoo 的圖片網已經停用啦 !!!
目前不知如何貼圖了...
上次問版大,,, 結果..沒人鳥偶啦 !! 嗚..嗚..
; PIC12F508 FOR TBT LAMP with Dual PWM 07-10-2007
#include <p12F508.inc> ; processor specific variables
; Configure: Controls the reset pin, code protect, oscillator selection, WDT.
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF &_IntRC_OSC
;*****************************[Defines & Variable Assignments]****************
cblock 0x08
mark_r ; For Red PWM MARK register.
space_r ;For Red PWM SPACE register.
mark_b ; ForBlue PWM MARK register.
space_b ;For Blue PWM SPACE register.
count ; For delay loop register.
count1 ; For delay loop register.
count2 ; For delay loop register.
count3 ; For Red PWM mark temporary register.
count4 ; For Red PWM space temporary register.
count5 ; For Blue PWM mark temporary register.
count6 ; For Blue PWM space temporary register.
endc
;****************************[Reset Vector]*********************************
ORG 0x000 ; PIC goes here (Origin of code) after reset.
movwf OSCCAL ; Load the oscillator calibration factor.
movlw b'10000111' ; Disable wake on pion change and Enable pull-ups resister,max pre-scaler
OPTION ;
movlw b'00001111' ; Set GP 0, 1,2,3, to an input, GPIO 4,5 to outputs.
TRIS GPIO ; GP0= UP,GP1 = DOWN, GP2= R+/B-, GP3=R-/B+, GP4= RPWM ,GP5=BPWM.
;-----[Main routine]---------------------------------------------------------
start
movlw d'25' ;Minimum power setting.
movwf mark_r ;
movwf mark_b ;
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_r ;Stored w into space_r register for PWM reference.
movwf space_b ;Stored w into space_b register for PWM reference.
loop
btfss GPIO,0 ;Check GP0 if goes to L.
goto up_r ;
btfss GPIO,1 ;Check GP1 if goes to L.
goto down_r ;
btfss GPIO,2 ;Check GP2 if goes to L.
goto up_dn ;
btfss GPIO,3 ;Check GP3 if goes to L.
goto dn_up ;
keep
movf mark_r,w ;
movwf count3 ;
movf space_r,w ;
movwf count4 ;
movf mark_b,w ;
movwf count5 ;
movf space_b,w ;
movwf count6 ;
call pwm_r ;
call pwm_b ;
goto loop ;
;********************************* PWM Routine ******************************************
pwm_r
bsf GPIO,4 ;Turn on Red PWM.
call delay_10us ;
decfsz count3,f ;Minimum Mark = 26 x 10us =260us.
goto pwm_r ;Maximum Mark = 239 x 10us = 2.39ms.
bcf GPIO,4 ;Turn PWM off.
pwm_1
call delay_10us ;
decfsz count4,f ;Minimuum Space = 10us x 16 = 160us.
goto pwm_1 ;Maximum Space = 10us x 229 = 2.29ms.
retlw 0 ;
pwm_b
bsf GPIO,5 ;Turn on Blue PWM.
call delay_10us ;
decfsz count5,f ;Minimum Mark = 26 x 10us =260us.
goto pwm_b ;Maximum Mark = 239 x 10us = 2.39ms.
bcf GPIO,5 ;Turn PWM off.
pwm_2
call delay_10us ;
decfsz count6,f ;Minimuum Space = 10us x 16 = 160us.
goto pwm_2 ;Maximum Space = 10us x 229 = 2.29ms.
retlw 0 ;
;***************************** Up Routine **********************************
up_r
movlw d'250' ;Maximum power refrence.
subwf mark_r,w ;Mark_r - 250 = ?
btfsc STATUS,C ;Check C Flag.
goto pw_100_r ;If mark_r >= 250 then C = 1.
incf mark_r,f ;Increment Mark_r register.
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_r ;Stored w into space_r register for PWM reference.
up_b
movlw d'250' ;Maximum power refrence.
subwf mark_b,w ;Mark_b - 250 = ?
btfsc STATUS,C ;Check C Flag.
goto pw_100_b ;If mark_b >= 250 then C = 1.
incf mark_b,f ;Increment Mark_b register.
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
;***************************** Down Routine *******************************
down_r
movlw d'25' ;Minimum power refrence.
subwf mark_r,w ;Mark_r - 25 = ?
btfss STATUS,C ;Check C flag.
goto pw_20_r ;If mark_r < 25 then C = 0.
decf mark_r,f ;Decrement mark_r register.
comf mark_r,w ;The contents of mark_r register are complemented and store into w.
movwf space_r ;Stored w into space_r register for PWM reference.
down_b
movlw d'25' ;Minimum power refrence.
subwf mark_b,w ;Mark_b - 25 = ?
btfss STATUS,C ;Check C flag.
goto pw_20_b ;If mark_b < 25 then C = 0.
decf mark_b,f ;Decrement mark_b register.
comf mark_b,w ;The contents of mark_b register are complemented and store into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
;************************* UP - Down Routine *********************************
up_dn
movlw d'250' ;Maximum power refrence.
subwf mark_r,w ;Mark_r - 250 = ?
btfsc STATUS,C ;Check C Flag.
goto pw_100 ;If mark_r >= 250 then C = 1.
incf mark_r,f ;Increment Mark_r register.
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_r ;Stored w into space_r register for PWM reference.
up_dn_1
movlw d'25' ;Minimum power refrence.
subwf mark_b,w ;Mark_b - 25 = ?
btfss STATUS,C ;Check C flag.
goto pw_20 ;If mark_b < 25 then C = 0.
decf mark_b,f ;Decrement mark_b register.
comf mark_b,w ;The contents of mark_b register are complemented and store into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
;************************* Down - UP Routine *********************************
dn_up
movlw d'25' ;Minimum power refrence.
subwf mark_r,w ;Mark_r - 25 = ?
btfss STATUS,C ;Check C flag.
goto pw_20_1 ;If mark_r < 25 then C = 0.
decf mark_r,f ;Decrement mark_r register.
comf mark_r,w ;The contents of mark_r register are complemented and store into w.
movwf space_r ;Stored w into space_r register for PWM reference.
dn_up_1
movlw d'250' ;Maximum power refrence.
subwf mark_b,w ;Mark_b - 250 = ?
btfsc STATUS,C ;Check C Flag.
goto pw_100_1 ;If mark_b >= 250 then C = 1.
incf mark_b,f ;Increment Mark_b register.
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
;********************************** Power Rate ****************************
pw_100
movlw d'250' ;Maximum Power setting.
movwf mark_r ;
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_r ;Stored w into space_r register for PWM reference.
goto up_dn_1 ;
pw_20
movlw d'25' ;Minimum power refrence.
movwf mark_b ;
comf mark_b,w ;The contents of mark_r register are complemented and stored into w.
movwf space_b ;Stored w into space_r register for PWM reference.
goto keep ;
pw_100_1
movlw d'250' ;Maximum Power setting.
movwf mark_b ;
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
pw_20_1
movlw d'25' ;Minimum power refrence.
movwf mark_b ;
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
pw_100_r
movlw d'250' ;Maximum Power setting.
movwf mark_r ;
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_r ;Stored w into space_r register for PWM reference.
goto up_b ;
pw_20_r
movlw d'25' ;Minimum power refrence.
movwf mark_r ;
comf mark_r,w ;The contents of mark_r register are complemented and stored into w.
movwf space_b ;Stored w into space_r register for PWM reference.
goto down_b ;
pw_100_b
movlw d'250' ;Maximum Power setting.
movwf mark_b ;
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
pw_20_b
movlw d'25' ;Minimum power refrence.
movwf mark_b ;
comf mark_b,w ;The contents of mark_b register are complemented and stored into w.
movwf space_b ;Stored w into space_b register for PWM reference.
goto keep ;
; *****************************[Delay routine]*******************************************
delay_10us
movlw d'3' ;
movwf count ;
loop_3
decfsz count,f ;
goto loop_3 ;
retlw 0 ;
end