Непонятки с передним фронтом
- Войдите на сайт для отправки комментариев
Чт, 14/05/2015 - 16:59
В конце программы создал несеметричный мультивибратор который на 100миллисек выдаёт 1 в 15сек, далее выделение переднего фронта, тоесть измерение и выдача в порт происходит один раз в 15сек по условию if(trgrt1).
String TS; bool trgrt1 = 0; bool trgrt2 = 0; bool trgrt3 = 0; void setup() { Serial.begin(9600); analogReference(INTERNAL); pinMode(3, INPUT);// Замкнуть на 5В pinMode(10, OUTPUT); //хз } void loop() { if(trgrt1) { TS= (String(float (analogRead (0)/ 9.31))); // LM35 Serial.print("sensor = " ); Serial.println(digitalRead (3)); Serial.print("temp " ); Serial.println(TS); } trgrt3 = (!((millis()%15000) - (millis()%15000)%100)); // блинк 15 сек на 100 мсек trgrt1 = 0; if (!trgrt3) {trgrt2 = 1;} if (trgrt3 && trgrt2) {trgrt1 = 1; trgrt2 = 0;} delay (1); }
Всё работает но если убрать delay (1); , в порт прилетает 1-4 сигнала.
Почему так ???
или я не понял, или код странный
22 строка. Это зачем считать разницу между соседними вызовами millis? Да еще со страшным %15000. Я бы еще понял, считать разницу между текущим значением millis и сохраненным. Тогда можно измерять временные интервалы, а если не сохранять, то выдержать интервал не получится.
Не работает, потому что логика странная, если объясните, разве что, но лично я не догоняю.
Может проще задачу сформулировать? Вам нужно раз в 15 секунд прочитать данные с пина A0 и выдать в Serial, так?
Сейчас вообще непонятно, зачем Вам мультивибратор, да еще несимметричный, да еще и на 100мс выдающий единицу (куда то выдающий).
А что не понятного условие
if
(trgrt1) должно выполнятся один раз в 15 сек.
(!((millis()%15000) - (millis()%15000)%100)) формирует сигнал если с периудом в 1 сек 0 0 0 0 0 0 0 0 0 0 0 0 0 1
24 if (!trgrt3) {trgrt2 = 1;} тут я думаю понятно когда нули trgrt2 = 1
25 if (trgrt3 && trgrt2) {trgrt1 = 1; trgrt2 = 0;} когда 1 и trgrt2 = 1 тогда trgrt1 = 1; trgrt2 = 0;
далее выполнение условия if(trgrt1)
23 trgrt1 = 0;
когда нули выполняется 24 как только появляется первая 1 выполняется один раз 25, с делей всё работает, но почему если убрать проскакивает несколько.
Программа сильно растянется булет куча условий, экран, SD карта и часы, на сиди карту один раз в 15 сек должна будет производится запись, привязка к часам не получится, SPI тяпает много времени (к примеру вывод картинки на TFT примерно 3сек) и мне проще будет раздвинуть методом тыка несеметричный мультивибратор, к примеру 15 сек из которых 4 сек "1" ост "0".
Так та в принцепе всё работает но с делей, и у меня возникает просто вопрос почему тригер не отрабатывает.
Формировать не один сигнал ("выполнить измерение"), а сигнал длительностью 100мс, чтобы из него выдернуть фронт - это, с моей т.з. нонсенс и усложнение простой задачи. Но дело Ваше, настаивать не буду и помочь в этом сложном деле не смогу.
PS Я раньше использовал разные трюки, но потом, поработав в группе, пишу всегда тупо и просто. И в этом есть смысл, поверьте. Тупо - значит проще разобраться. Просто - значит поймет даже двоешник. Всё это вместе помогает писать программы с меньшим количеством ошибок и быстрее решать задачи.
PS2 И да, я millis в одном цикле никогда не вызываю два раза, проще сохранить в переменной и использовать её по назначению хоть десять раз. А так смысл такого трюка понятен, т.е. формирование "импульса" определенной длительности.
PS2 И да, я millis в одном цикле никогда не вызываю два раза, проще сохранить в переменной и использовать её по назначению хоть десять раз. А так смысл такого трюка понятен, т.е. формирование "импульса" определенной длительности.
Похоже что вы правы ввёл переменную unsigned long привязал её к миллес баг пропал, всё отрабатывает на ура.
Осталось посмотреть, что такое millis:
это уже так, скорей до кучи. Т.е. между двумя вызовами может тикнуть таймер.
Ну и прекрасно, раз работает :)