历史上的今天
今天是:2024年10月21日(星期一)
2019年10月21日 | PIC16F84单片机产生两组PWM输出实例
2019-10-21 来源:eefocus
;**********************************************************************
; *
; 檔案名稱: PWM-C.asm *
;**********************************************************************
; *
; 其它檔案: 無 *
;**********************************************************************
; *
; 說明: *
; 這個範例程式會產生兩個簡單的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 __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 ; directive 'end of program'
史海拾趣
|
请问数字增益与模拟增益的区别,谢谢!!!!在手机系统里,如speaker这一路,为了增大音量,可以调节其数字增益及模拟增益以达到目的!!!那么,请问请问数字增益与模拟增益的区别,谢谢!!!请问增大音量且又要减小噪声,调模拟增益好还是数字增益好,请 ...… 查看全部问答> |
|
74系列数数字电路 7400、74H00、74L00、74LS00、74S00、74HC00、74C00、74F00、74ALS00四2输入与非门 Y=\\AB。 7401、74LS01、74HC01、74ALS01四2输入与非门(OC) Y=\\AB。 7402、74L02、74LS02、74S02、74HC02、74C02、74ALS02、74F02四2输 ...… 查看全部问答> |
|
[求助]怎样把56MHZ的正弦信号(中心点0电平)转化成TTL或CMOS电平? 请教高手:[求助]怎样把56MHZ的正弦信号(中心点0电平)转化成TTL或CMOS电平? 我想用FPGA对56MHZ的正弦信号(中心点0电平)进行计数.该正弦信号中心点是0电平,峰峰值不接高频电缆时用示波器测的是5V,经过电缆后测的是3V.由于FPGA无法识别负电平 ...… 查看全部问答> |
|
以下两个电路,前者有缺陷,输出端口电压不稳。后者改进,问题解决。 现在需要该电路的分析(图一的缺陷原因,图二的改进根据等等), 麻烦各位过路的大虾指点一二,小弟感激不尽… 查看全部问答> |
|
如题,我现在用的是模拟器,使用了xml解析器(msxml3)单步发现调用函数CoCreateInstance失败,提示没有注册类别,我判断是没有安装msxml3造成的,从msdn上下载了msxml3.msi,但无法安装,请问该怎样安装呢,需要手动改注册表吗(我的是wince5.0,模 ...… 查看全部问答> |
|
我用f449晶振32768,用如下程序把主时钟提高到了4M void init_mcu_clk(void) { // fMCLK = D*SCFQCTL*fXTA1 = 2*128*32,768 = 8,388,608 Hz主时钟 SCFI0 |= FN_4; SCFQCTL = SCFQ_4M; FLL_CTL0 = DCOPLUS + XCAP18PF; } 现在苦于把主时钟 ...… 查看全部问答> |




