Страница 1 из 8 1234567 ... ПоследняяПоследняя
Показано с 1 по 10 из 73
  1. #1
    Продвинутый
    Регистрация
    23.02.2009
    Сообщений
    352
    Вес репутации
    264

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

    типа как у х86 прерывания по таймеру? а то хочу навесить ардуино для решения пары простых, но длительных по времени задач, было бы сделать проще как обработчик прерывания. или просто на какой-нить вход подать тактовые импульсы и на этом сделать что-то вроде обработчика? опять же, мож есть внутренний таймер для этой цели, чтоб не городить ниче вокруг?

    ну и примеры программки, если есть...

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

    По умолчанию Re: а есть ли у ардуино прерывания?

    Привожу два примера прерываний.

    Ниже пример кода для Arduino, прерывание по таймеру
    В этом примере процедура flash_led будет выполнятся каждый раз по истечению 0,5 сек.
    PHP код:
    //Выполнение процедуры по прерыванию таймеру.
    #include <MsTimer2.h>
      
    static boolean output HIGH;
      
    void flash_led() //обработчик прерывания
    {
      
    digitalWrite(13, (output==HIGH) ? output=LOW output=HIGH);
    }

    void setup() {
      
    pinMode(13HIGH);

      
    MsTimer2::set(500flash_led); // 500ms период
      
    MsTimer2::start();  //включить таймер
    }

    void loop() 
    {
    //.....

    Еще один пример работы аппаратного прерывания.
    В данном примере при изменении напряжения на ножке D2
    каждый раз будет выполнятся процедура int_on
    Таких входов в Arduino всего 2 (D2,D3)
    И несколько вариантов настройки событий
    LOW - to trigger the interrupt whenever the pin is low,
    CHANGE - to trigger the interrupt whenever the pin changes value
    RISING - to trigger when the pin goes from low to high,
    FALLING - for when the pin goes from high to low.

    PHP код:
    #define PinA  2
    static boolean output HIGH;

    void setup() 
    {   
      
    pinMode(PinAINPUT); 
      
    digitalWrite(PinAHIGH);     // подключить подтягивающий резистор
      
    attachInterrupt(0int_onCHANGE);  // настроить прерывание interrupt 0 на pin 2


    void loop()
    {
    //........
    }

    // обработка прерывания
    void  int_on()
    {
    digitalWrite(13, (output==HIGH) ? output=LOW output=HIGH);

    Вложения Вложения
    Последний раз редактировалось Chip; 04.07.2011 в 12:28.

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

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

    а не в курсе, случаем, есть возможности дернуть сигнал откуда-нибудь о достижении скорости километров в 20? или все же придется импульсы с датчика скорости считать? приятнее было бы че-нить с уровнем 0 и 1. двиг 2AZ-FE, на камри в частности ставится. понимаю, что управление меняется и от модели и от года, но вдруг есть наколки какие

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

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

    Акселерометр использовать.

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

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

    я бы рекомендовал либо GPS либо с датчика скорости. С датчика скорости просто импульсы идут. Напрягает больше всего то, что надо провода тащить, а обработать импульсы совсем просто.

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

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

    да там проводов-то... метр в салоне. буду щщитать

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

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

    кстати, о птичках. а сколько примерно длиться цикл с инкрементом и парой проверок? на атмеге 16-20Мгц. чтоб поменьше гадать

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

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

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

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

    По умолчанию Быстродействие 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.

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

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

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

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

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

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

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

Страница 1 из 8 1234567 ... ПоследняяПоследняя

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

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

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

Ваши права

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