Дергай ногой в начале цикла, и на осциллографе посмотри.
Все зависит от числа выполняемых инструкций и количества тактов на конкретную инструкцию.
Дергай ногой в начале цикла, и на осциллографе посмотри.
Все зависит от числа выполняемых инструкций и количества тактов на конкретную инструкцию.
можно поставить AVR studio (она бесплатная), GCC и посмотреть буквально по тактам.
Но, я не знаю как Arduino проект открыть в AVR Studio, хотя Arduino использует при компиляции тот же самый GCC, что и AVR Studio.
Большинство команд AVR выполняется за 1 такт, но команды очень простые+восьмибитность. Поэтому чтение 8-битной переменной состоит из задания регистровой пары (2 операции)+чтение(эта команда исполняется 2 два такта).
Очень долго выполняются некоторые Arduino куски кода, поскольку заточены под максимальную универсальность. Точно знаю про очень долгое дергание ногами посредством команд arduino.
UPD: Скомпилил под AVR Studio простейший проект Arduino.
Для примера смотри, вот этот код
uint8_t volatile w,k;
k=0;
for (w=10;w<250;w++)
{
k++;
if (k==5 && ((PIND & (1<<PIN5)) != 0))
k--;
}
Цикл совершается за 20 тактов если не выполняется k-- и 26 если выполняется. Если убрать volatile и таким образом разрешить не располагать эти регистры в памяти (проц оперирует только регистрами), то цикл без захода в k-- выполняется 12 тактов.
Вот такой цикл (по сути даже проще верхнего)
uint8_t w,k;
k=0;
for (w=10;w<250;w++)
{
k++;
if ((digitalRead(5) != 0))
k--;
}
выполняется 78 тактов.
digitalWrite(5,HIGH) выполняется 72 такта
а при этом похожая команда
digitalWrite(13,HIGH) в которой отличается только номер выводв выполняется 57 тактов.
На обыкновенной ардуине стоит 16 МГц резонатор. Это означает, что за секунду выполняется 16 миллионов тактов.
UPD2:
Для сравнения быстродействия:
Ниже приведены команды, которые при понимании логики работы программы в 99% случаев делают одно и то же.
digitalWrite(5,HIGH); // 72 такта
DDRD |=(1<<PIN5); // 2 такта
Но тут надо заметить, что это крайний случай. Во многих случаях разница незначительная, либо ее вообще нет.
Можно все написать на Arduino и только пару строчек таких, как выше - прямых обращений к портам при необходимости.
Последний раз редактировалось SBorovkov; 05.03.2010 в 04:57.
че-то я тупею, что ли, к старости
не смог добавить внешние модули в скеч, MsTimer2.h и MsTimer2.с
не, вписать абсолютный путь, типа include "d:\arduino\include\MsTimer2.h" ума, конечно, хватило, только и в MsTimer2.cpp, пришлось тоже путь менять, как-то некрасиво.
бросить просто в папку скеча тоже не получилось
куда положено раскидывать сторонние библиотеки или как добавить путь для них?
в ...hardware\tools\avr\avr\include тоже как-то не очень, там все-таки стандартные хидеры лежат.
самое простое -- держать в папке скеча, а не цепляет. почему?
Последний раз редактировалось uzzzer; 07.03.2010 в 23:46.
Пытался при помощи приведенного мною выше кода отслеживать появление +5в. на Pin 2. Не получается не при каких значениях 3-го параметра функции attachInterrupt.
Испытывал при помощи проводка подключая попеременно его то к земле, то к 5в. Значение переменной pulse растет только когда к земле провод подключаю.
Класть в папку со всеми библиотеками \arduino-0018\libraries\MsTimer2
Можно и без библиотеки сделать прерывание по таймеру
PHP код:
volatile unsigned int tcnt2;
void setup()
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 1; // 16000000/64/f=tcnt2
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
}
void loop()
{
}
void MyInterupt()
{
//обработчик вашего прерывания
}
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
MyInterupt();
}
Последний раз редактировалось Chip; 08.03.2010 в 00:42.
а такие конструкци прокатывают?
....
attachInterrupt(0, MeasureSPD, RISING); //attaching intterrupt to pin D2
....
while (digitalRead(2)) i++;
я в сысле о том, можно ли привязать прерывание к ноге и потом считывать ее состояние?
Не понял смысла? Если назначили прерывание на ногу то зачем состояние проверять? Прерывание и так сработает по изменению состояния
да мне ж длительность имульса подсчитать. соответственно от старта и до упора.
или мож какой другой метод использовать, встроенный таймер там или еще что
Для подсчета можно использовать следующие функции
unsigned long millis()
unsigned long micros()
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)