打印
[AVR单片机]

有用IAR作ATMEGA16开发的同仁吗?

[复制链接]
3129|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dtmcp|  楼主 | 2008-10-23 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ATmega32L| | 2008-10-23 21:22 | 只看该作者

WU

https://bbs.21ic.com/upfiles/img/200712/200712821403890.jpg

使用特权

评论回复
板凳
dtmcp|  楼主 | 2008-10-23 21:28 | 只看该作者

可以直接在IAR下下载吗?

可以直接在IAR下下载吗?

使用特权

评论回复
地板
dudongdao| | 2008-10-24 17:25 | 只看该作者

M32我顶死你了~ 好厉害

使用特权

评论回复
5
yewuyi| | 2008-10-24 17:31 | 只看该作者

不能直接在IAR下载。。。

使用特权

评论回复
6
dudongdao| | 2008-10-24 18:04 | 只看该作者

MEGA32 有个问题请教一下~ 感觉就你能回答了~

      __nearfunc __version_3 __interrupt void time1()
                        time1:
      00000000   930A               ST      -Y, R16
      00000002   B70F               IN      R16, 0x3F
      00000004                      REQUIRE ?Register_R15_is_global_regvar
      00000004   9468               SET
      00000006   F8F0               BLD     R15, 0
      00000008                      REQUIRE ?Subroutine96
      00000008                      ;               // Fall through to label ?Subroutine96

                                    In segment CODE, align 2, keep-with-next
                        ?Subroutine96:
      00000000   BF0F               OUT     0x3F, R16
      00000002   9109               LD      R16, Y+
      00000004   9518               RETI

上面的函数就是 实现R15&=0X01;   我定义了一个变量到R15,放到中断中,
按道理生成的代码应该是
BLD     R15,0;
RETI;
不就行了吗,怎么还生成拉那么多垃圾代码,是不是哪里没有设置正确呢?
我是这样定义的   __regvar __no_init U8 m_u8SysIntFlag@15;
C程序是这样。
//#pragma optimize=none  
#pragma  vector = TIMER1_COMPA_vect
__interrupt void time1(void)
{
    m_u8SysIntFlag |= 0x01;
}

请MEGA32大侠给分析一下,谢谢M32。

使用特权

评论回复
7
yewuyi| | 2008-10-24 19:37 | 只看该作者

难道不需要中断的现场保护吗?

使用特权

评论回复
8
ATmega32L| | 2008-10-24 21:27 | 只看该作者

中断需要保护寄存器

        ST      -Y, R16
        IN      R16, 0x3F
        SET                                         
        BLD     R15, 0
        OUT     0x3F, R16
        LD      R16, Y+
        RETI

SET指令破坏了SREG的T位,中断使用SET指令前需要保护SREG寄存器。

另外,如果不想让编译器生成保护寄存器代码,可以在加上__raw

#pragma  vector = TIMER1_COMPA_vect
__raw __interrupt void time1(void)
{
}

还有一点要说明一下:
我只是一个单片机新手,搞单片机开发6个月,
dudongdao不要误会。

使用特权

评论回复
9
dudongdao| | 2008-10-25 02:38 | 只看该作者

啊~ 你真是牛人~

MEGA32,你以前是做啥的,不会不是搞电子的吧

使用特权

评论回复
10
dtmcp|  楼主 | 2008-10-25 08:00 | 只看该作者

谢谢,ATmega32L

IAR环境下的ATMEGA16软件已搞定,还是IAR比ICC好用的多

使用特权

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

本版积分规则

36

主题

194

帖子

1

粉丝