Arduino и к176ие8
- Войдите на сайт для отправки комментариев
Здравствуйте Ардуиноведы!
Разрабатывая одну из своих идей, я столкнулся с проблемой.
Есть такая до неприличия наша м/с к176ие8. Это ничто иное, как десятичный счетчик с дешифратором. Так вот скретил я этого зверя со своей тестовой Arduino Uno и мне очень понравился результат. Микросхема тактируется от дуины, сбрасывается тоже. Но вот проблема - как вывести с нее насчитанное значение? Можно, конечно, подключить ее к дуине напрямую, но тратить 10 выводов на одну м/с - более чем неприлично. Решил - подключить ее выводы через 10 резисторов от 1 до 10 КОм на аналоговый вывод дуины. И обнаружил такие неполадки:
1. Подключив 1-ю м/с ко входу А0 - получил значения от 276 до 65. - Где мои обещаные 1023 и прочие???
2. Подключив 2-ю м/с ко входу А1 С ТАКИМИ-ЖЕ резисторами - получил значения уже от 146 до 65 - в чем дело???
3. Погрешность значений - лежит в пределах "2", следовательно это и учел в коде, однако все-равно значения конфликтуют друг с другом.
Иными словами, прошу помощи, как мне реализовать получение значений с этих м/с? Может я что не учел?
Кстати А0 и А1 объявлены как
pinMode (A0, INPUT_PULLUP); pinMode (A1, INPUT_PULLUP);
Ну и напоследок - мой быдлокод.
int Counterpin = 13; int CtrResetpin = 12; int FirstAnalogPin = 0; int SecondAnalogPin = 1; int OutFirstResult = 0; int OutSecondResult = 0; int ConvertedFirstDigit = 0; int ConvertedSecondDigit = 0; int ResultedValue = 0; void setup() { pinMode(Counterpin, OUTPUT); pinMode(CtrResetpin, OUTPUT); pinMode (A0, INPUT_PULLUP); pinMode (A1, INPUT_PULLUP); //attachInterrupt(0, blink, RISING); // привязываем 0-е прерывание к функции blink(). Serial.begin(9600); digitalWrite(CtrResetpin, HIGH); Serial.println("Reset to HIGH"); delay(100); digitalWrite(CtrResetpin, LOW); Serial.println("Reset to LOW"); Serial.println("Counter Resetted"); } void loop() { digitalWrite(Counterpin, HIGH); //Serial.println("Switched to HIGH"); delay(50); digitalWrite(Counterpin, LOW); //Serial.println("Switched to LOW"); OutFirstResult = analogRead(FirstAnalogPin); // read the input pin OutSecondResult = analogRead(SecondAnalogPin); //Serial.println(OutSecondResult); // debug value //Serial.println(ValuesConverter(OutFirstResult)); //Serial.println(SecondDigitValuesConverter(OutSecondResult)); ResultedValue = (SecondDigitValuesConverter(OutSecondResult) * 10) + ValuesConverter(OutFirstResult); Serial.println(ResultedValue); delay(500); } int ValuesConverter(int ValToConvert) { /*This function converts Analog Values to real numbers, received from counter. Accuracy setted to about 2. And used a 10x 1 to 10 KOhm resistors.*/ if (ValToConvert >= 274 && ValToConvert <= 278) { return ConvertedFirstDigit = 0; } else if (ValToConvert >= 180 && ValToConvert <= 184) { return ConvertedFirstDigit = 1; } else if (ValToConvert >= 134 && ValToConvert <= 138) { return ConvertedFirstDigit = 2; } else if (ValToConvert >= 114 && ValToConvert <= 118) { return ConvertedFirstDigit = 3; } else if (ValToConvert >= 100 && ValToConvert <= 104) { return ConvertedFirstDigit = 4; } else if (ValToConvert >= 94 && ValToConvert <= 98) { return ConvertedFirstDigit = 5; } else if (ValToConvert >= 83 && ValToConvert <= 87) { return ConvertedFirstDigit = 6; } else if (ValToConvert >= 74 && ValToConvert <= 78) { return ConvertedFirstDigit = 7; } else if (ValToConvert >= 66 && ValToConvert <= 70) { return ConvertedFirstDigit = 8; } else if (ValToConvert >= 62 && ValToConvert <= 65) { return ConvertedFirstDigit = 9; } } int SecondDigitValuesConverter(int ValToConvert) { /*This function converts Analog Values to real numbers, received from counter. Accuracy setted to about 2. And used a 10x 1 to 10 KOhm resistors.*/ if (ValToConvert >= 144 && ValToConvert <= 148) { return ConvertedSecondDigit = 0; } else if (ValToConvert >= 91 && ValToConvert <= 95) { return ConvertedSecondDigit = 1; } else if (ValToConvert >= 136 && ValToConvert <= 140) { return ConvertedSecondDigit = 2; } else if (ValToConvert >= 60 && ValToConvert <= 64) { return ConvertedSecondDigit = 3; } else if (ValToConvert >= 103 && ValToConvert <= 107) { return ConvertedSecondDigit = 4; } else if (ValToConvert >= 97 && ValToConvert <= 101) { return ConvertedSecondDigit = 5; } else if (ValToConvert >= 84 && ValToConvert <= 88) { return ConvertedSecondDigit = 6; } else if (ValToConvert >= 76 && ValToConvert <= 80) { return ConvertedSecondDigit = 7; } else if (ValToConvert >= 71 && ValToConvert <= 75) { return ConvertedSecondDigit = 8; } else if (ValToConvert >= 62 && ValToConvert <= 67) { return ConvertedSecondDigit = 9; } }
Выводы микросхемы Q0-Q9 подключены к аналоговому пину через резисторы от 1 до 10 КОм.
Буду благодарен за помощь!
Буду благодарен за помощь!
Ни чё не понятно, на кой вам эта микросхема, ардуина и сама может дешифратором быть. Если ног не хватает, ну тогда зачем обратно считывать, вы же сами тактируете, значит должны знать в каком она состоянии. Или она пульсы пропускает, проскальзывает? Для синхронизации и одного вывода на вход ардуины достаточно, а потом считать такты и всё.
Не-не, Вы меня не поняли. Это не входы, а выходы микросхемы.
В общем - Q0-Q9 - это ВЫХОДЫ микросхемы. На них появляется высокий уровень в зависимости от текущего такта (десятичный счетчик).
CN - +5 вольт (по даташиту, если на CP подаем сигнал)
CP - сигнал такта (12 нога ардуины) (дергая эту ногу из HIGH в LOW мы инкримируем счетчик)
RST - сброс (13 нога ардуины) (дергая эту ногу из HIGH в LOW мы сбрасываем счетчик)
А вот Q0-Q9 - через них выводятся значения счетчика (от 0 до 9) и каждый Q вывод - соответствует своей цифре. Вот и вопрос - я вывожу сигналы с Q0-Q9 через резисторы с шагом в 1 КОм на ОДИН аналоговый вывод дуины. Но значения идут очень близкие друг к другу и почему они лежат не в пределе от 0 до 1023 а от 65 до 276?
Есть еще идея - использовать сдвиговый регистр, но, по моему, проще использовать десяток резисторов и просто интерпритировать значения.
Прикладываю "схему на коленке" и даташит на микру.
Даташит - https://lib.chipdip.ru/021/DOC001021132.pdf
ну, да - было бы понятно, если бы ие4-ю заюзал с семисегментным индикатором
Answer to: Волшебник - Дело том, что тактовка от дуины - это временное "тестовое" решение. В дальнейшей реализации проекта - дуина не будет тактировать микросхему, а будет просто каждую секунду читать значения с нее.
Просто будет датчик холла, тактирующий микру, дуина будет читать что в микре - каждую секунду и тут-же ее сбрасывать. Это мой вариант сказать "нет" прерываниям. Я стараюсь обходить их стороной.
какой в этом смысл, если дуино может это делать программно - унутре себя?
какой в этом смысл, если дуино может это делать программно - унутре себя?
Это Вы о чем? Что именно она может делать программно?
какой в этом смысл, если дуино может это делать программно - унутре себя?
Это Вы о чем? Что именно она может делать программно?
эмулировать ие8
Вопрос стоит не о том, зачем мне эта микра, и не о том, зачем ее читать дуиной, если она ее и тактирует, просто, ну... все представляют себе, допустим, тахометр. Если его делать на дуино, без прерываний это реализовать тяжко. Прерываний я избегаю как могу ибо считаю их не стабилным решением (особенно если имеются другие ресурсоемкие функции). Дак вот я и выношу задачу счета импульсов на эту микросхему, дуина-же просто будет ее читать и сбрасывать каждую секунду. (В идеале - пин 12 просто тест. Его нет в финальном релизе проекта). Вот и вопрос - Как считать с десяти ног этой микры значение - не затратя 10 ног ардуино? В голову пришла идея с резисторами - но что-то у меня идет не так.
На выводах Q0-Q9 еденица выставляется ТОЛЬКО на том пине, которвый соответствует насчитанному знаению, на осталных - ноль. То есть если в счетчике число 5 - то на Q0-Q4, Q6-Q9 - нули, а на Q5 - единица.
эмулировать ие8
ну я знаю - через прерывания, а подругому - незнаю:( Да меня вариант с хардварной ие8 - устраивает
В ваших словах нет логики, потому что считывать даже аналог Раз в секунду - это тоже прерывание хоть и програмное по таймеру. А если теоретически, то R2R ЦАП почитайте на гугле. Не понятно всё равно, почему раз в секунду, а если переполнится счётчик?
Как считать с десяти ног этой микры значение - не затратя 10 ног ардуино?
слушай, просто - иди в пень.
породил 10 пинов - читай их теперь
Просто одно дело в цикле считывать значение, через analogread и потом delay(1000) - отсюда и 1 секунда, а дугое дело attachinterrupt юзать. И счетчик не переполнится - там на этот случай второй будет стоять. Посмотрите в коде loop там можно увидеть о чем речь.
слушай, просто - иди в пень.
породил 10 пинов - читай их теперь
Да.. порой я не ищу легких путей
А вот насчет r2r да.. пожалуй надо покурить.
Резистор в последовательном включении не умеет "понижать" напряжение. Он ограничивает ток. Нужно второе плечо делителя, на которое АЦП никак не подходит.
Дак а внутренняя подтяжка у меня, получается, на что? Разве она этим не занимается?
Во-первых, оно на фиг не нужно, ардуина и сама всё посчитать может, о чем здесь неоднократно сказано.
во-вторых, ЦАП из 176 серии - никудышный. А на 5 вольтах и с теми номиналами, что на рисунке - и ещё хуже.
Да о ЦАПе сдесь речи и не идет. К176ие8 - это счетчик, а не цап. Цап у меня в ардуине. Мне просто надо полученный сигнал с одного из 10 пинов счетчика, обработать через аналоговый вход ардуины. Просто на счетчике 10 ног и на какой то одной появляется единица. Мне надо поймать единицу ардуиной и так, чтоб я понял откуда она пришла. И чтобы не тратить 10 цифровых пинов на ардуине, я подключил счетчик к одному аналоговому пину через резисторы от 1 до 10 КОм. Теперь, основываясь на значении цапа в ардуине, мне надо разграничить значеня, чтобы я мог уловить, какой пин на счетчике выдает единицу. Но значения очень близки друг к другу и если учитывать погрешность резисторов, то их трудно разграничить. Вот я и хочу спросить, как подключить 10 пинов счетчика к одному аналог. пину ардуины через резисторы и разграничить значения.
кто-то прекратит этот тупняк?
вместо кнопок - пины своего счётчика подключай
Вы сотворили именно ЦАП при помощи микросхемы. Нарисуйте эквивалентную схему делителя для каждого из 10 состояний и посчитайте напряжение на делителе. Например, для Q0 в делителе напряжения верхнее плечо = R0, а нижнее 1/R_Oters=1/R1+1/R2+1/R3+1/R4+ ... +1/R9 (R0 верхнее сопротивление на вашей схеме, а R9 нижнее). Не знаю какие коэффиценты и падения напряжений получатся для таких номиналов, но за счет разброса значений резисторов из разных партий можно попясть в неприятную историю когда не сможете различить два соседних значения 9 и 10.
Если не намерены идти простым путем и считать импульсы по прерыванию и намерены мучить резисторный ЦАП и АЦП Ардуины, то есть способ сделать ЦАП точнее - использовать делитель типа "R/2R". Он принципиально хорош тем, что в нем можно применить одинаковые по номиналу резисторы из одной партии.
2R составляется из двух последовательных R+R или наоборот R*(1/2) составляется из двух параллелно соединенных R. Какая бы ни была относительная ошибка, а она внутри одной технологической партии одинакова и напряжения на входе АЦП будут определяться делителем степени двойки от питающего, его же (питающее делитель) подайте как опорное на AREF. Для верхнего разряда напряжение на выходе "R/2R" будет равно1/2, для следующих 1/4, 1/8, 1/16,1/32 и тд от питания.
http://arduino.ru/forum/apparatnye-voprosy/tsap-na-rezistorakh
http://arduino.ru/forum/proekty/vspomnim-molodost-covox-r-2r
На выводах Q0-Q9 еденица выставляется ТОЛЬКО на том пине, которвый соответствует насчитанному знаению, на осталных - ноль. То есть если в счетчике число 5 - то на Q0-Q4, Q6-Q9 - нули, а на Q5 - единица.
Диагноз: R/2R (он же R-2R) и резисторы строго одного номинала из одной партии. Для термокомпенсации все они должны быть при одной температуре :-(((((((((((((( , а так не бывает ...
Желатольно прочитать, что такое цифро-аналоговый преобразователь и что - аналого-цифровой. И что во что они преобразуют.
кто-то прекратит этот тупняк?
вместо кнопок - пины своего счётчика подключай
Боюсь, еще хуже будет. Фактически у ТС получается, что 9 выходов замыкают на "землю", а один единственный пытается их побороть. Отсюда похоже и такой узкий диапазон в его схеме.
Боюсь, еще хуже будет. Фактически у ТС получается, что 9 выходов замыкают на "землю", а один единственный пытается их побороть. Отсюда похоже и такой узкий диапазон в его схеме.
пусть ставит ещё два корпуса инвентора
кто-то прекратит этот тупняк?
вместо кнопок - пины своего счётчика подключай
Щаззз...
Там не кнопки (т.е. или полный разрыв, или миллиомы), а немолодая (164/176 серии больше 40 лет) микросхема. У нее на 9 выходах постоянно весьма проблематичные нули, а на одном - столь же проблематичная единичка, заметно далекие от питания и нуля, с достаточно ощутимыми ненормированными выходными сопротивлениями. Так что схема выглядит несколько иначе...
Поставьте резистор 1 кОм на землю, а лучше еще меньше ( в пределах разумного чтобы не спалить выход ИЕ8, который в "1") и все заработает. Еше лучший результат будет, если последовательно с резисторами воткнуть диоды, они исключат влияние выходов в "0".
Извиняюсь, при Ваших номиналах спалить ничего невозможно, смело ставьте со входа А0 на землю резистор ом 10 и соотношение показаний АЦП будет почти правильным, если значение "1" у ИЕ8 одинаковые.
Ух наконец-то пошло по делу. Пробовал ставить рез на 10К и на 1К на землю - результат тотже. Вот что схема нарисована мне как раз недавно она в голову и пришла. Буду пытаться.
Я Вам посоветовал поставить на входе дуни резистор 10 Ом, но есть один нюанс - если вход случайно переключится как выход и выдаст "1", то 10 Ом это не очень хорошо. Лучше перестраховаться и вход подключить к делителю через резистор в 1 кОм. На работе АЦП это никак не скажется, а в нештатной ситуации спасет Дуню.
Закон Ома суров, но справедлив.
Andrey_Ryzhov, вы понимаете, что то, что вы задумали -это величайшее извращение? Удивляет, что до сих пор Вам никто этого не сказал. Всегда все счётчики делают на прерываниях, это стандарт. Если у вас какие-то проблемы, то опишите их. Можно и без прерываний если что, -16-разрядный счётчик с тактовым входом встроен в МК. На нём ещё проще. Достаточно подать импульсы на его тактовый вход, и из счётного регистра забирать данные -две строчки кода всего!!!
Это если просто нужно посчитать количество импульсов, а если нужно посмотреть, что там насчитал ИЕ8 в соседнем девайсе, используя минимум проводов, то это уже и не извращение, а обычная задача.
Это если просто нужно посчитать количество импульсов, а если нужно посмотреть, что там насчитал ИЕ8 в соседнем девайсе, используя минимум проводов, то это уже и не извращение, а обычная задача.
ок. и насколько актуально будет это посмотреть без прерываний?
Просто любопытно, сколько там за минуту накапало?
Просто любопытно, сколько там за минуту накапало?
за минуту 0, за минуту и одну секунду - 100500 - какой смысл в этом смотрении?
А если просто статистика?
Все равно не понятно, не говоря о самой идее, то зачем с десятичным дешифратором, а не обычный счетчик с шестнадцатеричным выходом? Хочешь их в МК воткни, хочешь резисторную матрицу сочиняй. Да и работа 176 серии на 5 вольтах, возможно таит в себе неприятные открытия.
В результате запросто можно получить ХЗ.
В общем - Забил на эту затею, ибо и правда - колхозинг тот еще. Посмотрел в сторону прерываний по таймеру. Работаю с этим вариантом.
-------
Спасибо пользователю dimax, за затею с таймером. Как-то не догадывался прежде. Просто вбил в голову идею и... начал ее развивать.
Немного оффтопный вопрос, но связанный с моим проектом. Купил тут на Али ЖКИ с I2C и такая проблема - отмирают пиксели на нем. При первом включении - вылетело 2 столбца а потом - заметил что они там отмирают все больше и больше. На что грешить? Качество дисплея (по скидке брал), или на питание или на I2C модуль? Просто если это дисплей такой, то я могу подороже купить, но если не в нем проблема, то я уж и незнаю. Подключал как положено, 5в не более. С выхода 5в Ардуины.
Попробуйте понадавливать по широким кромкам окна. Там токопроводящие резинки, если пиксели начнут исчезать - появляться: протянуть держатели или лучше сразу снять рамку и стекло, промыть все контактные поверхности и снова аккуратно собрать.
Спасибо. Попробую.