打印
[AVR单片机]

主程序 循环体中的代码好像没有执行,哪里出问题了?

[复制链接]
1405|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wf.yang|  楼主 | 2016-9-8 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wf.yang 于 2016-9-8 11:28 编辑

老师好!

用 ATmega16A 做一个 PWM 波形发生器。定时计数器 T/C1 工作在模式 14(快速PWM)。在 PC 口接有拨码开关,在主程序中反复读取 PC 口(拨码开关的状态)读取数据存入 R16,同时 R17 赋值 $00。在输入捕获子中断程序中,把 R17、R16 的值送入OCR1B,以控制 OC1B 输出的脉冲宽度。

结果,OC1B 输出的脉冲宽度不随拨码开关变化。

如果把读取 PC 口的指令放到输入捕获中断服务程序,OC1B 输出的脉冲宽度就可以随着拨码开关变化。

好像,主程序中的循环体就没有被执行。为什么会出现这样的问题?


主程序中的循环体:

Loop:       NOP
               NOP
               NOP
               NOP

               LDI       R17,    $00;            R17 赋值  $00,作为OCR1B 高8位 数据                              
               IN        R16,    $13;             读取 PC 口,暂存于 R16,作为OCR1B 低8位 数据
               ANDI    R16,    $7F;             R16 最高位清零,使 R16 数据不大于 128

              NOP
              NOP
              NOP
              NOP

             JMP    Loop

相关帖子

沙发
wf.yang|  楼主 | 2016-9-8 18:25 | 只看该作者
没有人回答呀。

又发现规律了。在定时计数器1的 PWM 模式,只要打开与定时计数器 1 相关的任意一个中断,主程序循环体内的指令就执行不到。

即使,如果在循环体内先关闭这些中断,执行一系列指令之后,然后再打开这些中断,进行下一次循环。也只有第一次循环内的指令可以执行到,第二次循环就又执行不到了。也就是说,只要这些中断打开一次,即使再关掉,也不行。

非常困惑,循环体内的程序没有执行到,程序指针跑到哪里去了?

使用特权

评论回复
板凳
创隆电子| | 2016-9-8 18:47 | 只看该作者
不会没有退出中断吧

使用特权

评论回复
地板
wzh8158| | 2016-9-8 20:43 | 只看该作者
汇编,看的头都大了!

使用特权

评论回复
5
raymond| | 2016-9-8 20:54 | 只看该作者
中断程序看看,堆栈是不是用了R16,R17?

使用特权

评论回复
6
raymond| | 2016-9-8 20:56 | 只看该作者
还有就是中断地址写对了没有?

使用特权

评论回复
7
零下10度的冰| | 2016-9-8 22:19 | 只看该作者
设置一个地址变量,并且判断啊,判断完之后reset.

使用特权

评论回复
8
玄德| | 2016-9-8 23:56 | 只看该作者

1、你确认进入LOOP了?可能根本没进来过。
2、如果没猜错,$表示立即数,
     那么,上述程序根本没有读取C口的语句。
3、程序中同样没有改变IO口的语句。


使用特权

评论回复
9
NE5532| | 2016-9-9 09:03 | 只看该作者
你在主循环里拉高拉低口线看看呢。

使用特权

评论回复
10
416356084| | 2016-9-9 11:28 | 只看该作者
汇编看不懂的路过

使用特权

评论回复
11
wsnsyy| | 2016-9-9 14:03 | 只看该作者
$代表什么

使用特权

评论回复
12
wf.yang|  楼主 | 2016-9-10 20:07 | 只看该作者
raymond 发表于 2016-9-8 20:54
中断程序看看,堆栈是不是用了R16,R17?

好,谢谢!   我再看看。

使用特权

评论回复
13
wf.yang|  楼主 | 2016-9-10 20:08 | 只看该作者

16进制数呀

使用特权

评论回复
14
wf.yang|  楼主 | 2016-9-10 20:09 | 只看该作者
玄德 发表于 2016-9-8 23:56
1、你确认进入LOOP了?可能根本没进来过。
2、如果没猜错,$表示立即数,
     那么,上述程序根本没有读 ...

是呀,我就说怀疑没有进入到 LOOP。但,它去哪里了?

使用特权

评论回复
15
wf.yang|  楼主 | 2016-9-10 20:09 | 只看该作者
NE5532 发表于 2016-9-9 09:03
你在主循环里拉高拉低口线看看呢。

这是个办法,我看看

使用特权

评论回复
16
wf.yang|  楼主 | 2016-9-10 20:11 | 只看该作者
raymond 发表于 2016-9-8 20:56
还有就是中断地址写对了没有?

这个没问题,看过了。

使用特权

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

本版积分规则

34

主题

836

帖子

2

粉丝