Как с помощью сигнала HIGH на pin прибавлять к переменной int?
- Войдите на сайт для отправки комментариев
Вс, 17/05/2015 - 17:09
Как с помощью сигнала HIGH на pin прибавлять или убавлять(сигнал на другой пин) к переменной int скетча определенное число и ограничить это число 360, чтобы после 360 шло не 361, а 1?
ну понятно что декларируем пины, ставим их на прием.... а дальше?
Ждём нужного события и если оно произошло, то добавляем 1 к переменной, проверяем на переполнение и если оно больше 360 устанавливаемые переменную в 1
Смотря какой пин и какая машинка. На старших моделях можно подавать на счетный вход счетчиков (на плате Ардуино Мега2560 выведены входы от Т0 и Т5 только) и тупо считать счетчиком. Счетчик ограничить ICRNx регистром или CRxA до заданного значения, разрешить и обрабатывать прерывание по переполнению TOVx ... Фсё :)
... или установить его в режим непрерывного счета внутр. импульсов, а как ногу счетного пина использовать сигнал "захвата счетчика" (ICRx).. Тогда ловить прерыванием по захвату каждый импульс и корректировать чиселку в памяти ручками ... сложнее, но позволяет использовать таймер и для других целей одновременно. На плате Меги выведено всего 2 таких сигнала для счетчиков 4 и 5...
:)
Можно засекать время прохода loop и если оно увеличивается на величину установленую в дополнительной функции, то добавлять элемент в массив, при достижении массивом длинны в 360 элементов выполнять софт резет.
А че Arhat109 можно а мне нет?
Вы тут тряпки жжете и смеетесь?
Не засоряй тему. Есть что сказать - предлагай свой вариант.
Не засоряй тему. Есть что сказать - предлагай свой вариант.
Предлагаю сделать коробку и серва туда будет шарики складывать, как 360 наберется, коробка переворачивается.
может так :
Лучше так, чтобы уж совсем понятно было. :)
Лучше так, чтобы уж совсем понятно было. :)
Извените, а какую магию вы использовали для для написания вычисления, ради интереса попробывал Ваши умозаключения преоброзовать в скече выдаёт ошибку, может быть я что-то недопонял или где ошибся.
int i; void setup() { Serial.begin (9600); pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop(){ //digitalRead(9) && ++i > 360 && i = 1; if (digitalRead(9)) i++; if (i > 360) i = 1; Serial.println(i); delay(20); }Че проще написано, тем проще потом разобраться. Чем "мудрее" написано, тем проще допустить ошибку.
А компилятору глубоко по барабану, "мудро" написано или просто, код будет одинаковый. А если так, то зачем извращаться?
vov4ik, +1, читабельно и сразу понятно.
То All:
Только всё равно это всё некорректно, потому что читать высокий уровень на пине, а не ловить фронт, i будет расти в зависимости от частоты опроса пина. Сомневающиеся могут попробовать менять в последнем скетче величину delay и подавать на 9 пин импульс определенной длины. Значения будут очень разные.
Ваш КЭП.
Извените, а какую магию вы использовали для для написания вычисления, ради интереса попробывал Ваши умозаключения преоброзовать в скече выдаёт ошибку, может быть я что-то недопонял или где ошибся.
Ну, зачем же сразу извеняца - ошибиться может каждый! :)
Вот так ещё попробуйте, ради интереса:
А если магия непонятна - это я не виноват, это они первые начали.
А компилятору глубоко по барабану, "мудро" написано или просто, код будет одинаковый. А если так, то зачем извращаться?
Может компилятору всеравно но разница есть.
int i; void setup() { Serial.begin (9600); pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop(){ //if (digitalRead(9)) ++i; //if (i > 360) i = 1; digitalRead(9) && ++i == 361 && ( i = 1 ); Serial.println(i); delay(20); } //Sketch uses 2 950 bytes (9%) of program storage space. Maximum is 30 720 bytes.int i; void setup() { Serial.begin (9600); pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop(){ if (digitalRead(9)) ++i; if (i > 360) i = 1; //digitalRead(9) && ++i == 361 && ( i = 1 ); Serial.println(i); delay(20); } //Sketch uses 2 958 bytes (9%) of program storage space. Maximum is 30 720 bytes.Если внимательно просмотрется разница в восемь бит.
По магии, я так понимаю когда значение пина истина && пропускает дальше, ++i самостоятельно увеличивается, далле читается как (i = i + 1) > 360, тоесть истина если i > 360 (при i = 361), пропускает дальше, далее присвоение которое должно быть самостоятельным поэтому без скобок не захотело работать.
Если у меня неправильный ход моих логических мыслей, пожалусто поправте.
08 строку можно выполнять только если меняется i, тогда точно не будет разницы с && вариантом.
UPD: про 8 бит не понял
Когда я пишу
Только всё равно это всё некорректно, потому что читать высокий уровень на пине, а не ловить фронт, i будет расти в зависимости от частоты опроса пина.
Ваш КЭП.
Верно. А ещё опрос внутри loop() приведет к строго последовательной работе и задержкам на обслуживание остальных задач. Поэтому и отписал про сигнал захвата таймера. Его прерывание как раз можно программировать как на фронт, так и на спад.
Спасибо, КЭП. :)
Когда я пишу
Ну так бы и сказал, на один байт. Странно, надо посмотреть листинг.
Там на 8 байт разница, судя по сообщениям компилятора.
Вполне может быть - не обязательно всё должно совпадать байт в байт. Тем более, этот компилятор, если честно, по-моему не очень- то старается что-то оптимизить.
Но я согласен - редко бывают случаи, когда стоит жертвовать понятностью кода ради такой экономии. Себе дороже выйдет.
Ну вот и дошли руки до этого дела. Два разных подхода дают абсолютно одинаковый код (осторожно, ассемблер):
Скетч 1, вариант, который я предлагал (и не только я):
int i; void setup() { Serial.begin (9600); pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop() { if (digitalRead(9)) { i++; if (i > 360) i = 1; } Serial.println(i); delay(20); }Второй вариант, хитронаписанный:
int i; void setup() { Serial.begin (9600); pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop() { digitalRead(9) && ++i > 360 && ( i = 1 ); Serial.println(i); delay(20); }Собственно, что и требовалось доказать.
PS Да, компилял на АрдуиноИДЕ 1.6.4 с опциями при компиляции по-умолчанию, не менял.