微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于PIC16F84的两组PWM输出的实例源程序

基于PIC16F84的两组PWM输出的实例源程序

时间:08-12 来源:互联网 点击:

PIC16F84产生两组PWM输出的实例源程序

;**********************************************************************
list p=16F84 ; list directive to define processor
#i nclude p16F84.inc> ; processor specific variable definitions

__CONFIG _CP_OFF _WDT_OFF _PWRTE_OFF _RC_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;********************** CONST DEFINITIONS******************************
FULL_WORK = 10 ;
DEF_WORK1 = 2 ;
DEF_WORK2 = 8 ;
PORT_OUT = PORTB ;
PIN_PWM1 = 0 ;
PIN_PWM2 = 1 ;
;********************** VARIABLE DEFINITIONS***************************
CBLOCK 0x0C
w_temp ; variable used for context saving
status_temp ; variable used for context saving
PWM_FULL ;
PWM_WORK_CFG1 ;
PWM_WORK_CFG2 ;
PWM_WORK_CNT1 ;
PWM_WORK_CNT2 ;
ENDC
;**********************************************************************
;****************** ***********************
;**********************************************************************
ORG 0x000 ; processor reset vector
ResetStart
goto main ; go to beginning of program
;**********************************************************************
;****************** *************************
;**********************************************************************
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register

bsf STATUS,RP0
bcf INTCON,T0IF ;
bcf STATUS,RP0

decfsz PWM_FULL,F ;
goto ISR_PWM1
bsf PORT_OUT,PIN_PWM1 ;
bsf PORT_OUT,PIN_PWM2
movlw FULL_WORK ;
movwf PWM_FULL
movf PWM_WORK_CFG1,W
movwf PWM_WORK_CNT1
movf PWM_WORK_CFG2,W
movwf PWM_WORK_CNT2
goto ISR_EXIT
ISR_PWM1
decfsz PWM_WORK_CNT1,F ;
goto ISR_PWM2
bcf PORT_OUT,PIN_PWM1 ;
ISR_PWM2
decfsz PWM_WORK_CNT2,F ;
goto ISR_EXIT
bcf PORT_OUT,PIN_PWM2 ;
ISR_EXIT
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;**********************************************************************
;**********************************************************************
InitPWM
bsf STATUS,RP0 ;
bcf PORT_OUT,PIN_PWM1
bcf PORT_OUT,PIN_PWM2
bcf STATUS,RP0
bsf PORT_OUT,PIN_PWM1 ;
bsf PORT_OUT,PIN_PWM2
movlw FULL_WORK ;
movwf PWM_FULL
movlw DEF_WORK1
movwf PWM_WORK_CFG1
movwf PWM_WORK_CNT1
movlw DEF_WORK2
movwf PWM_WORK_CFG2
movwf PWM_WORK_CNT2
retlw 0
;**********************************************************************
;******************
InitTimer
bsf STATUS,RP0
bsf OPTION_REG,T0CS ;
bsf OPTION_REG,PSA ;
bsf INTCON,GIE ;
bcf INTCON,T0IF ;
bcf STATUS,RP0
retlw 0
;**********************************************************************
;******************
;**********************************************************************
StartTimer
bsf STATUS,RP0
bcf OPTION_REG,T0CS ;
bsf INTCON,T0IE ;
bcf STATUS,RP0
retlw 0
;**********************************************************************
*****************************************************************
StopTimer
bsf STATUS,RP0
bsf OPTION_REG,T0CS ;
bcf INTCON,T0IE ;
bcf STATUS,RP0
retlw 0
;**********************************************************************
;****************************************************************************************
main
bcf STATUS,RP0 ; select Page 0 for Port Access
call InitPWM
call InitTimer
call StartTimer
goto $
;**********************************************************************
END ; directive 'end of program'

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top