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(13, HIGH);
MsTimer2::set(500, flash_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(PinA, INPUT);
digitalWrite(PinA, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, int_on, CHANGE); // настроить прерывание 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);. Это очень удобный оператор, но где можно увидетьполный список операторов и комманд Ардуины?
Re: Прерывания в Arduino.
1 - Библиотека
2 - Это не команды для ардуино , это Си для AVR . Вот пример
3 - Я сам где то подсмотрел
Re: а есть ли у ардуино прерывания?
Цитата:
Сообщение от
RainMan
...
3) в языке для Ардуино я не нашел описания оператора "?". ... Это очень удобный оператор, но где можно увидетьполный список операторов и комманд Ардуины?
Вопрос интересный - про источник информации и "недокументированные" функции. А про "удобность"... помоему очень вредный :) оператор, поскольку наверняка это просто "орфографический" вариант оператора IF, обладающий кратким написанием в тексте и огромной неинформативностью при отладке. Соответственно получается "грязный" текст с одинаковым кодом.
Re: а есть ли у ардуино прерывания?
Такой вопрос: можно ли сконфигурировать цифровой вход на генерацию прерывания по фронту, затем в обработчике прерывания обнулить таймер по прерыванию затем тут же переконфигурировать ЭТОТ же вход на прерывание по спаду и выйти из обработчика прерывания. Потом по прерыванию по спаду в обработчике прочитать значение таймера и переконфигурировать ЭТОТ же вход снова на прерывание по фронту и т.д. в цикле...
Re: Прерывания в Arduino.
Re: Прерывания в Arduino.
Цитата:
Сообщение от
Chip
Можно.
а не очень нахально ( с прерываниями не пробовал ещё работать) будет выглядеть, если я попрошу у Вас пример скетча на такое:
на D3, к примеру, настроено прерывание по фронту. Поступает меандр с переменной частотой, обнуляется таймер в обработке прерывания по фронту, дальше переконфигурация D3 на прерывание по спаду. (Потом у меня там будет опрос клавиатуры и вывод на 7ми сегментник - с этим я вроде разобрался) По прерыванию по спаду получаем из таймера длительность импульса, снова переконфигурируем D3 на прерывание по фронту. Это будет вроде как спидометр с проекцией на лобовое...:o
Re: Прерывания в Arduino.
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 раз в секунду исполнять мой код?
Re: Прерывания в Arduino.
PHP код:
tcnt2 = 1; // 16000000/64/f=tcnt2
По этой формуле 16000000/64/500=500
Re: Прерывания в Arduino.