Я бы в обработчике прерывания выключал прерывание на момент обработки:
PHP код:
void int_on()
{
detachInterrupt(int_on);
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
pulse++;
attachInterrupt(0, int_on, FALLING);
}
Я бы в обработчике прерывания выключал прерывание на момент обработки:
PHP код:
void int_on()
{
detachInterrupt(int_on);
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
pulse++;
attachInterrupt(0, int_on, FALLING);
}
Лучше поставить конденсатор 0,1мкф параллельно геркону
Сегодня провел испытание на автомобиле: примерно 8 импульсов за 1 оборот колеса. Что получается ~ 31см/ на импульс. Можно начинать писать спидометр. Как раз пригодится MsTimer2![]()
Тебе импульсы считать нужно?
Последний раз редактировалось Chip; 20.09.2012 в 10:54.
Специально зарегистрировался на этом форуме, т.к. сколько я лазил лазил по рус. инету, спецом по Ардуине Chip наверно в 5терку лучших вошел бы.
Хотел у вас спросить. Сам я фермер, жизнь заставила писать для МК разнообразные программы для хозяйства, т.к. нужна гибкость и получение того, что мне конкретно от МК нужно. Раньше я писал проги на асемблере под пики, но когда код получался под 16000 команд написанных руками, мозг начал просить пощады (т.к .в памяти нужно было хранить для чего то для чего это).
В начале я скачал прогу Флоукоде и за 1н день написал простую прогу (терморегулятор + димер) для неизвестного мне контроллера и оно все заработало.
Потом купил Ардуино на атмеге 2560, довольно быстро получилось прикрутить символьный ЖКИ, датчики DHT, а потом если честно - разочарование, потому как не могу разобраться с критичными для моих применений вещами:
1. Как пользоваться кучей таймеров атмеги 2560 и пользоваться их прерываниями?
2. Почему DHT датчики так сильно тормозят на ардуино?
мне вот что в хозяйстве, в основном нужно - работа с АЦП, димеры - плавные регулировки напряжения для вентиляции, освещения, насосов отопления, т.е. обычное фазовое управление на симисторы. На пике это в пол тыка делалось прерываниями, по убыванию фронта на INT и (желательно быстрый) отсчет таймера, на каждый симистор должен работать отдельный таймер (обычно были задействованы все 4ре таймера) , все это крутилось себе в прерываниях и особо не тормозило работу основной программы, можно было спокойно себе лазить в меню, изменять параметры.
А сколько я видел примеров скетчей на ардуино - все идет через делей (!?) что за изврат??? или 1н единственный таймер №2
В английском я не очень, по пикам хоть есть хорошие описания на русском, полностью переведенные пдфки, а по ардуине того, что мне надо вообще не нашел.
Поэтому только на вас у меня вся надежда.
Последний раз редактировалось Vespen; 21.01.2013 в 03:53.
Я извиняюсь, но мое сообщение по каким то причинам не попало сюда
Не буду заново писать, лучше спрошу
Может Вам примеры кода показать?
Chip буду очень признателен.
Интересуют прерывания по таймерам Атмеги 2560, установка значений в таймер (для фазовых задержек), по INT прерываниям я уже вроде разобрался. желательно чтоб без библиотек.
Конкретно для меги я ни разу не писал, Примеры для Arduino Nano приведу
Многоканальный Dimmer на Arduino Nano на Mega будет работать если заменить фаил Nanopins.h на cyberpins.h
Пример использования Timer1
Вся информация по регистрам таймеров в Datasheet есть, к сожалению переводить Ds нет времени
но вот например нашел кое что у себя, коментарии к некоторым регистрам и флагам
Думаю этого должно быть достаточно для самостоятельного изучения
Код:void Setup_TIMER2() { // TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2 TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика TCCR2B=((0 << CS22) | (0 << CS21) | (1 << CS20)) //Делитель 0 //ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора //ASSR|=(1<<AS2); // Тактировать T2 от асинхронного генератора таймера TCNT2 = TCNT2_Const; // 16000000/256/100/64=8 tcnt2=256-8=248. TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2. // TIMSK2|=(1<<OCIE2); // Разрешить прерывание по совпадению Т2. } void loop() { } ISR(TIMER2_OVF_vect)//вектор прерывания по переполнению таймера { TCNT2=0; } ISR(TIMER2_COMPA_vect) //Обработчик прерывания по совпадению с OCR2 { TCNT2=0; }
Последний раз редактировалось Chip; 23.01.2013 в 23:22.
спасибо большоескажу откровенно по вашим материалам, материалам этого форума, можно сделать одну из сильнейших по всему русскоязычному инету ветку по ардуино.
Огромный вам респект.
Если что то будет не понятно, спрашивайте
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)