Вот только добрался до експерементов и оказалось что ms timer2 таки считается в мс а вот таймер импульса почему то в микро сек. т.е. чтоб поставить допустим импульс длит 1сек на нем нужно поставить 100000, я что то не так делаю???
void flash_led() //обработчик прерывания
{
digitalWrite(ledPin, HIGH);
delay(100000); //длительность импульса 1 сек
digitalWrite(ledPin, LOW) ;
}
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
MsTimer2::set(1000, flash_led); // будет срабатывать каждые 1 сек.
MsTimer2::start(); //включить таймер
Таймер импульса, это что?
Зачем в flash_led находится делэй?
Код неверный.
Код сознательно упрощен для понимания.PHP код:
boolean LedStatus=false; //триггер состояния Led
void flash_led() //обработчик прерывания
{
LedStatus = !LedStatus; //переключаем триггер
if (LedStatus) //проверяем состояние триггера
{
digitalWrite(ledPin, HIGH); //включаем, если триггер в true
}
else
{
digitalWrite(ledPin, LOW) ; // выключаем, если триггер в false
}
}
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
MsTimer2::set(1000, flash_led); // будет срабатывать каждые 1 сек.
MsTimer2::start(); //включить таймер
В твоем коде скважность 50/50, а ему требуется http://www.compcar.ru/forum/showpost...4&postcount=48
Сча изобрАзим
PHP код:
volatile int led_time = 5; //5 сек из 60 будет гореть
volatile int led_counter = 0; //счетчик
void flash_led() //обработчик прерывания
{
if (led_time>led_counter) //
{
digitalWrite(ledPin, HIGH); //горит, пока счетчик считает до 5
}
else
{
digitalWrite(ledPin, LOW) ; // не горит оставшееся время (55 сек в твоем случае)
}
led_counter++;
if (led_counter==60) led_counter=0; //обнуляем счетчик
}
Последний раз редактировалось BlkDem; 26.06.2012 в 21:01.
Прошу прощения что не появлялся....
Дело в том что длина "high"(импульс) и длина "low"(пауза), величины регулируемые 5-50МС и 5-50с соответственно...
Так же столкнулся с такой проблемой при подаче питания на МК и до окончания инициализации на ledPin присутствует "1" тем самым открыт клапан почти 4 сек (льёт житкость рекой), можно ли изначально задать "0" на нужной ноге?
Схему и скетч выложи, посмотрю что можно сделать
Извиняюсь что не писал долго, проект был отложен и теперь снова к нему вернулся и наступил на грабли,
показания на дисплее появляются по буквенно с паузой в 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 ");
}
У меня в механическом спидометре, на TLC-80, обнаружился геркон, который замыкается 4 раза за 1 оборот вала (одной ногой сидит на земле).
Я подозревал, что геркон может дребезжать, поэтому решил сначала потренироваться на кошках велосипеде. Там так же имеется геркон.
Т.к. срабатывание геркона приводит к появлению логического нуля я решил использовать attachInterrupt(0, int_on, LOW);
Беру второй пример, немного модифицирую для вывода значений:
Кручу колесо рукой и выясняется, что при прохождении магнита около геркона фиксируется от 2 000 - 15 000 вызовов прерывания, в зависимости от скорости вращения.PHP код:
#define PinA 2
static boolean output = HIGH;
int pulse = 0;
void setup()
{
pinMode(PinA, INPUT);
digitalWrite(PinA, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, int_on, LOW); // настроить прерывание interrupt 0 на pin 2
Serial.begin(9600);
}
void loop()
{
delay(100);
Serial.println(pulse);
}
// обработка прерывания
void int_on()
{
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
pulse++;
}
Меняем работу с прерыванием на attachInterrupt(0, int_on, CHANGE), получаем от 1 до 5 вызовов за одно прохождение.
RISING дает 2 вызова: первый когда геркон замыкатеся, второй когда размыкается и, наконец FALLING стабильно дает 2 вызова при замыкании геркона.
Интересно получается. Судя по описанию:
LOW - вызов прерывания когда пин устанавливается в 0.
CHANGE - пин меняет состояние (0->1 или 1->0)
RISING - 0 -> 1
FALLING - 1 -> 0
Т.е. по всех случаях кроме CHANGE должен происходить один вызов прерывания за один проход магнита мимо датчика.
В итоге дорабатываю код таким образом, что бы получать один вызов в момент замыкания геркона.
Завтра по дороге на работу опробую это в машине.PHP код:
#define PinA 2
static boolean output = HIGH;
int pulse = 0;
bool prev = false;
void setup()
{
pinMode(PinA, INPUT);
digitalWrite(PinA, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, int_on, FALLING); // настроить прерывание interrupt 0 на pin 2
Serial.begin(9600);
}
void loop()
{
delay(100);
Serial.println(pulse);
}
// обработка прерывания
void int_on()
{
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
if(!prev)
{
pulse++;
}
prev = !prev;
}
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)