PIC16F84单片机产生两组PWM输出实例
;**********************************************************************; *
; 郎嘿: PWM-C.asm *
; ら戳: 06/14/2001 *
; 郎セ: 1.00 *
; *
; 砞璸: 朝﹙ *
; そ嘿: *
; *
; *
;**********************************************************************
; *
; ㄤウ郎: 礚 *
; *
; *
; *
;**********************************************************************
; *
; 弧: *
; 硂絛ㄒ祘Α穦玻ネㄢ虏虫PWM猧块 *
; 砞﹚既竟'PWM_WORK_CFG1' ㎝ 'PWM_WORK_CFG2' *
; 盢穦э跑PIN_PWM1㎝PIN_PWM2㏄戳 *
; 叫猔種,'PWM_WORK_CFG1'㎝'PWM_WORK_CFG2'㎝'PWM_FULL' *
; 既竟砞﹚惠ざ1-255ぇ丁. *
; PWM1块竲PORTB.0 PWM2块竲PORTB.1 *
;**********************************************************************
list p=16F84 ; list directive to define processor
#include <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 ; PWM1㏄戳箇砞
DEF_WORK2 = 8 ; PWM2㏄戳箇砞
PORT_OUT = PORTB ; PWM块梆
PIN_PWM1 = 0 ; PWM1块竲
PIN_PWM2 = 1 ; PWM2块竲
;********************** VARIABLE DEFINITIONS***************************
CBLOCK 0x0C
w_temp ; variable used for context saving
status_temp ; variable used for context saving
PWM_FULL ; 程㏄戳璸计竟(计)
PWM_WORK_CFG1 ; PWM1 ㏄戳砞﹚既竟
PWM_WORK_CFG2 ; PWM2 ㏄戳砞﹚既竟
PWM_WORK_CNT1 ; PWM1 ㏄戳璸计竟(计)
PWM_WORK_CNT2 ; PWM2 ㏄戳璸计竟(计)
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 ; PWM1/PWM2確High筿
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 ; 浪琩PWM1㏄戳
goto ISR_PWM2
bcf PORT_OUT,PIN_PWM1 ; ㏄戳挡盢块砞Low筿
ISR_PWM2
decfsz PWM_WORK_CNT2,F ; 浪琩PWM2㏄戳
goto ISR_EXIT
bcf PORT_OUT,PIN_PWM2 ; ㏄戳挡盢块砞Low筿
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
;**********************************************************************
;****************** ﹍てPWM *******************************
;**********************************************************************
InitPWM
bsf STATUS,RP0 ; 砞﹚PWM1/PWM2竲块
bcf PORT_OUT,PIN_PWM1
bcf PORT_OUT,PIN_PWM2
bcf STATUS,RP0
bsf PORT_OUT,PIN_PWM1 ; 箇砞PWM1/PWM2块蔼筿
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 ; 砞﹚历竟猧块(1/4 osc)
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
页:
[1]