2015-05-29 2 views
0

При компиляции следующего кода:АРН-НКА atmega164 ошибка порта необъявленной

#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 

error: DDRC undeclared (first use in this function)

DDRC=255;

^

error: PORTC undeclared (first use in this function)

PORTC=255;

^

Это даже отлично сно не atmega164pa

+0

Выглядит просто как Avr-Libc выпуска (в моей копии, m164pa отличается от других 164s , но объявляет эти порты). Убедитесь, что ваша версия обновлена, и если она все еще не работает, сообщите об ошибке на http://www.nongnu.org/avr-libc/ - или просто используйте рабочие заголовки, Atmel даже не перечисляет разницу между A и ПА. –

ответ

0

Эта проблема кажется из-за того, что внутри файла 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 

Излучаемое предупреждение означает, что вы что, вероятно, не будет ни одной библиотеки для указанной цели (и «к счастью» для моей отладки цели указует также конец секции интереса).

Если вы пытаетесь скомпилировать SW без управления PORTC и DDRC (комментируя их использование), вы должны иметь результат, как этот:

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 файл в среде компоновщика. (И это еще одна проблема!)

Я использовал: АРН-GCC (GCC) 4.8.2