Я создаю приложение Arduino на C с Eclipse и плагином Arduino. В моем старом коде я использовал pinMode и digitalWrite. Но, как вы все знаете, это занимает больше места. Теперь я перестраиваю свой код с помощью манипуляций с портами. Если вы не знаете, что это такое, вы можете увидеть это здесь: http://www.arduino.cc/en/Reference/PortManipulation
Я объясню, что я сделал.
Там, где стоит pinMode, я изменил его примерно так: DDRD = 0b11111111;
И там, где стоит digitalWrite, я изменил его на PORTD = 0b10000000;
Вы можете увидеть это в моем коде ниже.
Eclipse теперь выдает мне ошибку (выделяя слова DDRD и PORTD красной линией) символа, не разрешенного для DDRD и PORTD, но программа собирается и работает нормально. Как мне это решить?
#include <avr/io.h>
#include <util/delay.h>
int main()
{
UCSR0B = 0; // disconnect pins 0 and 1 from USART (Serial)
DDRD = 0b11111111; // all pins of port D as output
for(;;)
{
PORTD = 0b10000000; // Pin 7 on
_delay_ms(500); // Wait
}
}
Это многоуровневые макросы, которые кодируют прямой изменчивый доступ к местоположениям SFR.
Они индивидуально определены в одном из ассортимента заголовочных файлов для микросхем, которые будут включены в avr / io.h, когда будут проинформированы о конкретном варианте процессора, который вы используете.
Обычно это делается с -mmcu
например, флаг для avr-gcc
-mmcu=atmega328p
Однако, если плагин Eclipse самостоятельно проходит по источникам проекта, пытаясь выдать вам консультативные ошибки, он может оказаться недостаточно умен, чтобы превратить это в определение (вы можете получить Eclipse, утверждающий ошибки, даже когда gcc доволен). Чтобы обойти это, вам может понадобиться явно определить тип процессора над включением в вашем коде или в некоторой конфигурации для Eclipse. Например:
#ifndef __AVR_ATmega328P__
#define __AVR_ATmega328P__
#endif
#include <avr/io.h>
Обратите внимание, что это может вызвать проблемы, если вы позже измените тип процессора! И даже как есть, это немного сомнительно, поскольку есть два потенциальных имени для каждого процессора.
Других решений пока нет …