Сегодня провел испытание на автомобиле: примерно 8 импульсов за 1 оборот колеса. Что получается ~ 31см/ на импульс. Можно начинать писать спидометр. Как раз пригодится MsTimer2
Сегодня провел испытание на автомобиле: примерно 8 импульсов за 1 оборот колеса. Что получается ~ 31см/ на импульс. Можно начинать писать спидометр. Как раз пригодится MsTimer2
Пытался при помощи приведенного мною выше кода отслеживать появление +5в. на Pin 2. Не получается не при каких значениях 3-го параметра функции attachInterrupt.
Испытывал при помощи проводка подключая попеременно его то к земле, то к 5в. Значение переменной pulse растет только когда к земле провод подключаю.
Тебе импульсы считать нужно?
Последний раз редактировалось 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сек, pin13 светится всё время, уже запутался полностью с этим прерыванием...#include <LiquidCrystal.h>
#include <MsTimer2.h>
const int sensorPin = A1; // select the input pin for the potentiometer
const int sensor1Pin = A2;
int ledPin = 13; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
int sensor1Value = 0;
int ledValue = 0;
int led1Value = 0;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void flash_led() //обработчик прерывания
{
digitalWrite(ledPin, HIGH);
delay(led1Value); //длительность импульса
digitalWrite(ledPin, LOW) ;
}
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
MsTimer2::set(ledValue, flash_led); // будет срабатывать каждые 30сек.
MsTimer2::start(); //включить таймер
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
}
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
sensor1Value = analogRead(sensor1Pin);
lcd.setCursor(0, 1);
// map it to the range of the analog out:
ledValue = map(sensorValue, 0, 1023, 5000, 60000);
led1Value = map(sensor1Value, 0, 1023, 6, 60);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pause ");
lcd.print(1000 / ledValue);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("impuls ");
lcd.print(led1Value);
lcd.print("ms ");
}
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)