Arduino due. Тактовая частота.

uralev
Offline
Зарегистрирован: 28.12.2015

Вопрос такой, как можно узнать тактовую частоту работы процессо в arduino due. 

Делал простой код:

void setup() {

  pinMode(13, OUTPUT);
}


void loop() {
  digitalWrite(13, HIGH); 
  digitalWrite(13, LOW); 
}

Ожидал на выходе получить десятки Мегагерц, а получил несколько десятков килогерц.

И немогу понять в чём дело, почему такая низкая производительность, или частота процессора не 84 Мгц, или её нужно вручную задавать.

Может есть коммады для определения текущей частоты, помогите разобраться, всем заранее спасибо!

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

А почитать что нибудь? Например, здесь:

http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html

uralev
Offline
Зарегистрирован: 28.12.2015

А для due не подходит. Пробовал.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

uralev пишет:

А для due не подходит.

Потому что там совсем другой микроконтрллер стоит, 32-битный ARM Cortex-M3 (Atmel SAM3X8E)

uralev
Offline
Зарегистрирован: 28.12.2015

Тогда можете пример дать как напрямую его портами управлять?

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

Я ссылку давал чтобы поняли почему с digitalWrite так медленно работает. Применять те же методы работы с портами что там предлагаются для due не пройдет т.к. AVR и ARM отличаются архитектурой. В due удобнее работать с портами через регистры.

Для чтения из порта используется "pin data status register". Синтаксис такой:

input_data = REG_PIOx_PDSR;

Где x это порты A,B,C,D.

Для записи в порт надо сначала ее разрешить записав 1 в соответствующие разряды "output write enable register".

PIOx_OWER = pin_mask;

Где x это порты A,B,C,D.

Сама запись производится в "Output Data Status Register":

REG_PIOx_ODSR = data_to_set;

Где x это опять же порты A,B,C,D.

После того как необходимость записи в разряды порта отпадет надо ее запретить записью маски в "Output Write Disable Register":

PIOx_OWDR = pin_mask;

Это схематично, для понимания отличия работы с портами от того что найдете в скетчах для AVR. Кое что можно найти в файле sam_gpio.h по работе с портами.

uralev
Offline
Зарегистрирован: 28.12.2015

Спасибо тебе добрый человек!!! Как раз изучая исходники нашёл это и ещё другие варианты. Испробую пока все, меня интересует максималная производительность, по оcциллографу смотрю. Но по ходу дела выясняется ещё что цикл Loop() тоже не подходит, добавил свой while (1) ....

Вот что проверяю:

PIOB->PIO_SODR=1<<27; //вкл
PIOB->PIO_CODR=1<<27; //выкл

И

REG_PIOB_SODR = 0x1 << 27;

Хочу сравнить все варианты по скорости, и ещё с написанием кода на ASM. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

uralev пишет:

Но по ходу дела выясняется ещё что цикл Loop() тоже не подходит, добавил свой while (1) ....

Тогда уж и Arduino IDE выкинуть. И использовать нормальную IDE от производителя микроконтроллеров - Atmel Studio 7. Писать на чистом Си, без всяких ардуиновских Wiring. Плюс ассемблерные вставки можно делать.

uralev
Offline
Зарегистрирован: 28.12.2015

Jeka_M пишет:

uralev пишет:

Но по ходу дела выясняется ещё что цикл Loop() тоже не подходит, добавил свой while (1) ....

Тогда уж и Arduino IDE выкинуть. И использовать нормальную IDE от производителя микроконтроллеров - Atmel Studio 7. Писать на чистом Си, без всяких ардуиновских Wiring. Плюс ассемблерные вставки можно делать.

Может ты и прав, микрочиповские pic я именно так и программировал. Но решил попробовать arduino. Честно говоря уже пожалел, всётаки это слижком уж начальный уровень.