打印
[AVR单片机]

AVR IO口测试错误(第一次用GCC)?!谢谢

[复制链接]
2071|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cuittao|  楼主 | 2008-5-22 14:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GCC, IO, AVR, TI, AI
说明:器件为Atmega162 Fre=7.3728MHz
程序目的:测试PORTD4,PORTD5 IO口的LED灯是否正确闪烁,LED灯外接上接电阻。
编译环境:WinAVR-20071221
烧录环境:Pony2000 v2.6f ISP烧录

提示:不存在硬件及熔丝问题,因为用ICC AVR写的应用程序是完全正确的。
(烦啊,ICCAVR没有注册码,是急着转用GCC!)

程序代码如下:
#include <avr/io.h> 
void Main_DealyTime(unsigned int iTmpDlyTime)    //延时
{
    
    for(;iTmpDlyTime>0;iTmpDlyTime--);
}

void Main_InitPort(void)
{
     PORTA = 0x00;
     DDRA     = 0xF0;        //
     PORTB = 0x00;
     DDRB     = 0x00;        //
     PORTC = 0x00;        //
     DDRC     = 0x60;        //
     PORTD = 0xf8;
     DDRD     = 0xf8;        //PORTD 就五位,设置为输出    
     PORTE = 0x00;
     DDRE     = 0x00;        //
}

int main(void)
{
    Main_InitPort();
    
    while(1)
    {        
        Main_DealyTime(5000);
        Main_DealyTime(5000);
        PORTD |= 0x030;        //置1
        Main_DealyTime(5000);
        Main_DealyTime(5000);
        PORTD &= ~0x030;    //取反
    }    
        
    return 0;
}


问题:
1、当前程序代码是否有误?或者设置不合理的地方?
2、当前的程序是否从main处开始执行?不是的话如何更改?
3、在HEX文件内,箭头向上的代码是如何产生的?

谢谢!

测试结果:D4,D5 IO口LED没有任何闪动。
Hex代码如下图所示:

https://bbs.21ic.com/upfiles/img/20077/200777141929224.jpg

相关帖子

沙发
cuittao|  楼主 | 2008-5-22 14:06 | 只看该作者

PN Output图

使用特权

评论回复
板凳
coldra| | 2008-5-22 14:20 | 只看该作者

程序没发现错误

是不是单片机没跑起来?还是考虑硬件上的问题,或熔丝位晶振设置有关。
上电后初始化后IO电平对吗?

使用特权

评论回复
地板
cuittao|  楼主 | 2008-5-22 15:14 | 只看该作者

用ICCAVR 写的程序完全正常运行!

  

使用特权

评论回复
5
cuittao|  楼主 | 2008-5-22 16:42 | 只看该作者

可能是优化造成的!

 把  optimization level 改为0后即正常,其它的都不对!
 代码量大了1%!晕呀~~~
 

使用特权

评论回复
6
ATmega32L| | 2008-5-22 16:44 | 只看该作者

延时错误

1、当前程序代码是否有误?或者设置不合理的地方?

延时程序错误.
编译器认为里面的循环是无效代码,直接kill掉.
达不到楼主想要的延时效果

void Main_DealyTime(unsigned int iTmpDlyTime)    //延时
{
    
    for(;iTmpDlyTime>0;iTmpDlyTime--);//空循环,视为无效代码
}
GCC编译出来的汇编:
000000ae <Main_DealyTime>:
  ae:    08 95           ret


应该:
void Main_DealyTime(volatile unsigned int iTmpDlyTime)
{
    for(;iTmpDlyTime>0;iTmpDlyTime--);
   //必须用volatile
}

建议延时用编译器自带的延时函数,在avr/delay.h.

3、在HEX文件内,箭头向上的代码是如何产生的?
这是中断向量,没有使用的中断跳转到默认的__bad_interrupt

00000000 <__vectors>:
   0:    0c 94 38 00     jmp    0x70    ; 0x70 <__ctors_end>
   4:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
   8:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
   c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  10:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  14:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  18:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  1c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  20:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  24:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  28:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  2c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  30:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  34:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  38:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  3c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  40:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  44:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  48:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  4c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  50:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  54:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  58:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  5c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  60:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  64:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  68:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>
  6c:    0c 94 55 00     jmp    0xaa    ; 0xaa <__bad_interrupt>

使用特权

评论回复
7
cuittao|  楼主 | 2008-5-22 17:13 | 只看该作者

ok! Thanks you very much!

  OK!明白,非常感谢!

使用特权

评论回复
8
athlon64fx| | 2008-5-22 22:28 | 只看该作者

用自带的延时函数就可以了

#include <util/delay.h>


_delay_ms(uint32_t)

使用特权

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

本版积分规则

21

主题

65

帖子

1

粉丝