搜索
bottom↓
回复: 2

汇编中断程序遇到问题,请教马老师

[复制链接]

出0入0汤圆

发表于 2011-9-27 21:29:01 | 显示全部楼层 |阅读模式
开始学下汇编,这是一个MEGA32 Timer2异步时钟中断测试程序在中断里翻转PORTD~0,1,
异步时钟频率:32.768K。
AVR Studio 4.18
现在程序可以正常跑,但初始化似乎出现未知情况,上电后要等待两到三秒(感觉)才开始正常执行。劳您指教。
.CSEG

.include "m32def.inc"   

.org 0x0000            

     rjmp RESET         
         
.org 0x008

         rjmp Timer

.org 0x0030

Timer:

        ldi r17,0x01

        sub r27,r17

        cpi r27,0x00

        brne GO_back

        ldi r27,0x1f

        in r16, PORTD

        swap  r16

    out PORTD, r16

GO_back:

        reti


.org 0x0039

RESET:

    ldi        r28,0x5f

    ldi        r29,0x1f

    out        SPL,r28

    out        SPH,r29

        ldi r27,0x08
                         
    ldi r16, 0xff

    out DDRD, r16

    ldi r16, 0xde

    out PORTD, r16
         
    ldi r16, 0x00

    out TIMSK, r16                  
         
    ldi r16, 0x08

        in r17, ASSR

        or  r16,r17

    out ASSR, r16

    ldi r16, 0x00

    out TCNT2, r16
         
    ldi r16, 0x00

    out OCR2, r16
                 
    ldi r16, 0x0f

    out TCCR2, r16
       
Status:

        in  r16,ASSR

        cpi r16,0x08

        brne Status

    ldi r16, 0xc0

        in r17, TIFR

        or  r16,r17

    out TIFR, r16

    ldi r16, 0x80

    out TIMSK, r16

    sei

Loop:

    rjmp Loop

出0入0汤圆

发表于 2011-9-28 23:43:10 | 显示全部楼层
如果汇编再没有注释的话,别人就根本不想看了,请先把必要注释加上。

出0入0汤圆

 楼主| 发表于 2011-9-29 15:55:23 | 显示全部楼层
呵呵,谢谢马老师,目前正努力改善自己的注释习惯,要不时间长了,自己都不清楚。

目前问题得到解决,问题在我把TCNT2和OCR2写入0,而错过了首次比较必须等计数溢出一次才会正常,而此时异步时钟频率较低,
所以我在上电后要等待(等待计数溢出),大概掐了下表,远不止2-3秒。目前将TCNT2初始化为255,问题得以解决。

继续加上注释:
.CSEG

.include "m32def.inc"   

.org 0x0000            

    rjmp RESET         
         
.org 0x008

    rjmp Timer

.org 0x0030

Timer:

    ldi r17,0x01

    sub r27,r17         ;计数值减一

    cpi r27,0x00        ;计数值为0则LED状态交换

    brne GO_back        ;否则直接返回

    ldi r27,0x1f

    in r16, PORTD

    swap  r16

    out PORTD, r16

GO_back:

    reti


.org 0x0039

RESET:

    ldi        r28,0x5f        ;堆栈初始化

    ldi        r29,0x1f        ;

    out        SPL,r28         ;

    out        SPH,r29         ;

    ldi r27,0x08        ;R27作为中断计数值,装入8,大约每秒否则LED4次
                         
    ldi r16, 0xff       ;简单设置PORTD口全为输出

    out DDRD, r16

    ldi r16, 0xde       ;初始化PORTD为0xde,可通过swap指令实现PORTD~0、1的轮流翻转点亮。

    out PORTD, r16
         
    ldi r16, 0x00       ;按要求初始化TIMER2

    out TIMSK, r16              ;TIMSK写入0,清零 OCIE2 和 TOIE2 ,         
         
    ldi r16, 0x08

    in r17, ASSR        ;置位AS2选择异步时钟,//ASSR|=0X08

    or  r16,r17

    out ASSR, r16

    ldi r16, 0x00       ;TCNT2、 OCR2 、TCCR2 写入数据

    out TCNT2, r16
         
    ldi r16, 0x00

    out OCR2, r16
                 
    ldi r16, 0x0f       ;CTC模式,1024分频

    out TCCR2, r16
       
Status:                 ;等待 TCN2UB、 OCR2UB 和 TCR2UB 为0

    in  r16,ASSR

    cpi r16,0x08

    brne Status

    ldi r16, 0xc0       ;清除中断标志//TIFR|=0XC0

    in r17, TIFR

    or  r16,r17

    out TIFR, r16

    ldi r16, 0x80       ;使能比较匹配中断

    out TIMSK, r16

    sei                 ;使能全局中断

Loop:

    rjmp Loop


(原文件名:1.JPG)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 02:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表