avr-gcc atmega164pa 错误端口未声明

Posted

技术标签:

【中文标题】avr-gcc atmega164pa 错误端口未声明【英文标题】:avr-gcc atmega164pa error port undeclared 【发布时间】:2015-05-29 09:23:58 【问题描述】:

编译以下代码时:

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void) 

 DDRC = 255;

 while(1)

 PORTC=255;
 _delay_ms(200);

 PORTC=0;
 _delay_ms(200);
 

 return 0;

ATMega16 没问题:

avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega16 -c -o main.o main.c

但是,对于 ATMega164PA,我收到以下错误:

avr-gcc -w -Os -DF_CPU=1000000UL -mmcu=atmega164pa -c -o main.o main.c

错误:DDRC 未声明(在此函数中首次使用)

DDRC=255;

^

错误:PORTC 未声明(在此函数中首次使用)

PORTC=255;

^

atmega164p 甚至可以,但atmega164pa 不行

【问题讨论】:

看起来纯粹是一个 avr-libc 问题(在我的副本中,m164pa 与其他 164 不同,但确实声明了这些端口)。检查您的是否是最新的,如果仍然失败,请将错误报告给nongnu.org/avr-libc - 或者只使用工作标头,Atmel 甚至没有列出 A 和 PA 模型之间的区别。 【参考方案1】:

这个问题似乎是由于文件io.h 中没有包含 MCU 类型__AVR_ATmega164PA__ 的特定文件;只有:__AVR_ATmega164P____AVR_ATmega164A__。我认为 164PA 的代码必须编译为 164P。

这是文件io.h内的部分代码

#elif defined (__AVR_ATmega163__)
#  include <avr/iom163.h>
//------------------------------------------------------------ To note
#elif defined (__AVR_ATmega164P__) || defined (__AVR_ATmega164A__)
#  include <avr/iom164.h>
//--------------------------------------------------------------------
#elif defined (__AVR_ATmega165__) || defined (__AVR_ATmega165A__)
#  include <avr/iom165.h>

如果您看到编译器输出,您可能会注意到更多警告:

In file included from avr164.c:3:0:
--------------------------------------------> To note
    /usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
     #    warning "device type not defined"
          ^
To note <---------------------------------------------
avr164.c: In function ‘main’:
avr164.c:8:1: error: ‘DDRC’ undeclared (first use in this function)
 DDRC = 255;
 ^
avr164.c:8:1: note: each undeclared identifier is reported only once for each function it appears in
avr164.c:28:1: error: ‘PORTC’ undeclared (first use in this function)
 PORTC=255;
 ^

第一个警告:io.h:428:6: warning: #warning "device type not defined" 表示预处理器已将 io.h 文件解析到发出警告的行。

在文件io.h 的以下行中,您可能会看到发出警告的位置。

    #elif defined (__AVR_M3000__)
    #  include <avr/iom3000.h>
    #else // <<<---------------------- To note!
// To note -------------------------------
    #  if !defined(__COMPILING_AVR_LIBC__)
    #    warning "device type not defined"
    #  endif
// To note -------------------------------
    #endif

发出的警告表明您可能没有指定目标的库(并且“幸运地”出于我的调试目的也表明感兴趣部分的结束)。

如果您尝试在不管理PORTCDDRC(评论它们的使用)的情况下编译软件,您应该会得到如下结果:

In file included from avr164.c:3:0:
/usr/lib/avr/include/avr/io.h:428:6: warning: #warning "device type not defined" [-Wcpp]
 #    warning "device type not defined"
      ^
---------------------------> Note
    /usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: cannot find crtm164pa.o: No such file or directory
    collect2: error: ld returned 1 exit status
Note <---------------------------

结果表明链接器环境中没有 crtm164pa.o 文件。 (这是另一个问题!)

我用过:avr-gcc (GCC) 4.8.2

【讨论】:

以上是关于avr-gcc atmega164pa 错误端口未声明的主要内容,如果未能解决你的问题,请参考以下文章

Arduino使用所有端口ATMega2560

AVR--I/O端口寄存器

如何在 avr-gcc 中定义定时器

为啥 AVR-GCC 编译器在使用相同的变量但作为 PROGMEM 重载时会引发错误?

ATMEGA16L 上拉未激活

如何用 atmega 32 pwm 控制电机