23-12-2010, 12:30 AM | #2 |
Đệ tử 2 túi
Tham gia ngày: Oct 2008
Bài gửi: 44
: |
Mình có 1 chương trình viết bằng ASM lấy ADC từ A0 đưa ra CCP1 và CCP2 dùng điều khiển tốc độ motor hoặc RC servo
PROCESSOR 16F877A #INCLUDE "P16F877A.INC" __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF COUN EQU 0x20 COUN1 EQU 0x21 ORG 0x0000 GOTO MAIN ORG 0x0005 MAIN BSF STATUS,RP0 MOVLW 0x00 MOVWF TRISB LOOP CALL ADC_ROUTINE CALL PWM_ROUTINE GOTO LOOP ;================================================= ================================================== ==== ROUTINE ;================================================= ================================================== ==== ADC_ROUTINE MOVLW 0x0E ; Vref+ = Vdd, Vref- = Vcc, AN0 = ANALOG, ALL DIGITAL MOVWF ADCON1 MOVLW 0x01 MOVWF TRISA BCF STATUS,RP0 MOVLW 0x01 ;CHON RA0 LAM NGO VAO,ADON=1,BAT ADC MOVWF ADCON0 MOVLW D'10' MOVWF COUN BACK MOVLW D'4' ;CHO 1 KHOANG THOI GIAN TRUOC KHI BAT DAU MOVWF COUN1 DECFSZ COUN1,F GOTO $-1 DECFSZ COUN,F GOTO BACK BSF ADCON0,GO ;SET BIT "GO",BAT DAU CONVERT ;--------------------------------------- KIEM TRA KET QUA ----------------------------- BTFSC ADCON0,GO ;KIEM TRA BIT "DONE" CUA ADCON0 GOTO $-1 MOVF ADRESL,0 MOVWF PORTB RETURN ;================================================= ================================================== ==== PWM_ROUTINE MOVWF CCPR1L MOVWF CCPR2L BANKSEL TRISC MOVLW D'0' ;set PORTC as all outputs MOVWF TRISC BANKSEL PORTC MOVLW 0x0C MOVWF CCP1CON MOVLW 0x0C MOVWF CCP2CON MOVLW D'255' ;set highest PWM value BANKSEL PR2 ;over this (255) is permanently on MOVWF PR2 BANKSEL TMR2 MOVLW 0x02 MOVWF T2CON BSF T2CON, TMR2ON ;and start the timer running RETURN END |
|
|