历史上的今天
返回首页

历史上的今天

今天是: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          ; 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 ; directive 'end of program'


推荐阅读

史海拾趣

CMOS Sensor Inc公司的发展小趣事

随着技术的不断发展,CMOS Sensor Inc公司不断推出创新产品。其中,线型CMOS图像传感器的研发成功,为公司带来了重要的突破。这一产品具有更高的分辨率和更低的噪声,为工业质量保证、商业成像等领域提供了更优质的解决方案。此后,公司又不断对产品进行升级和优化,以满足不同客户的需求。

辰颐电子公司的发展小趣事

辰颐电子公司成立于XXXX年,由一群热衷于电子技术的年轻人共同创立。他们看到了电子行业巨大的市场潜力和技术革新的重要性,决定投身于这一领域。初创时期,公司面临着资金短缺、技术瓶颈和市场竞争等多重挑战。然而,他们凭借对技术的执着追求和对市场的敏锐洞察,成功研发出了一款具有创新性的电子产品,并迅速在市场上打开了局面。

Emulation Technology Inc公司的发展小趣事

作为一家在电子行业具有影响力的企业,Emulation始终关注社会责任和可持续发展。公司积极参与各种公益活动,为当地社区的发展做出了贡献。同时,Emulation还注重环保和节能,致力于推动绿色电子产品的设计和生产。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

博众电气(BZCN)公司的发展小趣事

随着国内市场的日益饱和,博众电气开始将目光投向国际市场。公司制定了国际化发展战略,积极参与国际竞争与合作。通过在国外设立分支机构、参加国际展会等方式,博众电气成功打开了国际市场的大门。如今,公司的产品已经远销海外多个国家和地区,国际市场份额逐年攀升。

B+B SmartWorx公司的发展小趣事

B+B SmartWorx始终坚持以客户为中心,通过提供优质的产品和服务来满足客户需求。公司相信,客户满意度和产品创新是驱动其增长的关键因素。因此,B+B SmartWorx在设计和制造网络连接设备时,始终注重设备的易用性、可管理性和可靠性。这种对客户的深度理解和持续创新,使得B+B SmartWorx在电子行业中赢得了良好的声誉,并实现了持续稳健的发展。

这些故事基于B+B SmartWorx的发展历程和现有信息,虚构了一些具体情节,旨在展现该公司在电子行业中的成长与变迁。请注意,这些故事可能并不完全准确反映B+B SmartWorx的实际发展情况,如需了解更多关于该公司的具体信息,建议查阅相关官方资料或新闻报道。

E-T-A Circuit Breakers公司的发展小趣事

E-T-A公司自1948年由Jakob Ellenberger和Harald A. Poensgen创立以来,一直由该家族掌管。尽管公司已经发展成为一个国际性的企业,但家族第二代和第三代领导人仍然保持着对公司的掌控和管理。他们秉承了家族的创业精神和价值观,坚持以客户为中心,以技术创新为驱动,不断推动公司向前发展。在家族传承的推动下,E-T-A公司得以保持其独特的企业文化和核心竞争力,在电子行业中持续领跑。

问答坊 | AI 解惑

请问数字增益与模拟增益的区别,谢谢!!!!

请问数字增益与模拟增益的区别,谢谢!!!!在手机系统里,如speaker这一路,为了增大音量,可以调节其数字增益及模拟增益以达到目的!!!那么,请问请问数字增益与模拟增益的区别,谢谢!!!请问增大音量且又要减小噪声,调模拟增益好还是数字增益好,请 ...…

查看全部问答>

74系列芯片元件介绍(转载)

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无法识别负电平 ...…

查看全部问答>

菜鸟求助:简单电路分析

以下两个电路,前者有缺陷,输出端口电压不稳。后者改进,问题解决。 现在需要该电路的分析(图一的缺陷原因,图二的改进根据等等), 麻烦各位过路的大虾指点一二,小弟感激不尽…

查看全部问答>

Irp转发的的问题

下面这段代码有两种可能: 1.IoCallDriver 立刻返回,因为底层驱动正忙,StartIO把IRP放进队列, 然后KeWaitForSingleObject 直到IRP完成,这个时候一切正常。 2.底层驱动空闲,那么IoCallDriver的时候,底层驱动的StartIO立刻完成IRP,但是Disp ...…

查看全部问答>

怎样在wince5或模拟器上安装msxml3.dll

如题,我现在用的是模拟器,使用了xml解析器(msxml3)单步发现调用函数CoCreateInstance失败,提示没有注册类别,我判断是没有安装msxml3造成的,从msdn上下载了msxml3.msi,但无法安装,请问该怎样安装呢,需要手动改注册表吗(我的是wince5.0,模 ...…

查看全部问答>

请教如何获得WLAN的信号强度??

请教各位如何获得WLAN的信号强度 我需要在应用程序中的用到这个 谢谢各位!…

查看全部问答>

关于JTAG调试接口

                                 版主,我准备用两片STM32,JTAG口是分别引出好还是接在一起好? 哪个更方便?调试时怎么设置?…

查看全部问答>

大家帮帮忙!!有个问题?

我用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; } 现在苦于把主时钟 ...…

查看全部问答>