Управление регистрами PORT и DDR на arduino due

scukin
Offline
Зарегистрирован: 26.01.2014

Написал скетч.

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

 

scukin
Offline
Зарегистрирован: 26.01.2014

Попробовал выполнить компилирование на arduino 1.0.5-r2 - Компилирование выполнено!..

kentik
Offline
Зарегистрирован: 28.03.2013

а в каком arduino ide не компилировался этот код?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Специально запустил ArduinoIDE 1.0.5 r2 и не нашел в ней Arduino Due, потому говорить, что в 1.0.5 скомпилировалось - некорректно. Может оно и скомпилировалось, но для другого МК

 

scukin
Offline
Зарегистрирован: 26.01.2014

В общем так.
Выяснил что не компилируется в версии 1.5.5 при переходе в режим Arduino Due.

Видимо в ARM обращение регистрами происходит другими командами. Пока нашел некоторые комманды типа:

REG_PIOD_OWER

REG_PIOD_PDSR

REG_PIOD_ODSR

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Разумеется, в 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-битная система