drew
[
37]
[!]
24.12.2015 22:45
может не в тему
но бывает что нужен хрон , а его нема.
собрать можно буквально за час с перекурами из ардуино
разработка не моя. просто пользуюсь иногда.
схема
Изображениеустановка светодиодов и фототранзисторов в огрызок пвх трубы
Изображениену и сама программа
// расстояние 60мм
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // устанавливаем адрес 0x27, и дисплей 16 символов в 2 строки (16х2)
volatile float speed = 0; // вычисленное значение скорости пули m/s
volatile int N=8; // предделитель для кварцевого генератора см.Timer1
//int pin = 13;// отладка прерывания
//volatile int state = LOW; //отладка прерывания
//volatile unsigned int TCNT1_copy=5;// отладка работы счетчика TCNT1
void setup()
{
//Serial.begin(9600);
//------ Timer1 ----------
//TCCR1B = 0 (WGM13:0=0) // Режим normal (счет от 0 до 65535) установка в 0 после первоначального сброса
//TCCR1B |= (1<<CS10); // Тактирование от CLK.
// Если нужен предделитель :
//TCCR1B |= (1<<CS11); // CLK/8
// TCCR1B |= (1<<CS10)|(1<<CS11); // CLK/64
// TCCR1B |= (1<<CS12); // CLK/256
// TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024
TCCR1B &= ~ (1 << CS10); // обнуление CS10(TCCR1B). Теперь 1 только в CS11 (почему-то изначально TCCR1B=3 ) (должно быть TCCR1B=2) теперь CLK/8
TCCR1A &= ~ (1 << WGM10); // обнуление WGM10(TCCR1A). Должно быть первоначально TCCR1A=0, но почему-то TCCR1A=1. Теперь режим normal Timer1 вкл.
//------ LCD ----------
lcd.init(); // инициализация LCD
lcd.backlight(); // включаем подсветку
lcd.clear(); // очистка дисплея
lcd.setCursor(4, 0); // устанавливаем курсор на 1 строку, 4 символ
lcd.print("speed pula"); // вывод надписи
lcd.setCursor(0, 1); // устанавливаем курсор на 2 строку, 0 символ
lcd.print("m/s:");
//pinMode(pin, OUTPUT);// для отладки
attachInterrupt(0, Interrupt0, FALLING);// обработчик прерывания прерывание int0 переход 1->0
attachInterrupt(1, Interrupt1, FALLING);// обработчик прерывания прерывание int1 переход 1->0
}
void loop()
{
//Serial.println(TCNT1);
//Serial.println(TCCR1B);
lcd.setCursor(5, 1);
lcd.print(speed);
// digitalWrite(pin, state); // отладка работы прерывания 0 и 1
}
void Interrupt0() // обработчик внешнего прерывания int0
{
// state= !state; // для отладки
TCNT1 = 0; // сброс счетчика
// TCNT1_copy=TCNT1; // проверка, что счетчик действительно обнулился
EIMSK &= ~ (1 << INT0); // Запретить прерывание int0 (для устранения "дребезга")
}
void Interrupt1()// обработчик внешнего прерывания int1
{
// state= !state; // для отладки
speed=960000.0/(N*TCNT1); // вычисление скорости пули м/c, растояние между фототранзисторами 0,06м
// тактовая частота 16Мгц, после предделителя (/8) дает время увеличения значения счетчика TCNT1 на 1 за 8*1/16*10^-6 c
// в TCNT1 количесто этих интервалов
EIMSK &= ~ (1 << INT1); // Запретить прерывание int1 (для устранения "дребезга")
}