Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
發表於: 2007/7/18 11:46
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
file download是我把原始檔上傳到免費的網路空間,再連結給大家下載,你有原始檔就可以自己做個新的專案了吧,這有什麼神奇?!
FSR,你要看16F57的data sheet比較清楚啦~ 基本上一組pwm和N組pwm是一樣的,你會不會有改到什麼東西造成第2組pwm沒動作??按鍵都有加個100K電阻pull hi吧. 我做的是2組可調式的PWM,我手頭上沒有東西可以試啦~你就自己稍微改一下下吧,改chk_keyin那一段就可以了,重要的是那個timer的程式架構要能看懂,對以後寫各種程式都很有幫助的, 因為我用的是3M博士燈,不閃光,不傷眼睛哦~
發表於: 2007/7/18 9:33
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
"file download ", 可以直接建個新專案 ????
哈.. 哈... 笨鴨就是笨鴨, 又學到一招 ; 3Q lar ! 板主要笨鴨進化 , 看來還有段路要走呦 . 哈.. 哈... 嗯... 程式用到 Timer0 & FSR ??? 笨鴨還不會用的 ,咚, 咚 ; 尤其是 FSR... 不瞭??? 燒個12F508 測試,發現一個問題 , PWM1 UP and DOWN 正常 , PWM2 無法控制 ,不知錯在那兒? 還有呀? 兩個PWM控制方式, 應該是如此 (Sorry 未說清楚) ----> UP = 兩個PWM, 同時可以由最少20% PWM to 100% ( High ). DOWN = 兩個PWM , 同時可以 由最100% (High) to 20% PWM. UP_DN =一個PWM UP, 另一個PWM DOWN. DN_UP =一個PWM DOWN 另一個PWM UP . 因為有兩支燈管 ,一隻是白色, 另一隻是藍色; 所以可以調色差, 台灣應該也有的買. 因為會閃爍, 對眼睛不好 ,所以才想試圖改改它... 也希望個位也可以受惠囉 ... haha.
發表於: 2007/7/17 23:50
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
不用key in吧,我有把原始檔做在上面的file download沒看到嗎??可以直接建個新專案,編譯後就可以燒錄了,但我用的是57你要記得把device,include換回508..其它應該都相同吧..
說到腳位就神奇了,看了data sheet才發現,原來16F57,16F505,12F508居然是同一個系列的IC,都只有tmr0,和一些I/O可以用,只是rom,I/O數量有些不同而已.因為只有16F57的模擬模組,剛好手邊有57轉505的小板子就拿來用了,又剛好505的上半部的腳位就剛好是508的腳位,於是乎就照你的腳位定義了.
發表於: 2007/7/17 8:07
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
發表於: 2007/7/16 23:53
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
改好了,但有稍微做了一些調整..
file download ;************************************************ ; PROJECT: 2組可控制的PWM輸出 ; EDITOR : YIMING ; DATE :2007/07/16 ;************************************************ #INCLUDE <P16F5X.INC> ;USER DEFINE RAM OSCCAL EQU H'0005' GPIO EQU H'0006' TEMP EQU H'0008' ;COMM USE WORK EQU H'0009' ;COMM USE T100US EQU H'0010' TGPIO EQU H'0011' ;TEMP GPIO OGPIO EQU H'0012' ;OLD GPIO PWM1_ON EQU H'0013' PWM2_ON EQU H'0014' PWM1_CNT EQU H'0015' PWM2_CNT EQU H'0016' ;************************************************ #DEFINE PWM1_PERIOD .12 ;1200US #DEFINE PWM2_PERIOD .12 ;1200US #DEFINE PWM1_PERIOD_MAX .24+1 ;2400US #DEFINE PWM2_PERIOD_MAX .24+1 ;2400US #DEFINE PWM1_PERIOD_MIN .4 ;400US #DEFINE PWM2_PERIOD_MIN .4 ;400US ;************************************************ ;GPIO=05H SW_UP1 EQU .0 SW_DN1 EQU .1 SW_UP2 EQU .2 SW_DN2 EQU .3 PWM1 EQU .4 PWM2 EQU .5 ;************************************************ ORG 0H MOVWF OSCCAL INIT: MOVLW B'10000001' ;TIMER0 PRESCAL 1:4 OPTION MOVLW B'00001111' TRIS GPIO MOVWF GPIO ;CLRF GPIO MOVLW H'08' MOVWF FSR CLRF_RAM: CLRWDT ;CLRF RAM 10H~1FH CLRF INDF INCF FSR,F BTFSS FSR,5 ;20H GOTO CLRF_RAM CLRF FSR ;B0 DLY_250MS: CLRWDT DECFSZ WORK,F GOTO DLY_250MS DECFSZ TEMP,F GOTO DLY_250MS GOTO START ;************************************************ TIMER: CLRWDT MOVLW H'17' SUBWF TMR0,W BTFSS STATUS,C GOTO TIMER CLRF TMR0 INCF PWM1_CNT,F INCF PWM2_CNT,F DECFSZ T100US,F GOTO MQ1 MOVLW .50 MOVWF T100US ;5MS DEBOUNCE I/O DEBOUNCE_IO: MOVLW B'00001111' ANDWF GPIO,W MOVWF WORK XORWF TGPIO,W BTFSS STATUS,Z GOTO TRAB MOVF WORK,W MOVWF OGPIO TRAB: MOVF WORK,W MOVWF TGPIO GOTO CHK_KEYIN MQ1: RETLW .0 ;************************************************ START: MOVLW (PWM1_PERIOD_MAX+PWM1_PERIOD_MIN)/2 ;中間值 MOVWF PWM1_ON MOVLW (PWM2_PERIOD_MAX+PWM2_PERIOD_MIN)/2 ;中間值 MOVWF PWM2_ON MOVLW .50 MOVWF T100US BSF GPIO,PWM1 BSF GPIO,PWM2 LOOP: CALL TIMER ;PWM1 MOVF PWM1_ON,W SUBWF PWM1_CNT,W BTFSC STATUS,C BCF GPIO,PWM1 MOVLW PWM1_PERIOD_MAX SUBWF PWM1_CNT,W BTFSS STATUS,C GOTO $+3 CLRF PWM1_CNT BSF GPIO,PWM1 ;PWM2 MOVF PWM2_ON,W SUBWF PWM2_CNT,W BTFSC STATUS,C BCF GPIO,PWM2 MOVLW PWM2_PERIOD_MAX SUBWF PWM2_CNT,W BTFSS STATUS,C GOTO $+3 CLRF PWM2_CNT BSF GPIO,PWM2 GOTO LOOP ;************************************************ CHK_KEYIN: MOVF TGPIO,W XORWF OGPIO,W MOVWF TEMP CHK_UP1: BTFSC GPIO,SW_UP1 GOTO CHK_DN1 MOVLW B'00000001' ;SW_UP1 ANDWF TEMP,W BTFSC STATUS,Z GOTO CHK_DN1 INCF PWM1_ON,F MOVLW PWM1_PERIOD_MAX-PWM1_PERIOD_MIN SUBWF PWM1_ON,W BTFSS STATUS,C GOTO CHK_DN1 DECF PWM1_ON,F CHK_DN1: BTFSC GPIO,SW_DN1 GOTO CHK_UP2 MOVLW B'00000010' ;SW_DN1 ANDWF TEMP,W BTFSC STATUS,Z GOTO CHK_UP2 DECF PWM1_ON,F MOVLW PWM1_PERIOD_MIN SUBWF PWM1_ON,W BTFSC STATUS,C GOTO CHK_UP2 INCF PWM1_ON,F CHK_UP2: BTFSC GPIO,SW_UP2 GOTO CHK_DN2 MOVLW B'00000100' ;SW_UP2 ANDWF TEMP,W BTFSC STATUS,Z GOTO CHK_DN2 INCF PWM2_ON,F MOVLW PWM2_PERIOD_MAX-PWM2_PERIOD_MIN SUBWF PWM2_ON,W BTFSS STATUS,C GOTO CHK_DN2 DECF PWM2_ON,F CHK_DN2: BTFSC GPIO,SW_DN2 GOTO EXIT_CHK_KEY MOVLW B'00001000' ;SW_DN2 ANDWF TEMP,W BTFSC STATUS,Z GOTO EXIT_CHK_KEY DECF PWM2_ON,F MOVLW PWM2_PERIOD_MIN SUBWF PWM2_ON,W BTFSC STATUS,C GOTO EXIT_CHK_KEY INCF PWM2_ON,F EXIT_CHK_KEY: GOTO MQ1 ;************************************************ END
發表於: 2007/7/16 14:09
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
嗯,CALL RETLW 各佔2US,另一個好處是省一個RAM位址(count).
看完了,這樣子是2個pwm輪流送,這樣時的PWM時間不準,會有問題的 pwm1 on count3,off count4+count5+count6(其實count5,6時間無法控制) pwm2 on count5,off count5+count3+count4(其實count3,4時間無法控制) 你直接抓gp0~gp4的值來用,借用pwm的時間來處理I/O dobounce感覺有點怪怪的,卻又覺得好像可以... 不合理的地方是pwm時間不固定,那debounce的時間就不固定應該會有一點點的彈跳現象,因為debounce的時間太短了. 覺得可以的是,雖然debounce時間太短,會有按一下等於按很多下的感覺,但一次10US的微調實在看不出效果,但如果按一下有幾百us的變化,卻又是剛剛好的.只是感覺不容易調到一個很準的值,但人眼對光沒那麼敏感,應該是OK. 其實我覺得你要的2個PWM用單一個508就能做到了,只是你的程式寫法有問題,我要想一下該怎麼寫.. 那4個按鍵是你自己加的吧,++,--,+-,-+,我想是你自己做測試要用的吧... 我想你應該知道pwm的範圍和最小的微調量吧,是多少呢?? 260US~2.39MS 對嗎?? ............count3 .........+----------+ ..........|.............| --------+.............+---------------------------------------------- ..............................count4 .....................................................count5 ..................................................+----------+ ...................................................|.............| ..........--------------------------------+..............+-------------- .......................................................................count6
發表於: 2007/7/16 8:05
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
3Q lor, Dealy 程式簡潔多了 ,
有個地方不了.. 呼叫副程式4us , 是指 Call delay_10us 佔用2us ; retlw ,0 佔用 2us 對不對呢? Ok ...上主菜啦 ... yami yami ...ㄜ依西內 , haha. 工作情況很滿意 , 兩個10F200 的PWM不會漂移, 請參考囉! 兩個程式很相同, 只差在Master 送出SYNC, 而Slave 測試 SYNC. ; PIC10F200 FOR TBT LAMP Master 07-12-2007 #include <p10F200.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 0x10 mark_v ; For PWM MARK register. space_v ;For PWM SPACE register. count ; For delay loop register. count1 ; For delay loop register. count2 ; For delay loop register. count3 ; For PWM mark temporary register. count4 ; For 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'00001010' ; Set GP1,3, to an input, GP0,2 to outputs. TRIS GPIO ; GP1= UP,GP3 = DOWN, GP0=SYNC O/P, GP2 = PWM. ;-----[Main routine]--------------------------------------------------------- start movlw d'25' ;Minimum power setting. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. loop btfss GPIO,1 ;Check GP1 if goes to L. goto up ; btfss GPIO,3 ;Check GP3 if goes to L. goto down ; keep movf mark_v,w ; movwf count3 ; movf space_v,w ; movwf count4 ; bsf GPIO,0 ;Sync CLK output. goto $+1 ;2us delay, goto $+1 ;2us delay, bcf GPIO,0 ; call pwm ; goto loop ; loop_1 bsf GPIO,0 ;SYNC on. btfss GPIO,1 ;Check GP1 if goes to L. goto up ; btfss GPIO,3 ;Check GP3 if goes to L. goto down ; goto pw_100 ; ;***************************** Up Routine ********************************** up movlw d'254' ;Maximum power refrence. subwf mark_v,w ;Mark_v - 254 = ? btfsc STATUS,C ;Check C Flag. goto pw_100 ;If mark_v >= 254 then C = 1. incf mark_v,f ;Increment Mark_v register. comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. goto keep ; ;***************************** Down Routine ******************************* down movlw d'25' ;Minimum power refrence. subwf mark_v,w ;Mark_v - 25 = ? btfss STATUS,C ;Check C flag. goto pw_20 ;If mark_v < 25 then C = 0. decf mark_v,f ;Decrement mark_v register. comf mark_v,w ;The contents of mark_v register are complemented and store into w. movwf space_v ;Stored w into space_v register for PWM reference. goto keep ; ;***************************** PWM Routine ******************************* pwm bsf GPIO,2 ;Turn on PWM. call delay_10us ; decfsz count3,f ;Minimum Mark = 26 x 10us =260us. goto pwm ;Maximum Mark = 239 x 10us = 2.39ms. bcf GPIO,2 ;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 ; ;********************************** Power Rate **************************** pw_100 movlw d'254' ;Maximum Power setting. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. bsf GPIO,2 ; goto loop_1 ; pw_20 movlw d'25' ;Minimum power refrence. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v 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 ; PIC10F200 FOR TBT LAMP SLAVE 07-12-2007 #include <p10F200.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 0x10 mark_v ; For PWM MARK register. space_v ;For PWM SPACE register. count ; For delay loop register. count1 ; For delay loop register. count2 ; For delay loop register. count3 ; For PWM mark temporary register. count4 ; For 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'00001011' ; Set GP0,1,3, to an input, GP2 to outputs. TRIS GPIO ; GP1= UP,GP3 = DOWN, GP0=SYNC I/P, GP2 = PWM. ;-----[Main routine]--------------------------------------------------------- start movlw d'25' ;Minimum power setting. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. loop btfss GPIO,1 ;Check GP1 if goes to L. goto up ; btfss GPIO,3 ;Check GP3 if goes to L. goto down ; keep movf mark_v,w ; movwf count3 ; movf space_v,w ; movwf count4 ; btfss GPIO,0 ;Check Sync CLK. goto $-1 ; call pwm ; goto loop ; loop_1 btfss GPIO,1 ;Check GP1 if goes to L. goto up ; btfss GPIO,3 ;Check GP3 if goes to L. goto down ; goto pw_100 ; ;***************************** Up Routine ********************************** up movlw d'254' ;Maximum power refrence. subwf mark_v,w ;Mark_v - 254 = ? btfsc STATUS,C ;Check C Flag. goto pw_100 ;If mark_v >= 254 then C = 1. incf mark_v,f ;Increment Mark_v register. comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. goto keep ; ;***************************** Down Routine ******************************* down movlw d'25' ;Minimum power refrence. subwf mark_v,w ;Mark_v - 25 = ? btfss STATUS,C ;Check C flag. goto pw_20 ;If mark_v < 25 then C = 0. decf mark_v,f ;Decrement mark_v register. comf mark_v,w ;The contents of mark_v register are complemented and store into w. movwf space_v ;Stored w into space_v register for PWM reference. goto keep ; ;***************************** PWM Routine ******************************* pwm bsf GPIO,2 ;Turn on PWM. call delay_10us ; goto $+1 ;2us decfsz count3,f ;Minimum Mark = 26 x 10us =260us. goto pwm ;Maximum Mark = 239 x 10us = 2.39ms. bcf GPIO,2 ;Turn PWM off. pwm_1 call delay_10us ; goto $+1 ;2us decfsz count4,f ;Minimuum Space = 10us x 16 = 160us. goto pwm_1 ;Maximum Space = 10us x 229 = 2.29ms. retlw 0 ; ;********************************** Power Rate **************************** pw_100 movlw d'254' ;Maximum Power setting. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. bsf GPIO,2 ; goto loop_1 ; pw_20 movlw d'25' ;Minimum power refrence. movwf mark_v ; comf mark_v,w ;The contents of mark_v register are complemented and stored into w. movwf space_v ;Stored w into space_v register for PWM reference. goto keep ; ; *****************************[Delay routine]******************************************* delay_10us movlw d'2' ; movwf count ; loop_3 decfsz count,f ; goto loop_3 ; retlw 0 ; end
發表於: 2007/7/16 6:32
|
|||
|
Re: 關於CLKOUT...
|
||||
---|---|---|---|---|
資深會員
|
嗯,蠻多東西可以玩的,一樣一樣慢慢來吧...這個只是要產生PWM所以有沒有電路圖沒什麼差的,主程式我還要花點時間看,但delay_10us有另一種寫法給你參考.我覺得看起來比較簡潔.
delay_10us: goto $+1 ;2us goto $+1 ;2us goto $+1 ;2us retlw .0 ;呼叫副程式4us 電路圖可以申請個免費網路空間來儲放.我都用hinet空間.
發表於: 2007/7/15 22:06
|
|||
|