Управление регистрами PORT и DDR на arduino due
- Войдите на сайт для отправки комментариев
Втр, 28/01/2014 - 13:58
Написал скетч.
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT);
DDRD = DDRD | B11111100;
}
void loop()
{
PORTD = B11111100;
PORTD = B00000000;
digitalWrite(ledPin,HIGH);
digitalWrite(ledPin,LOW);
}
После нажатия кнопки "Проверить", вылезает ошибка. Пробовал перед регистрами писать byte, но безуспешно(
Arduino: 1.5.5-r2 (Windows 8), Board: "Arduino Due (Programming Port)" sketch_jan28c.ino: In function 'void setup()': sketch_jan28c:5: error: 'DDRD' was not declared in this scope sketch_jan28c.ino: In function 'void loop()': sketch_jan28c:10: error: 'PORTD' was not declared in this scope
Попробовал выполнить компилирование на arduino 1.0.5-r2 - Компилирование выполнено!..
а в каком arduino ide не компилировался этот код?
Специально запустил ArduinoIDE 1.0.5 r2 и не нашел в ней Arduino Due, потому говорить, что в 1.0.5 скомпилировалось - некорректно. Может оно и скомпилировалось, но для другого МК
В общем так.
Выяснил что не компилируется в версии 1.5.5 при переходе в режим Arduino Due.
Видимо в ARM обращение регистрами происходит другими командами. Пока нашел некоторые комманды типа:
REG_PIOD_OWER
REG_PIOD_PDSR
REG_PIOD_ODSR
Разумеется, в Cortex-M3 абсолютно по другому обращение к портам, потому, пишите как обычно digitalWrite, а не используйте прямое обращение к портам, либо сначала почитайте, как правильно обращаться с портами.
Для примера посмотрите в каталоге файлы, например, wiring_digital.c в каталоге arduino-1.5.5-r2\hardware\arduino\sam\cores\arduino хотя бы. И сравните с аналогичной операцией в AVR - небо и земля
AVR:
void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *out; if (port == NOT_A_PIN) return; // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; } SREG = oldSREG; }DUE:
extern void digitalWrite( uint32_t ulPin, uint32_t ulVal ) { /* Handle */ if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) { return ; } if ( PIO_GetOutputDataStatus( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin ) == 0 ) { PIO_PullUp( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin, ulVal ) ; } else { PIO_SetOutput( g_APinDescription[ulPin].pPort, g_APinDescription[ulPin].ulPin, ulVal, 0, PIO_PULLUP ) ; } }И это не говоря уже о том, что AVR - 8 битный, а Due - 32-битная система