По мотивам ЭТОЙ темы
Написал простенький код. В двух словах. Вешаем на 2-ой пин прерываение , счиатем кол-во переходов от 0 к 1. при этом запоминаем первое время и последнее время.
Далее если последнее время не меняется больше секунды вычисляем частоту и выводим результат.
Частоту задаем при помощи tone на 8-ой пин.
И вот получаю несколько результатов за 1 тон... не могу понять почему. Вот такой результат:
Не могу понять почему условие
не выполняется корректно..
Если у кого будут идеи - сообщите. Голова что то отказывается сейчас что то придумать.
ДА! Время всегда одно и то же для одной частоты. При изменении частоты время сброса меняется. Видимо как то с работой таймера и прерываений тона зависит. От прерывания не зависит. что 0, что 1.
Написал простенький код. В двух словах. Вешаем на 2-ой пин прерываение , счиатем кол-во переходов от 0 к 1. при этом запоминаем первое время и последнее время.
Далее если последнее время не меняется больше секунды вычисляем частоту и выводим результат.
Частоту задаем при помощи tone на 8-ой пин.
И вот получаю несколько результатов за 1 тон... не могу понять почему. Вот такой результат:
Код:
3838-3585 Кол-во:1557 Частота:434.31
6142-5889 Кол-во:999 Частота:433.97
6653-6400 Кол-во:221 Частота:434.18
14961-15962 Кол-во:3715 Частота:434.10
if ((millis() - lasttime) > 1000)
не выполняется корректно..
Если у кого будут идеи - сообщите. Голова что то отказывается сейчас что то придумать.
ДА! Время всегда одно и то же для одной частоты. При изменении частоты время сброса меняется. Видимо как то с работой таймера и прерываений тона зависит. От прерывания не зависит. что 0, что 1.
C++:
uint32_t Cntr = 0;
uint32_t lasttime = 0;
uint32_t firstime = 0;
bool Start = false;
void intCounter()
{
if (!Start)
{
firstime = millis();
lasttime = firstime;
Start = true;
}
else
{
Cntr++;
lasttime = millis();
}
}
void setup() {
// put your setup code here, to run once:
pinMode(8, OUTPUT);
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, intCounter, RISING);
Serial.begin(115200);
Cntr = 0;
tone(8, 433, 15000);
}
void loop() {
if ((millis() - lasttime) > 1000)
{
if (Start)
{
Serial.print(lasttime); Serial.print("-"); Serial.print(millis());
Serial.print(" Кол-во:"); Serial.print(Cntr);
Serial.print(" Частота:"); Serial.println(1000.0 * (float)Cntr / (float)(lasttime - firstime));
Start = false;
Cntr = 0;
}
}
}