新會員
Joined
: 2006/4/11 0:58 最後登入時間
: 2006/11/12 11:43
Group:
註冊會員
Level : 1 HP : 0 / 15 MP : 2 / 814 EXP : 60
|
各位大哥大姐您好: 我設計一 使用ra0與ra1作ad轉換後 去執行邏輯判斷 當ra1值介於 81~101時才有輸出功能, 並將ad_ra0同時輸出至 PORTB與PORTD 然後將PORTB與PORTD以PWM形式輸出用示波器查看 但顯示出來 在某些範圍內沒有同步, 也就是兩個PWM訊號不一樣 PORTD的訊號總是會怪怪的 不知道有沒辦法解決, 謝謝!
;設計一每0.5ms計時中斷 tmr0 rate=1:16,20MHz,0.2 instrument-->3.2us,計時第156.25次時剛好0.5ms,所以tmr0出使設定為99 list p=16f877a,r=dec include <p16f877a.inc> ;----user varibles------- ad_ra0 equ 0x20 ad_ra1 equ 0x21 count equ 0X28 CounterA equ 0x29 CounterB equ 0x2a CounterC equ 0x2b w_temp equ 0x2c status_temp equ 0x2d
;----user reset vector--- org 0x00 nop goto mainline ;----Interrupt Vector--- org 0x04 goto IntService ;----Interrupt Service Routine--- IntService: movwf w_temp swapf STATUS,w movwf status_temp movf PORTB,W banksel CCPR1L movwf CCPR1L movf PORTD,W MOVWF CCPR2L
btfsc INTCON,T0IF call Timer0
swapf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;---Timer1 subroutine--- Timer0: banksel INTCON bcf INTCON,T0IF movlw .126 movwf TMR0 bsf INTCON,GIE return ;----mainprogram-------- mainline: call initial mainloop call ad_convert call ad_convert1 call LOGIC call Delay goto mainloop ;---initial subroutine-- initial: banksel TRISB clrf TRISB banksel PORTB clrf PORTB ; banksel TRISD clrf TRISD banksel PORTD clrf PORTD ; banksel TRISC ;for pwm initial clrf TRISC banksel PORTC clrf PORTC ; banksel PR2 movlw .249 movwf PR2 ; banksel TMR2 clrf TMR2 ; movlw 0x00 movwf CCPR1L MOVWF CCPR2L ; movlw 0x0c movwf CCP1CON MOVWF CCP2CON ; movlw 0x04 movwf T2CON ; banksel ADCON1 movlw b'00000000' movwf ADCON1 ; bsf TRISA,0 bsf TRISA,1 bsf TRISA,2 bsf TRISA,3 bsf TRISA,5 bsf TRISE,0 bsf TRISE,1 bsf TRISE,2 ; clrw clrf PCLATH banksel OPTION_REG movlw B'00000011' movwf OPTION_REG banksel TMR0 movlw .99 movwf TMR0 ; bsf INTCON,T0IE bsf INTCON,GIE
return ;-----adconvert----------- ad_convert: banksel ADCON0 movlw b'10000001' movwf ADCON0 call dly_20us banksel ADCON0 bsf ADCON0,GO AD_wait btfsc ADCON0,GO goto AD_wait ; movf ADRESH,W movwf ad_ra0
return ;-----adconvert1----------- ad_convert1: banksel ADCON0 movlw b'10001001' movwf ADCON0 call dly_20us banksel ADCON0 bsf ADCON0,GO AD_wait1 btfsc ADCON0,GO goto AD_wait1 ; movf ADRESH,W movwf ad_ra1
return ;------dly------------- dly_20us: NOP MOVLW .24 MOVWF count DECLOOP NOP DECFSZ count,F GOTO DECLOOP RETURN
;------LOGIC---------- LOGIC: MOVLW .82 ;if((ra1<101)&&(ra1>81)) 81 ~ 101 直線 BANKSEL ad_ra1 SUBWF ad_ra1,W BTFSS STATUS,C CLRF ad_ra0 MOVLW .101 SUBWF ad_ra1,W BTFSS STATUS,C GOTO straight_line CLRF ad_ra0 RETURN
;========== straight_line mode ============== straight_line: MOVF ad_ra0,W MOVWF PORTB MOVWF PORTD RETURN
;PIC Time Delay = 0.1 s with Osc = 20.000000 MHz Delay movlw D'3' movwf CounterC movlw D'140' movwf CounterB movlw D'83' movwf CounterA loop decfsz CounterA,1 goto loop decfsz CounterB,1 goto loop decfsz CounterC,1 goto loop return
end
發表於: 2006/11/12 20:51
|