Страница 3 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 21 по 30 из 73
  1. #21
    Пользователь
    Регистрация
    04.07.2011
    Возраст
    47
    Сообщений
    22
    Вес репутации
    162

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

    Цитата Сообщение от Chip Посмотреть сообщение
    Привожу два примера прерываний.

    Ниже пример кода для 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);

    Подскажите
    1) где взять библиотеку MsTimer2.h, которой вы пользуетесь.
    2) где взять описание комманд типа PortA, DDRD
    3) в языке для Ардуино я не нашел описания оператора "?". Вы его применяете в такой связке - digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);. Это очень удобный оператор, но где можно увидетьполный список операторов и комманд Ардуины?

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

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

    1 - Библиотека
    2 - Это не команды для ардуино , это Си для AVR . Вот пример
    3 - Я сам где то подсмотрел

  3. #23
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    193

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

    Цитата Сообщение от RainMan Посмотреть сообщение
    ...
    3) в языке для Ардуино я не нашел описания оператора "?". ... Это очень удобный оператор, но где можно увидетьполный список операторов и комманд Ардуины?
    Вопрос интересный - про источник информации и "недокументированные" функции. А про "удобность"... помоему очень вредный оператор, поскольку наверняка это просто "орфографический" вариант оператора IF, обладающий кратким написанием в тексте и огромной неинформативностью при отладке. Соответственно получается "грязный" текст с одинаковым кодом.

  4. #24
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    193

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

    Такой вопрос: можно ли сконфигурировать цифровой вход на генерацию прерывания по фронту, затем в обработчике прерывания обнулить таймер по прерыванию затем тут же переконфигурировать ЭТОТ же вход на прерывание по спаду и выйти из обработчика прерывания. Потом по прерыванию по спаду в обработчике прочитать значение таймера и переконфигурировать ЭТОТ же вход снова на прерывание по фронту и т.д. в цикле...

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

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

    Можно.

  6. #26
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    193

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

    Цитата Сообщение от Chip Посмотреть сообщение
    Можно.
    а не очень нахально ( с прерываниями не пробовал ещё работать) будет выглядеть, если я попрошу у Вас пример скетча на такое:
    на D3, к примеру, настроено прерывание по фронту. Поступает меандр с переменной частотой, обнуляется таймер в обработке прерывания по фронту, дальше переконфигурация D3 на прерывание по спаду. (Потом у меня там будет опрос клавиатуры и вывод на 7ми сегментник - с этим я вроде разобрался) По прерыванию по спаду получаем из таймера длительность импульса, снова переконфигурируем D3 на прерывание по фронту. Это будет вроде как спидометр с проекцией на лобовое...
    Последний раз редактировалось edw123; 15.09.2011 в 21:43.

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

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

    Пример здесь есть

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

    По умолчанию 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. #29
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

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

    PHP код:
    tcnt2 1//  16000000/64/f=tcnt2 
    По этой формуле 16000000/64/500=500
    Последний раз редактировалось Chip; 22.01.2012 в 13:02.

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

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

    Chip, спасибо!

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

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

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

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

Ваши права

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