Одно условие на 4 вывода.
- Войдите на сайт для отправки комментариев
Имеем условие при котором на одном из четырех выводов будет HIGH на 1
if(XX<XX)
{
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
Далее следующее условие где HIGH на 2
if(XX<XX)
{
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
}
И так бесконечное множество , все работает , но при этом код очень грамозкий.
Как правильно написать следуещее.
Комбинаций с digitalWrite (X,HIGH); всего 16 - и я хотелбы их описать как например:
A - это первая комбинация из четырех digitalWrite (X,HIGH), digitalWrite (X,LOW), digitalWrite (X,LOW), digitalWrite (X,LOW);
В - вторая комбинация из четырех digitalWrite (X,HIGH), digitalWrite (X,LOW), digitalWrite (X,HIGH), digitalWrite (X,HIGH);
и.т.д - 16 раз
И после этого переписать условия в виде:
if(X>X)
{
A; - выпоняется комбинация А
}
И.Т.Д - подставляя в условия только имена этих комбинаций.
КАК эти комбинации прописать в коде - незнаю , помогите пожалуйста.
Вынесите в функцию:
и вызывайте ее с нужными параметрами:
Хорошее решение , но хотелось-бы выводить эти комбинации просто в виде имени , что бы не прописывать в каждом условии комбинации . т.к эти 4 вывода формируют двоичный код для преобразователя в формате 1-2-4-8 и он уже преобразует его в десятичный от 0 до 15.
где D1 - 1 , D2 - 2 , D3 - 4 , D4 - 8
своего рода это расшеритель выходов из 4 в 16
и малейшая путаница с комбинацией приведет к неправильному значению.
А если будет в виде имен то написав своего рода библиотечку из 16 условий - ошибка исключена и дальнейшее написание условий будут интуетивно понятным.
Тогда так:
maksim
Что то я уже подзапутался - при условии в последнем вашем сообщении если я напишу например: digitalWrite(15);
Появятся высокие уровни на всех четырех выходах - так ? или вы описали все выводы ARDUINO 0-15
И насамом деле моя задача еще более сложная и на примере который я описал выше хотел усложнить задачу.
Сложность заключается в том что в условии два , а иногда и три преобразователя 1-2-4-8
т.е сейчас у меня так:
if(x>y)
{
digitalWrite(1,HIGH); // 1
digitalWrite(2,LOW); // 2
digitalWrite(3,LOW); // 4
digitalWrite(4,HIGH); // 8
получается выход на 1 - ом преобразователе 1+8 = 9
digitalWrite(5,HIGH); // 1
digitalWrite(6,HIGH); // 2
digitalWrite(7,HIGH); // 4
digitalWrite(8,LOW); // 8
Вывод на втором преобразователе 1+2+4 = 7
}
Задействованно 8 ног ARDUINO и на выходе после преобразователей я получил 32.
Все работает , но код очень грамозкий поэтому я и хотел написать его как в первом сообщении описывал.
Преобразователи я поставил для экономии цифровых выводов ARDUINO схема уже собрана и на уровне железа не переделать.
Вы можете просто ввести 16 функций. В каждой из них будет определенная комбинация включения выходов.
Называете функции цифрами и , при выполнении условий , вызываете соответствующие функии.
Что за устройство изобретаете ?
Я вас не понимаю.
Какие 8 ног? Что? Куда? Чего вы хотите сделать?
Функцияsp34 пишет: если я напишу например: digitalWrites(15); Появятся высокие уровни на всех четырех выходах - так ? Так.
void
digitalWrites(
byte
_4bit)
принимает число от 0 до 15 и выводит его в бинарном виде на 4 соответсвующих ногах дуины.Если напишите
digitalWrites(
9
);
то будет:если напишите
digitalWrites(
7
);
то будет:все как в вашем десятичном расчете.
Вы можете просто ввести 16 функций. В каждой из них будет определенная комбинация включения выходов.
Называете функции цифрами и , при выполнении условий , вызываете соответствующие функии.
Вы немоглибы мне простой примерчик показать - я пока совсем двоешник в C++
Приборчик - нет не приборчик - перехватываю сиглал с АЦП и изменяя его параметры относительно трех условий температуры отправляю его назад .
все как в вашем десятичном расчете.
Сейчас попробую спасибо , но непойму как описать два преобразования - 8 ног или три преобразования 12 ног ARDUINO !
т.е мне нужна функция digitalWrive(15) 0-15 - для одного преобр. и для другого нужна комбинация вторая типа digitalWrite 2(15) 0-15 также и т.д
Да, в каждой функции будут указаны свои ноги.
Да, в каждой функции будут указаны свои ноги.
Т.е digitalWrites - я могу обозвать как угодно для одного и по другому для другого преобразователя. ТАК ?
В каком месте кода нужно создать эту функцию ? - ругается при компиляции.
Спасибо !!! все получилось - код сократился на 25%
Как вывести через Serial.print в десятичном виде значение Converter1 из примера выше от maksim - чтобы мониторить данное значение для диагностики.
http://arduino.ru/Reference/Serial/Print
Никак. В его примере Converter1 - это функция. К тому же не возвращающая значения. Следовательно с какой стороны не посмотри - выводить нечего.
Вы явно хотите выводить что-то другое. Но что?
А еще можете почитать Управление портами через регистры Atmega | Аппаратная платформа Arduino может этот подход окажется проще (правда менять ноги уже так просто не выйдет). Но с подходом Максима - тоже разберитесь. В идеале нужно знать оба (каждый имеет свои плюсы и минусы).
А еще, можно делать вызовы этих функций не десятичными константами
А двоичным
Тоже самое, только не хмуря мозг сразу в коде видно что будет установлена первая и четвертая нога.
И еще, нужно помнить, что digitalWrite-ты, не работают моментально. Состояние ног устанавливается последовательно. Поэтому когда вы вызвается
ConvertX(B1111) или ConvertX(15) //что одно и тоже
У вас на выходах последовательно установсятся такие значения:
1. 0000 - изначалное
2. 0001
3. 0011
4. 0111
5. 1111
Состояние со второго по четвертое будут существовать микросекунды, но они будут. В некоторых случаях это критично и нужен четкий переход от 0000 к 1111, без этих промежуточных. Тогда выход - только через прямую запись в порт.
Вы явно хотите выводить что-то другое. Но что?
При разных многочисленных условиях изменяется число в Converter1 от 0-16 и на 4-х цифровых выходах появляется двоичная комбинация. - вот ее я и хочу видеть в мониторинге и если возможно в десятичном виде.
Я могу Serial.print прописать в каждом из условий но это не вариант их очень много и код получается громоский. - место экономлю.
Переход не критичен от 2-4 значению я вас понял.
При разных многочисленных условиях изменяется число в Converter1 от 0-16 и на 4-х цифровых выходах появляется двоичная комбинация. - вот ее я и хочу видеть в мониторинге и если возможно в десятичном виде.
Так какое- же число? _4bit? Это называется "параметр функции". Не хотите писать Serial.println при каждом вызове Converter1?
Ну так сделайте его внутри функции, там же где и digitalWrite
Хотя DEC тут и не обязательно, по умолчанию и так все в десятичном вывоидтся. Только зачем тут десятичный? Не очень понятно. Что-бы потом "переводить в уме" какие ноги выставляются? IMHO в двоичном было-бы удобней выводить (вам выше ссылку дали на документацию, посмотрите как это делается). А можно и в двоичном и десятичном выводить :) На все случаи жизни (два Serial.print делать)
Так какое- же число? _4bit? Это называется "параметр функции". Не хотите писать Serial.println при каждом вызове Converter1?
Ну так сделайте его внутри функции, там же где и digitalWrite
Спасибо ! прописал в нутри функции и все вывелось , а десятичное число мне нужно для того - далее эти 4-вывода управляют конвертером (1-2-4-8) двоичного кода в десятичный. - анализировать какой вывод включится на конверторе мне удобнее в десятичном виде.
А если цель "экономить" - то можно свернуть пример Максима во так, использовать одну функцию вместо 4-рех и передавать ей какими пинами рулить (просто Максим давал пример "попроще для понимания"):
Через дефайны
Или через массивы:
не проверял, но суть идеи думаю ясна (если не ясна - читать документацию про массивы и справочники C про #define)
Ах, да забыл традиционное - новичкам нужно читать прикрепленные ветки Вставка программного кода в тему/комментарий
Спасибо ! будем учиться !
Или вот еще вариация. Упрощенный вариант массивов, но без двух-мерных (массив, массивов), только одномерный (возможно проще для понимания).