Формирование запроса
- Войдите на сайт для отправки комментариев
Втр, 02/09/2014 - 18:12
Поискав по форуму, я все таки нашла решение, как заставить светится светодиоды на четырех свдиговых регистрах в нужном направлении:
//Пин подключен к ST_CP входу 74HC595 const int latchPin = 8; //Пин подключен к SH_CP входу 74HC595 const int clockPin = 12; //Пин подключен к DS входу 74HC595 const int dataPin = 11; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { for(char thisLed = 0; thisLed < 32; thisLed++) { registerWrite(thisLed, 1); delay(100); } } void registerWrite(int whichPin, int whichState) { long bitsToSend = 0; digitalWrite(latchPin, LOW); bitWrite(bitsToSend, whichPin, whichState); byte register3 = (bitsToSend) >> 24; byte register4 = (bitsToSend) >> 16; byte register5 = (bitsToSend) >> 8; byte register6 = (bitsToSend); shiftOut(dataPin, clockPin, MSBFIRST, register3); shiftOut(dataPin, clockPin, MSBFIRST, register4); shiftOut(dataPin, clockPin, MSBFIRST, register5); shiftOut(dataPin, clockPin, MSBFIRST, register6); digitalWrite(latchPin, HIGH); }
Теперь встал вопрос об управлении светодиодами. В преведенном коде управление только одним светиком, а хотелось бы управлять двумя - четырмя за раз.
Конечно, можно многократно вызывать registerWrite, но это не совсем правильно и несколько ресурсоемко.
Поэтому вопрос, как сформировать вызов так, чтобы за раз можно было зажечь несколько произвольных светиков?
Заранее спасибо.
замените на
И тогда каждый вызов registerWrite() будет выставлять whichPin в состояние whichState не сбрасывая остальные светики в ноль.
leshak, спасибо, но это немного не то. Мне надо чтобы при каждом вызове указывать не один светик, а 2 или 4, и чтобы светики с прошлого вызова очищались.
Ну тогда нужно, для начала разобратся как работает тот код что у вас уже есть.
Выяснить что делает функция bitWrite, и как перевести, дословно "bits to Send" (переменная такая есть).
Я примерно представляю как работает код, и понимаю что для моей задачи можно обойтись без bitWrite. Но не пойму как составить значение переменной. Например, я нажимаю 4 разных кнопки и надо зажечь соответствующие светики, т.е. значение переменной будет, например такое 1000000010000100000001000000 (134758464 в десятичной системе), или в такое 10000000000000101000000000000010 (2147647490). Но вот как программно создавать такие значения следуя условию?
Есть такое математическое действие СЛОЖЕНИЕ. Тоесть каждому светику соотвествует свое число если сложить 2 числа то получиться сумма для поджигания 2 светиков. Ну и так далее. К каждой кнопке лепим число. Считаем сумму и отсылаем на светики.
Ну вот пробую сложить, но что-то не получается. Два последних регистра совсем не задействованы, светики на них не светят.
Ну для наглядности я бы складывал в двоичной системе на листике.
Пишем число для каждого светика
Пробуем складывать
а потом все это пихал в десятичной через ком порт и смотрел
Ну вот пробую сложить, но что-то не получается. Два последних регистра совсем не задействованы, светики на них не светят.
Ну, во первых я могу только повториться: выясните что же делает функция bitWrite. Тогда, может быть, станет понятно, что строка
Нафиг не нужна. (и вообще заводить две переменные ByteSend1,2) - лишняя затея. Сразу в ByteSend устанавливается что вы там хотите.
И это.... почему они вдруг стали Long-гами? Причем передаем их в функцию которая принимает int?
Не кажется странным в имени переменной типа long использовать слово byte, а использовать ее как int?
Далее, thisLed у вас меняется от 0 до 16-ти... при этом вы делаете попытку устанавливать thisLed+16, то есть... что будет когда thisLed будет, скажем равень 16-ти. Пытаемся установить 32-й бит? У вас сколько светиков? Сколько бит отсылает registerWrite?
А сколько у нас байт в int-те? Какого типа у нас bitsToSend? Читаем int
P.S. А вообще, ход мысли - правильный. Довльно "близко к правде", только привыкнуть к вдумчивому обращению с типами, и читать доку на функции которые используем.
Ну, во первых я могу только повториться: выясните что же делает функция bitWrite.
Про bitWrite я прочитала, и вроде бы поняла, что эта функция записывает в перменную бит по указанному адресу, если так можно сказать.
Тогда, может быть, станет понятно, что строка
Нафиг не нужна. (и вообще заводить две переменные ByteSend1,2) - лишняя затея. Сразу в ByteSend устанавливается что вы там хотите.
Вот я и пытаюсь понять как это сделать. Как сформировать правильно.
И это.... почему они вдруг стали Long-гами? Причем передаем их в функцию которая принимает int?
Не кажется странным в имени переменной типа long использовать слово byte, а использовать ее как int?
Да, тут я проглядела. IDE не очень удобная, не всегда замечаешь мелочи.
Далее, thisLed у вас меняется от 0 до 16-ти... при этом вы делаете попытку устанавливать thisLed+16, то есть... что будет когда thisLed будет, скажем равень 16-ти. Пытаемся установить 32-й бит? У вас сколько светиков? Сколько бит отсылает registerWrite?
Ну я же писала что всего 4 регистра, соответственно 32 светика. thisLed+16 нужен для теста, чтобы задействовать вторую пару регистров независимо от первой - для удобства разделила на 2 пары.
Ну, во первых я могу только повториться: выясните что же делает функция bitWrite.
Про bitWrite я прочитала, и вроде бы поняла, что эта функция записывает в перменную бит по указанному адресу, если так можно сказать.
Ну ваша формулировка немного "расплывчата" (по крайней мере - я не могу понять ее однозначно).
Давайте посмотрим в доку: http://arduino.ua/ru/prog/BitWrite "Изменяет состояние указанного бита переменной"
Представте себе что у вас есть доска. С лунками. 32-штуки. В лунках лежат шарики. Черные и белые.
И есть "Вася" (bitWrite), который умеет делать только одну вещь: ты даешь ему шарик, и говоришь в какую лунку его нужно положить (а тот шарик который там лежит сейчас - Вася выкинет нафиг).
Предположим, что у нас сейчас во всех лунках - черные шарики (нули. ByteSend=0, означает "все биты в нулях").
Теперь мы хотим что-бы в 3-й и 17-й лунки были белые шарики? Что мы должны сделать?
Дать васе доску с луками (ByteSend), и дважды скомандовать "вот тебе белый шарик - положи в третью лунку", а потом сказать "вот тебе белый ширк - положи в 17-тую".
Все. Доска приняла нужный нам вид (проверяем это Serial.println(ByteSend,BIN), только не пугаемся помни что "лидирующие нули - показываться не будут". То есть число "00010" выведется как "10", нули впереди нужно додумывать. если вывелось короче чем ждали - значит впереди нуля))
И, что-бы именем переменной не вводить сумятицу, лучше обозвать ее "нейтрально", не привязывая к типа. Скажем DataToSend вместо, ByteSend. А если потом вспомнить, что переменные принято называть с маленькой буквы, то еще раз переименовать в dataToSend
Да, тут я проглядела. IDE не очень удобная, не всегда замечаешь мелочи.
Это, блин, не "мелочи". Неправильный подбор типов - один из основных источников "граблей".
И никакая IDE вам не подскажет, что вы тут взяли переменную long и передали ее в функцию принимающию int.
Откуда компилятору знать? Может вам именно и нужно "отбросить два лишних байта" и работать с оствшимися двумя?
В этом и сила/выразительность c/c++, с другой стороны и спрос с программера больше: тысяча и один способ "выстрелить себе в ногу".
Зато никаких ограничений :)
Так что привыкайте смотреть на тип КАЖДОЙ переменной, КАЖДОГО параметра.
Так что выбор long - он вполне корректный для четырех регистров.
Но, лично я, выбрал бы unsigned long, просто что-бы, при выводе serial.println(,DEC) - не видитеть отрицательных чисел. Но с точки зрения "работоспособности", long - тоже покатит.
Далее, thisLed у вас меняется от 0 до 16-ти... при этом вы делаете попытку устанавливать thisLed+16, то есть... что будет когда thisLed будет, скажем равень 16-ти. Пытаемся установить 32-й бит? У вас сколько светиков? Сколько бит отсылает registerWrite?
Ну я же писала что всего 4 регистра, соответственно 32 светика. thisLed+16
Код - тоже вы написали. А в нем я вижу int. А это два байта. 16-ть светиков. Два регистра.
И компилятор, кстати - тоже видит.
Два байты выбросил и .... "Два последних регистра совсем не задействованы".
Надеюсь, к этому моменту уже понятно "почему" и "что нужно исправить" :)
нужен для теста, чтобы задействовать вторую пару регистров независимо от первой - для удобства разделила на 2 пары.
Зачем разбивать на "две пары", что-бы потом учится их соединять? Можно, конечно, но.... почему бы просто два раза не вызвать bitWrite для одной и той же переменной?
Или, если вам рассуждать легче "парами".
Ну так не объединяйте их.
Сделайте registerWrite(int bitsToSend1,int bitsToSend2); (кстати, зачем нам параметр whichState, если мы больше его не используем?)
И пихайте прямо "парой". И свои register3,register4 извлекайте из одного bitsToSend, а register5,6 - из другого.
И да, обратите внимание, что вы вызываете
registerWrite(536813567
Фиксированное число. Всегда одно и тоже. ByteSend - вы выставляете, но потом - только в монитор его отправляете.
Кстати, если почитаете Целочисленные константы | Аппаратная платформа Arduino , то узнаете что можно было не переводить в десятичное на калькуляторе, а так и написать "как хочется": registerWrite(B11111111111110001111111111111, прямо в двоичном виде.
Ну и Serial.println() | Аппаратная платформа Arduino перечитать. Что-бы и знать как выводить в двоичном виде, и смотреть в мониторе, чтоже, в итоге, образуется в переменных ByteSend,bitsToSend, registerN
> leshak
> .....что переменные принято называть с маленькой буквы, то еще раз переименовать в dataToSend
извините, что влез с вопросом.... это наверное сишное соглашение, да ? ....а я-то все переменные луплю с большой :( , типа DataToSend :(
Это я примерно и имела ввиду, когда говорила про "записывает в перменную бит по указанному адресу". Только о чем я не подумала, так это о том, что можно несколько раз вызывать bitWrite и в одну переменную записывать разные значения.
И никакая IDE вам не подскажет, что вы тут взяли переменную long и передали ее в функцию принимающию int.
Я имела ввиду, что сам int маленький :)
Ну так не объединяйте их.
Сделайте registerWrite(int bitsToSend1,int bitsToSend2); (кстати, зачем нам параметр whichState, если мы больше его не используем?)
И пихайте прямо "парой". И свои register3,register4 извлекайте из одного bitsToSend, а register5,6 - из другого.
Я сейчас почти так же сделала, только не 2 параметра, а 4. Но это не совсем удобно, попробую сделать по вашему совету с 2 параметрами.
И да, обратите внимание, что вы вызываете
registerWrite(536813567
Фиксированное число. Всегда одно и тоже. ByteSend - вы выставляете, но потом - только в монитор его отправляете.
Это я проверяла, ка к это число будет работать. Но из за того что тип переменных был int, пример не сработал.
Спасибо за развернутый ответ, многое прояснилось.
> leshak
> .....что переменные принято называть с маленькой буквы, то еще раз переименовать в dataToSend
извините, что влез с вопросом.... это наверное сишное соглашение, да ? ....а я-то все переменные луплю с большой :( , типа DataToSend :(
Ну как бы "да". И название функций. И методы классов.
#define - ВСЕ_БОЛЬШИМИ_БУКВАМИ,
классы - только первая большая.
Вообще-то, конечно, все эти "соглашения", это именно "соглашения". Можно следовать, можно нет. Работать будет одинаково. Но если ты в этом вопросе "как большинство", то и тебе легче читать чужой код, и тебя понимать легче будут.
Там вообще, в этих соглашениях "много чего оговорено", но вот хотя-бы "базовое". Отступы вложенного кода, переменные с маленькой... IMHO самому от этого легче жить.
Классы - оне самые главные же :) - вот и с большой.... Да, конечно же, хочется на одном "говоре" говорить... а то миня уже несколько раз назвали дельфин-ом ( -истом )...
спасибо !
отступы вложенного кода - в С++ - какие нормы действуют ? подскажите ?
мине легче читать когда даже операторные скобки с новой строки и со сдвигом на 2 знакоместа..... но большинство здесь делает по другому.... КАК - не отследил ещё логику, некогда.... мине удобнее так :
for ( int i = 0; i < 16; i++ )
{
if ( ....... )
{
васяПоложиШарик( этаЛунка );
}
}
ступенчатая структура.... читать легчеееее ( моей ) :) ...почему открывающую операторную скобку БОЛЬШИНСТВО оставляет в строке начала блока ? экономия строк ?
спасибо :) ( моя уже и функцию правильно обозвал :)
> Там вообще, в этих соглашениях "много чего оговорено", но вот хотя-бы "базовое". Отступы вложенного кода, переменные с маленькой...
...там - это где ? кто хранитель соглашений ( где почитать ) ?
> Там вообще, в этих соглашениях "много чего оговорено", но вот хотя-бы "базовое". Отступы вложенного кода, переменные с маленькой...
...там - это где ? кто хранитель соглашений ( где почитать ) ?
Памятник Ленину видел? Вот он как раз показывает рукой где это ТАМ..
повторюсь - у миня дедушка Вова - только бюстик 1:2 :( - без ручек, ножек и тулобища :(
странно.... моя думал - хоть в ваших странах его нету.....
странно.... моя думал - хоть в ваших странах его нету.....
У нас еще есть памятник Тарасу Шевченко :)
на МСК площади СПб он указывает на КНИЖНЫЙ МАГАЗИН ! воооооооооо !
НО !!!!! с той точки Вова видется ПИСАЮЩИМ мальчиком.... причём - не хилым фонтаном....
> Там вообще, в этих соглашениях "много чего оговорено", но вот хотя-бы "базовое". Отступы вложенного кода, переменные с маленькой...
...там - это где ? кто хранитель соглашений ( где почитать ) ?
Это передается от старших к младшим..... :) Начинаешь где-то работать в команде, тебе просто берут и подсказывают (как я вам).
Ну в учебниках по программированию иногда попадается.
Да и гугл, думаю может что-нибудь подсказать по этому поводу...
А можно просто - смотреть чужой код. Примеры, библиотеки....
По поводу "сколько отступать скобочками...". Ну нет тут "единого мнения". Тут уже скорее в каждом сообществе/фирме свои "соглашения". Кто-то даже автоматические проверялки ставит. IDE посерьезней - тоже могут предупреждения кидать...
Вообщем оступать два пробела или один, или табом.... это уже как "дресс код". Где-то одна "рабочая форма" требуется, где-то другая. На каких-то фирмах строго следять за этим, на каких-то "плевать, лишь бы хоть какие-то были" (я тоже к ним отношусь), какие-то OpenSource проекты, могут вообще не принимать коммиты, пока их "идеально не оформишь".
Вообщем тут тоже, перебарщивать в "перфекционизм" imho не стоит. Главное что-бы читать легче было.
Если, по отступам,не можете принять "правильное решение", ну нажмите в ArduinoIDE ctrl-t. Она сама вам отформатит. Тут уж никто к вам "не придерется" :). Но я предпочитаю руками. В зависимости от "смысла кода". Вообщем отступы, это просто сделать его более "выпуклым". Мысль подчеркнуть, что к чему относится.
P.S. Я тоже, когда с Паскаля переходил, тоже бесился на эти скобочки, которые "фиг разглядишь". Вот насколько же виднее BEGIN END визуально.
P.S. А вообщем-то это все дело "привычки". Я вот постоянно пишу на C#. Там методы и проперти объекта - с большой. Тут - с маленькой. Ничего, как-то уже мозг приспособился "переключатся". Правда когда еще TypeScript добавился, иногда путаюсь "тип указывать после переменной или до" :( Но минут через 5-ть, все встает на свои места :)
странно.... моя думал - хоть в ваших странах его нету.....
Григорьевичу моя не против... классика....
странно.... моя думал - хоть в ваших странах его нету.....
Григорьевичу моя не против... классика....
И памятник Винипуху есть. Дисней замутил на родине Винипуха. Забавный кстати. Дерево на нем медвед с горшком меда.
Многие то не в курсе что Винипух был обычным медведем с обычного канадского леса :)
> А можно просто - смотреть чужой код. Примеры, библиотеки....
....этим и кормлюсь
> сделать его более "выпуклым"
...ступенчатым ( визуально ) - моя не спорит
....не буду так делать ! НО - можно ли приручить IDE к пониманию BEGIN-END , если пишешь только для сибя ?
странно.... моя думал - хоть в ваших странах его нету.....
Григорьевичу моя не против... классика....
Винни-Пух из Винни-Пега :) ? защитник бчёл чёли ?
странно.... моя думал - хоть в ваших странах его нету.....
Григорьевичу моя не против... классика....
Винни-Пух из Винни-Пега :) ? защитник бчёл чёли ?
Не Винипух не из Винипега. Он с маааааленькая деревни Вайт Ривер. На севере онтарио.
Puhlyaviy & leshak
вопрос не в тему... где грань между программным устранением дребезга контактов и аппаратным.... рожаю схему драйвера на 4 кнопки, к555тр2 и к555лн1, и 4 резистора на 10 kOm..... если не миниатюзируем устройство - что лучше ? применить платку 20 х 48 или программно бороцца ? спасибо :)
Буратина - итальянец ! Джанни Родари, стаканчик вина, кусочек сыра.... Маша - 5 !
Буратина - русский ! Лев Толстой, стаканчик воды, кусочек хлеба.... Коля - 4 !
и тут Вовочка
Буратина - таджик ! .....взял папа Карло чюрку........
вот обоснуйте - что Пух с Белой Реки....
......Карлсон - одномоторный дедушка квадрокоптеров ?
.....Красная Шапка - тоже из Онтарио ?
.....Заец и Волк ? и не предполагаю уж.....
Чего обосновывать то?
Ехали солдаты с Винипега на первую мировую. Подобрали медвежонка в белой речке. Привезли в Лондон, сдали в зоопарк. Дальше как обычно.
кататак.... учусь....
пойду в сети посмотрю....
Хряк-Пятак... тоже виннипеговец ? не довезли бы они его до зоопарка - сожрали бы...
поросёнок Фунтик - тоже ваш ?
воооооооооо, кстати - чё ПОРОСЁНОК ( он же фунт двигателей стирлинга ) просел-то так ? чёта мине тревожна.....
дети в СССР и РФ ( и др. стран ) как-то по другому думают :( , - не было бы им это душевной травмой......
пойду за пЫвом.... вроятность купить и попкорн - велика.... НО Россия - великая страна - хватит и полосатиков :)
пойду за пЫвом.... вроятность купить и попкорн - велика.... НО Россия - великая страна - хватит и полосатиков :)
Угу и устриц не забудь. Говорят в этом году в Белоруссии афигенные устрицы уродились.
честно говоря - преувеличили.... рынок создают просто... с тех пор как 6-ой флот США подошёл к берегам Белоруссии - белорусско-канадские жуки ( помесь ) погрызли днища кораблей и судов этого флота.... в неразберихе погибли и прибывшие с 6-ым флотом, и местные устрицы.... :( зато кортопли - ДО...ЕРА ! пора переходить на чипсы вам, или ваша экономика выстояла ? попкорновая ?
У нас своей картопли как грязи. половина картопли что потребляет макдональдс, растет и пеперабатывается с в радиусе пары сотен километров от моей деревни
....остальная масса - куды ?
ну вы и сказанули-оформили задачку.... про "...половина картопли что потребляет макдональдс..."
типа того - "отец того, кто на портрете - сын моего отца" - на портрете-то - КТО ?
....остальная масса - куды ?
Не куда, а откуда.
местные за заявление "километер" - не бъют ? там разве не "мили" ? или вы уже "местный" и внедряете метрическую систему ?
местные за заявление "километер" - не бъют ? там разве не "мили" ? или вы уже "местный" и внедряете метрическую систему ?
Странно но местные измеряют в километрах.
....остальная масса - куды ?
не морочьте мине сидалищный мозг !
если в деревне +200 т кортопля - это куды деть !
если в деревне -2 т кортопля - это откедова взять !
....вот так и путаюцца мозги...
Мозги начнут путаться когда посмотришь цифры.
Недалеко от деревни небольшой мясокомбинат, вот реально небольшой, его пешком можно обойти примерно минут за 5. На нем работает 1300 человек. За сутки они уколбашивают 6500 свиней. Представь обьемы выращивания.
местные за заявление "километер" - не бъют ? там разве не "мили" ? или вы уже "местный" и внедряете метрическую систему ?
пока Путин и Медведев думают над вычислением вашего местоположения.... точного....
и только после этого оне вам укажут-посоветают в чём измерять линейные, площадные, объёмные и другие параметры тел в любом представлении МИРА.... имеюцца рекомендации для МИРА-1D , 2D , 3D , 4D и т.д.
оно мине нано ?
из 1300 челов - скока там девчёночеков работает ?
Не знаю. Как то не интересовался. Не прет меня от филипинок.
> Представь обьемы выращивания......
.....представлять не буду... моя для интереса подсчитал и о......ел.....
мог бы и сразу сказать... :(
....как же ты там живёшь - без окучивания ? женитьба ? дык, ... пардон..... молчу....
Вот вот и афигел.