打印

菜鸟请教个问题

[复制链接]
2256|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ButIAlwaysTry|  楼主 | 2012-9-10 15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ButIAlwaysTry 于 2012-9-10 21:31 编辑

刚学单片,用PIC12F675编一个方波信号,高电平1ms,低电平19ms,就是频率为50Hz。要用中断来实现,我写了一个程序,但是走到电平取反那里就,失效了,电平完全不会取反。求大神帮忙解答。
程序如下:
LIST P=PIC12F675,N=8
__CONFIG 044H  ;B'00000000000001';LOWEST BANDGAP VOLTAGE & UNIMPLEMENTED&DATA MEMORY CODE PROTECTION
      ;IS ENABLED&PROGRAM MEMORY CODE PROTECTION IS ENABLED&BOD DISABLED &MCLR INTERNALLY
      ;TIED TO VDD&PWRT ENABLED& EDT DISABLED
      ;INTOSC OSCILLATOR
INCLUDE"P12F675.INC"
W_TEMP EQU 5EH ;定义W的临时寄存器
STATUS_TEMP EQU 5DH ;定义STATUS的临时寄存器
ORG 00H;程序起始地址,复位向量
GOTO MAIN;跳转代码区
ORG 04H;中断向量入口
INT   
    MOVWF  W_TEMP
    SWAPF  STATUS,W
    BCF  STATUS,RP0
    MOVWF  STATUS_TEMP;现场保护
    BTFSC PIR1,0
    CALL INT_TMR1
    SWAPF  STATUS_TEMP;恢复现场
    MOVWF  STATUS
    SWAPF  W_TEMP,F
    SWAPF  W_TEMP,W
    RETFIE
INT_TMR1
    BCF   PIR1,0  ;清TMR1状态标志位
    BCF   STATUS,5;设置文件寄存器储存体0
    MOVLW 0x01
    XORWF GPIO,1 ;GP0电平取反
    MOVLW  0xFC
    MOVWF  TMR1H
    MOVLW  0x17
    MOVWF  TMR1L  ;装入1MS初值
    BTFSS GPIO,0
    CALL DDP
    RETURN
DDP
    MOVLW  0xB5
    MOVWF  TMR1H
    MOVLW  0xC7
    MOVWF  TMR1L  ;装入19MS初值
    RETURN
MAIN  
    BCF   STATUS,5;设置文件寄存器储存体0
    CLRF GPIO
    BSF  STATUS,5;设置文件寄存器储存体1
    MOVLW B'111110'
    MOVWF TRISIO ;设引脚GP0为输出
    BCF   STATUS,5;设置文件寄存器储存体0
    MOVLW  B'00000001'
    MOVWF  T1CON  
    BSF   STATUS,5;设置文件寄存器储存体1
    MOVLW  B'00000001'
    MOVWF  PIE1  
    MOVLW  B'11000000'
    MOVWF  INTCON  ;使能INTCON中所有未屏蔽中断和外设中断
    BCF   STATUS,5;设置文件寄存器储存体0
    BsF  GPIO,0 ;设GP0为低电平
    MOVLW  0xFC
    MOVWF  TMR1H
    MOVLW  0x17
    MOVWF  TMR1L  ;装入1MS初值
WAIT GOTO WAIT ;等待中断
  END
沙发
兰天白云| | 2012-9-10 16:13 | 只看该作者
先在RAM里取反,然后用MOVWF送到IO口

使用特权

评论回复
板凳
yewuyi| | 2012-9-10 17:38 | 只看该作者
防止IO口的读、修改、写现象

使用特权

评论回复
地板
ButIAlwaysTry|  楼主 | 2012-9-10 21:32 | 只看该作者
3# yewuyi
具体怎么操作呢?(对于程序的修改)
初学者,多问点,不好意思。

使用特权

评论回复
5
yewuyi| | 2012-9-11 08:38 | 只看该作者
朋友 ,没有人愿意给你一行行看那个汇编代码的,只能告诉你基本的思路:
1、开一个定时中断,例如100us中断一次,中断计数到10次后即为1ms,此时输出低电平,清除计数器后继续中断计数到190次时,切换输出到高电平,如此轮回。
这个方式脉冲输出的精度与代码和中断响应时间有一定关系,如果精度要求不特别高,具备基本的写代码能力,则可以使用。
2、使用硬件PWM,PWM的频率置为50HZ,占空比设置为5%即可。
3、我没去查你用的这个MCU有没有硬件PWM,如果有的话,优先选择使用PWM输出这个脉冲,这样MCU的负担很轻。

使用特权

评论回复
6
XIEYUANBIN| | 2012-9-11 11:46 | 只看该作者
读、修改、写,这个数据手册里有详细介绍,你自己看看。
貌似675有PWM,可以用这个,完全不用软件这么忙活

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝