Страница 2 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 11 по 20 из 73

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Дергай ногой в начале цикла, и на осциллографе посмотри.
    Все зависит от числа выполняемых инструкций и количества тактов на конкретную инструкцию.

  2. #2
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

    По умолчанию Быстродействие Arduino

    можно поставить 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.

  3. #3
    Продвинутый
    Регистрация
    23.02.2009
    Сообщений
    352
    Вес репутации
    258

    По умолчанию Re: Прерывания в Arduino.

    че-то я тупею, что ли, к старости

    не смог добавить внешние модули в скеч, MsTimer2.h и MsTimer2.с

    не, вписать абсолютный путь, типа include "d:\arduino\include\MsTimer2.h" ума, конечно, хватило, только и в MsTimer2.cpp, пришлось тоже путь менять, как-то некрасиво.
    бросить просто в папку скеча тоже не получилось
    куда положено раскидывать сторонние библиотеки или как добавить путь для них?

    в ...hardware\tools\avr\avr\include тоже как-то не очень, там все-таки стандартные хидеры лежат.

    самое простое -- держать в папке скеча, а не цепляет. почему?
    Последний раз редактировалось uzzzer; 07.03.2010 в 23:46.

  4. #4
    Пользователь
    Регистрация
    05.03.2009
    Сообщений
    29
    Вес репутации
    193

    По умолчанию Re: Прерывания в Arduino.

    Пытался при помощи приведенного мною выше кода отслеживать появление +5в. на Pin 2. Не получается не при каких значениях 3-го параметра функции attachInterrupt.
    Испытывал при помощи проводка подключая попеременно его то к земле, то к 5в. Значение переменной pulse растет только когда к земле провод подключаю.

  5. #5
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Класть в папку со всеми библиотеками \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.

  6. #6
    Продвинутый
    Регистрация
    23.02.2009
    Сообщений
    352
    Вес репутации
    258

    По умолчанию Re: Прерывания в Arduino.

    а такие конструкци прокатывают?

    ....
    attachInterrupt(0, MeasureSPD, RISING); //attaching intterrupt to pin D2
    ....

    while (digitalRead(2)) i++;

    я в сысле о том, можно ли привязать прерывание к ноге и потом считывать ее состояние?

  7. #7
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Не понял смысла? Если назначили прерывание на ногу то зачем состояние проверять? Прерывание и так сработает по изменению состояния

  8. #8
    Новичок
    Регистрация
    25.11.2010
    Возраст
    42
    Сообщений
    7
    Вес репутации
    168

    По умолчанию Re: Прерывания в Arduino.

    Цитата Сообщение от Chip Посмотреть сообщение
    Класть в папку со всеми библиотеками \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();

    То, что мне нужно. Как в нем изменять частоту? например, мне нужно 500 раз в секунду исполнять мой код?

  9. #9
    Продвинутый
    Регистрация
    23.02.2009
    Сообщений
    352
    Вес репутации
    258

    По умолчанию Re: Прерывания в Arduino.

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

  10. #10
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Прерывания в Arduino.

    Для подсчета можно использовать следующие функции
    unsigned long millis()
    unsigned long micros()

Страница 2 из 8 ПерваяПервая 12345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •