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
|