历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2018年03月12日 | PIC16F84产生两组PWM输出的实例源程序

2018-03-12 来源:eefocus

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

;**********************************************************************
 list      p=16F84            ; list directive to define processor
 #i nclude         ; 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'

推荐阅读

史海拾趣

问答坊 | AI 解惑

汽车内串行通信总线

越来越多的电子系统都需要更可靠的互连解决方案,  而LIN总线正成为汽车串行通信的新兴标准。 对于汽车制造商来说,非常重要的三大问题就是燃料效率、可靠性和成本。随着汽车设计中电子系统越来越多,问题也变得越来越复杂。这些子系统每个都 ...…

查看全部问答>

龙芯,为你祝福

从2004年问世到2008年,龙芯走的很艰难。 不但要面对Intel 和AMD的强大优势,而且还要面对国内各种质疑。 作为国内有真正自主知识产权的一颗中国芯,从出生到成长,历经艰辛。 龙芯组有很多超强的人,许多人都要身兼数职。。。。前端,后端,验证, ...…

查看全部问答>

矩阵键盘线反转法 无法实现松手检测

#include #define UCHAR unsigned char #define UINT unsigned int void main() {     UCHAR keyScan();         while(1)     {         keyScan();     } } ...…

查看全部问答>

4MBytes的内存设计

学计算机组织结构性能设计那本英文教材 教授出了个内存设计图 翻译过来大概如下 用 128K x 8SRAM   1Mb x 1DRAM   256KB x 4DRAM (三个都要用到,多次用到不限制) 设计出 4MBbytes的主内存. 要求画出图; 可 ...…

查看全部问答>

朗科U盘变成OTi的U盘了

我在使用一些U盘量产工具时,不知道怎么搞的,朗科U盘变成OTi的U盘了.现在无论在哪台电脑上,插上U盘后就变成了OTi设备了. 请教? …

查看全部问答>

passthru中获取MAC及其设置另一网卡MAC的问题?

双网卡冗余容错,同IP,同MAC地址,一个工作,另一个热备份。当需要切换时,passthru获取一块网卡的MAC地址保存到 CHAR * ADAPTER->MACADDRESS  成员变量,把其设置到另一个网卡的 ADAPTER->MACADDRESS  中,具体代码怎么实现 ...…

查看全部问答>

温度1602

用1602显示温度,可以显示到小数位。…

查看全部问答>

改善多路输出电源负载交错性能

多路输出电源普遍采用针对一路输出进行闭环的PWM控制方式,而其他的辅助输出采用间接稳压方式。由于只对主输出进行闭环控制,占空比的改变对辅助输出的负载影响较大,尤其是从轻载到满载变化时,交叉调节的性能变差(通常>5%)。如果对未闭环的辅 ...…

查看全部问答>

一种新型433M无线传感自组网--spidermesh

    Spidermesh 是一个无线自组网系统,一个低功耗、小功率(无线发射功率10毫瓦)、短距离(节点间30-70m)、短数据(小于50字节)无线传感网络系统。它的无线工作频段首选433MHz,所有无线设备都工作在同频半双工、双向数据传输的 ...…

查看全部问答>

欢迎网友music_586成为【TI模拟技术体验】版主!

期待music_586的加入,【TI模拟技术体验】讨论气氛会越来越好! 其中这个帖子:可调稳压器LM317你应该知道的10个知识点,就是咱们的新版主music_586的原创。 …

查看全部问答>