Attiny85(Digispart) & analogReference
- Войдите на сайт для отправки комментариев
Вс, 31/12/2017 - 03:25
Всем привет!
У кого-то работает сабж? Что ни ставь в параметрах функции- все равно Ref=1.1, хоть ты в setup'е регистрами балуйся-эффекта 0. Сам(или кто там?) создатель замечательную заглушку выставил на функцию:
// can't actually set the register here because the default setting
// will connect AVCC and the AREF pin, which would cause a short if
// there's something connected to AREF.
// fix? Validate the mode?
...и чего делать?
Сталкивался ли кто с такой бедой? А главное, как забороть, выставив Vref на Vcc?
Сразу говорю, что ADMUX |= (0<<7)|(0<<6)|(0<<4); не прокатывает почему-то :(
.....
Может потому что компилятор (0<<7)|(0<<6)|(0<<4) просто выбрасывает?
а так?
ADMUX &= 0x1F;
А какой глубокий смысл Вы вкладываете в эту глубокомысленную конструкцию? Что она по Вашему должна делать?
По мне, так он не делает ничего и полностью эквивалента тому, как не писать ничего вовсе.
а так?
ADMUX &= 0x1F;
Скорее ADMUX &= 0x2F;
а так?
ADMUX &= 0x1F;
Скорее ADMUX &= 0x2F;
0х3F ещё больше!
Не, 0x3F это (0<<7)|(0<<6) :-)
Попробовал все предложенные варианты- ни один не дал эффекта, все так же ref=1.1. Евгений, в ADMUX |= (0<<7)|(0<<6)|(0<<4), конечно, нужно знак поставить &,ошибся я, действительно. Сама по себе мысль была принудительно в Setupе выставить ref=Vcc:
Набросал простецкую схему в Протеусе с этим контроллером, подсовывал скомпилированный файл - эффект постоянный, отрицательный :( Можете проверить, кста. Писал и компилил все в Ардуино ИДЕ, если что.
Не, 0x3F это (0<<7)|(0<<6) :-)
Точно, это я как-то не подумал.
Евгений, в ADMUX |= (0<<7)|(0<<6)|(0<<4), конечно, нужно знак поставить &,ошибся я, действительно.
Т.е. Вы считаете, что надо ADMUX &= (0<<7)|(0<<6)|(0<<4) ?
Боюсь Вас огорчить, но то, что получилось полностью эквивалентно ADMUX = 0.
Боюсь, что с такими знаниями битовых операций, Вы долго будете конфигурировать ADC.
ОК, справедливо, я ставил ADMUX&=0x2F, результат тот же, и я даже узнал, почему: в analogread, с бодуна писателя, переконфигурация ADMUX происходит при каждом считывании! Более того, я так понял, что Digispark подменяет фирменный wiring_analog.c на свой, и там почему-то :
а в Arduino
Вот Евгений, скажите на милость, что именно и где поправить, чтобы получилось хорошо? Мнения других само собой приветствуются!
Ничего не нужно править. Нужно пользоваться функцией analogReference().
я даже узнал, почему: в analogread, с бодуна писателя, переконфигурация ADMUX происходит при каждом считывании!
Неужели узнал????
Вообще-то в стартовом сообщении топика, ты сам процитировал комментарий в котором написано что это сделано. Там даже написано почему (с какого именно бодуна) это сделано.
Сколько ж тебе понадобилось сил и времени, чтобы узнать то, что было написано в твоём же собственном посте?
Или ты уже наотмечался по самое не могу с утра? :)))))))))))
Евгений, теоретические рассуждения- отлично, вот только у меня на практике не работает, потому и завел топик. Посмотрите этот долбаный analogReference() - там тупо заглушка с переопределением переменной. Как проверить- я написал.
Ворота, я как-то, как и многие тут, не лезу без особой нужды вглубь функций, написанных умными людьми специально для таких как я, чтобы просто вставить и пользоваться. И я вот не вижу разницы- устанавливать режим Ref отдельной функцией или во время исполнения analogRead. Может надо где-то поправить таки, но где? Не работает оно на тини85.
Да, чтобы долго не ходить вокруг да около, публикую прогу и проект в Протеусе- может тогда что-то сдвинется с места тут.
Посмотрите этот долбаный analogReference() - там тупо заглушка с переопределением переменной.
Да, я то смотрел, это Вы, похоже нифига там не увидели.
Там назначается значение перемнной analog_reference, а потом именно эта переменная и используется для инициализации ADC в analogRead - всё пучком.
Не работает оно на тини85.
У всех, кроме Вас, работает. Программу Вашу мы не видели. Ваша репутация как программиста, после нескольких попыток биты взвести, уж извините, невысока, так что ... полагаю, проблема в Вашей программе.
публикую
Хотите. чтобы на неё посмотрели - публикуйте здесь (только по правилам форума). Лезть куда-то наружу я не хочу.
Мой протуст такого расширения файла не понимает.
.ino сейчас посмотрю.
Какие фьюзы стоят? Вы знаете чтоэто такое и можете ответить?
Если не знаете и не можете, то хотя бы так - Вы понимаете, что Вы пытаетесь читать с пина Reset? И что это невозможно без правильно выставленных фьюзов? А если Вы их правильно выставите, то Вы потеряете возможность прошивать Ваш контроллер иначе как высоковольтным программаторм (он у Вас есть?).
Мало представляю себе, как тут выложить проект протеуса, поэтому то и внешняя ссылка. Далее отностиельно пинов- все корректно, это не ардуина, это дигиспарк, на всякий. Там все по-другому, в том числе и аналоговые пины. Про фьюзы ничего не знаю, из ардуино IDE шью, нормально все всегда.В смысле знаю, что это, но не заморачивался.
Ни хрена с пинами не корректно. Дело не в Ардуине и не в спарке. Дело в микроконтроллере ATtimy85. Пин PB5 - это Reset. Чтобы им пользоваться надо специальным образом конфигурировать фьюзы. Но тогда нужно иметь дорогой высоковольтный программатор.
Если слова "фьюзы" и "высоковольтный программатор" для Вам пустой звук, то забейте, просто считайте, что этого пина у Вас нет - им нельзя пользоваться.
Если бы Вы сразу опубликовали код, Вам бы это (про то, что пин PB5 так нагло использовать нельзя) сказали бы сразу. Имейте это в виду в будущем – всегда публикуйте код
Теперь несколько замечаний по тексту программы. Вы не просили, но считайте это подарком к празднику.
Строка 11.
Строка 17. Она не нужна. А в некоторых случаях может оказаться и вредной. Не надо инициализировать аналоговые входы как цифровые. Убирайте.
Строка 26. Переменная val используется только в функции loop, так нафига Вы её определили глобально в строке 7? Строку 7 удаляйте, а в строке 26 пишите
У Вас же есть свободные пины. Пользуйтесь ими. Про PB5 забудьте!
Я нигде не говорил, что программатор и фьюзы для меня пустой звук, просто это к теме не относится. Насчет пинов- а где про порт 0 написано то, что вы утверждаете? Я увидел "RESET: External Reset input is active low and enabled by unprogramming (“1”) the RSTDISBL Fuse. Pullup is activated and output driver and digital input are deactivated when the pin is used as the RESET pin." Мне, судя по описанию, ничего не надо делать с ним.
Да и какой- бы я пин не поставил- результат тот же самый, я проверял на трех, уже не помню каких. Ваши замечания по коду правильны, спасибо, но опять же, к теме не относятся, на работу программы, как таковой не влияют, это черновая прикидка, поэтому там мусор местами.
на мой взгляд, тут несовпадение с даташитом в core_adc.h:
Я нигде не говорил, что программатор и фьюзы для меня пустой звук,
А как же пост №16?
Про фьюзы ничего не знаю
Далее
Я утверждаю про PB5, который у Вас на схеме. Про порт 0 я не утверждал ничего. А написано - так вот у Вас же и написано.
Тут и про пин, и про фьюз RSTDISBL. Вы понимаете, что здесь написано? Если нет, я уже говорил, забейте и считайте, что этого пина у Вас нет.
Вы, похоже, не верите мне, ну это дело Ваше, доказывать я Вам ничего не собираюсь.
А вот в это
я не верю.
Хотя, может и так, я ведь не знаю, что Вы понимаете под результатом - откуда Вы знаете, что там реф = 1,1
Мужик, ты кончай тупить, тебе дело говорят.
Вот читай, по-русски, если по аглицки не умеешь: "Начнем с первого пина (PIN 1): он в ATtiny85 используется для необходимого при прошивке сигнала Reset и при переносе кода его не стоит использовать. Если этого не удалось избежать, то приготовьтесь пользоваться сложным высоковольтным программатором" (https://voltiq.ru/digispark-attiny85-review/).
Что до остальных пинов, тебя тут уже спрашивали, как ты настраивал фьюзы в протеусе? Если никак, то по умолчанию, она (85-ая)работает на частоте 1МГц, а нормальный дигиспарк на какой? На 16МГц. Вот твоя программа и считает, что там частота 16, а на самом деле 1. Там до хрена чего может не работать.
А вообще, ты когда хочешь спросить пруфы, ты на людей смотри. Тут на форуме есть несколько спецов (и тебе помогал один из них), у которых лично я пруфы не спрашиваю, а считаю пруфом то, что они сказали.
Евгений, это не вопрос веры. Есть протеус, в нем модель А85, компилятор для ардуины тоже имеетя, так ведь? Или все то, что было написано выше- лишь теоретические рассуждения обо мне и представления, как оно должно быть? Так и у меня такие представления были, я сюда после шока и пошел. Если у вас получится другой результат, я вас запытаю о том, как это получилось и на телефон(сберкарту) несколько денег накину. Я подключал переменник к разным портам, +5 и gnd на крайние ножки, отвод- на пин (это чтобы не сомневались, что я не в реостатном включении резистор использовал :))- результат свечения светодиода на плате и показания вольтметра я игнорировать никак не могу. Схемотехнично этот весь вопрос обойти можно, изменив параметры ФНЧ, но это не очень меня устраивает по некоторым причинам.
З.Ы. Тренд такой что ли, считать окружающих идиотами, но если представить мнение обо мне иначе, двинемся к решению быстрее, имхо.
З.З.Ы Ворота, на зоне на людей смотри. Пишешь какую-то хрень, про частоты, куда смотреть,пруфы и тупость. Перечитай мои каменты и свои, сравни и сделай вывод о своей адекватности.
С НОВЫМ ГОДОМ!!11 всех в этом чатике :)
mal333, после схемы, использующей reset в сообщении #16 и про "фьюзы ничего не знаю" я бы про адекватность людей не ругал.
Да и порт у 85-й всего один, если не в курсе.
Ничего личного, only взгляд со стороны...
OlegK, так же в сообщениях я писал, что эффект не меняется при смене канала АЦП, а так же чуть далее, в том же каменте про "фьюзы ничего не знаю" - "В смысле знаю, что это, но не заморачивался". Надо где-то их выставлять для Arduino IDE? :) Что, если терминология несколько отличаетсяот общепринятой, то все фактические рассуждения можно уже отметать? Про Reset таки читали в первоисточнике, или просто "этого не может быть, КГ/АМ" потому что у вас такая картина мира? Я понимаю, возможно все, что я описывал кажется какой-то хренью из-за некоторых неточностей, за это прошу прощения у аудитории. Но,блин, у меня на руках факт, что дигиспарк не программируется на Ref, отличный от 1.1В, и он проверен практической схемой и симуляцией в протеусе, и не зависит от канала АЦП, который я менял в программе.
Хех, я нашел, в чем дело :)) Никуда глубоко не надо лезть, все видно даже в моем коде, где там ошибка :) Интригу может разрулить каждый из вас, а полагаю.
Первому, кто тут отпишется о причине-200р на ЯД/Сбер/телефон :)
И что, АЦП заработал на пине Reset c фьзами по умолчанию? Давайте лучше я Вам вышлю :)
Евгений, собрал,проверил и вот какой результат: сам по себе канал ADC0 работает, но при уровне входного напряжения < лог."1" контроллер уходит в перезагруз, как, собственно и должно быть. Так что тут скорее ничья в нашем споре :)
С Вами кто-то спорил? Вы ошиблись, возможно Вы с кем-то и "спорили", но я с Вами - нет, ибо спорить тут абсолютно не очем. Просто решил помочь и объяснил, что этим пином пользоваться нельзя. И уже пожалел об этом. Вы всё равно ничего не поняли, только "поспорили". Кто людям помогает, тот тратит время зря. Так что впредь "спорьте" с кем-нибудь другим.
Евгений, вы чувак крутой, судя по темам на этом форуме, но очень уж обидчивы и придираетесь к словам. За вашу помощь спасибо, вы не остались к теме равнодушным, и может даже поэтому я таки смог найти ошибку сам. Видя ваши знания в устройстве МК и языка С, я(да и, как и все тут вопрошающие) ожидал увидеть здесь реальную помощь в любом виде, но получил вместо этого обсуждение меня, где я слегка ошибся или назвал что-то немного по-другому. Такое ощущение, что на этом форуме знатокам сильно не хватает ЧСВ и они тешат себя принижением остальных участников. Самое забавное, что на ошибку так никто и не смог указать, все потрепались, показали, что они круты, выставили меня идиотом и обиделись :)) Детский сад, штаны на лямках.
Ой! Жалко, что ты, родное сердце, мне вчера не попался. Женя "взял огонь на себя".
Где у тебя ошибки - их две: первая в ДНК, а вторая не твоя...
1. Ты сдвигаешь 0! (0<<6) и все подобное в начале темы, тупой или тролль?
2. Ты используешь РЕСЕТ пин, и еще лезешь в дискуссию с людьми, которые собаку сьели без соли на этих платах.
3. ты, не моргнув глазом, пишешь в analogWrite() числа, большие 255. Ты хоть учебник для даунов, типа видео "от Блума", смотрел?
------------
И теперь, недоросль, ты учишь, как тебе нужно было помогать! Совсем берега попутал!
Форум, НЕ ДЛЯ ПОМОЩИ, мля! Форум, он для общения по интересам. Понимаешь? - по интересам. То есть нужно быть интересным для других.
Вот на кой хрен ты, с тупостью заваренной на апломбе, тут нужен? Рассказать мне про мое ЧСВ? О вей'з мир! И что бы я без тебя делал?!
---
Ты в самом деле не понимаешь, что задавая почти любой вопрос на форуме, ты себя унижаешь? Если ответ можно найти САМОМУ - в гугле, вики, видеоуроках или даташите, то ты выставляешь себя тупьем или, еще хуже - ленивым уродом.
На форуме - обсуждают идеи, дискутируют о вариантах решений, сообщают о найденных любопытных темах, касающихся нашего хобби.
Да, и вопросы тоже задают, но те, которые стоит обсудить, а не те, которые уже обсосаны до костей и густо унавожены в любом поисковике.
Еще раз - форум - это, мля, не справочная и не армия спасения.
====================
Теперь еще раз по теме твоего вопроса:
Всегда, нет, запомни четко и крепко: ВСЕГДА, когда тебе кажется, что есть ошибка в ИДЕ, библиотеке, компиляторе, стандарте языка, работе микроконтроллера (или тексте Торы ;) ) - тебе кажется НЕ ПРАВИЛЬНО ! Ищи ошибку у себя. Исключения из этого правила - ничтожны и вряд ли встретятся на твоем жизненном пути.
Мужик, ты и впрямь думаешь, что никто не заметил того, что ты про маппинг забыл? Дурачёк, тебе пытались объяснить гораздо более глобальную ошибку про ресет, но ты оказался умнее всех и всех переспорил. Молодец! Оставайся идиотом, пользуйся ресетом и учи всех как тебе помогать!
Итак, настало время подведения итогов. На самом деле моя ошибка состояла в том, что я использовал digitalWrite() c параметром для Digispark (Attiny85) больше 255, а это неверно. т.е. диапазон измерений уменьшился в 4 раза и получалось максимальное значение как раз около 1.1 в, точнее при измерении где-то 1.2в. Вот я и сделал неверный вывод, что это Ref у меня не меняется. :)Но самый прикол, что analogRead() возвращает 10-ти битовое значение, т.е. я подумал, что раз разрешение АЦП 10 бит, то и ШИМ 10 бит, как у контроллеров на Ат328 и иже с ними. Вообще с библами, на мой взгляд какая-то ерунда с разрядностью аргументов аналоговых функций: для 328- это 10/10(АЦП/ШИМ), для Attiny - 10/8. Казалось бы, высокоуровневые языки на то и нужны, чтобы абстрагироваться от железа, но это не тот случай, видимо.
Разборка темы выглядит так: мне посоветовали
что как бы должно было решить проблему,т.к. я накосячил с битшифтом. Но оказалось, что на самом деле это ничего не решает,т.к. в библе analogWrite() все равно это каждый раз херется на и устанавливается в соответствии с ф-цией AnalogReference(). Самое интерессное, что когда советовали никто об этом не знал. Забавно- корифеи, и не знали. Ладно, бывает. И тут включается у некоторых говномет- вместо того, чтобы указать на явный мой косяк с analogWrite(). Далее кто-то советует обратить внимание на частоты эмуляции, как будто это как-то повлияет на результат(компетентные школяры подтянулись, ага), а так же на то, что юзается пин Reset, а не какой другой. На мою ремарку, что эта хрень не зависит от пина никто не реагирует, все видят только схему, что я выставил, текст никто не читает. Подключается тема высоковольтного программатора и факта обладания им, хотя к теме вопроса это никак не относится, я об этом не спрашивал и никак не акцентировал внимания. Быть может, мне это было не существенно, но порутчика было уже не остановить :) Далее посыпались каменты об уважухи, частных взглядах на цели образования форума и оскорблениях меня как недоумка, ибо видео не смотрел, к когорте избранных не подлизался и вообще мимо проходил. ЕвгенийП обиделся на слово "спор" и ушел в игнор, как признанный тут гений, вынужденный общаться с чернью:) Не, его право, он сделал то, что мог, наверное он замечательный чел, ему еще раз благодарность за внимание к вопросу.
Теперь о говнах. Не я первый начал, так что извиняйте, если кого брызгами заденет.
wdrakula, убогий школота ты наш местный! А не запахнуть ли тебе свой поганый ротик и задуматься о своей генной чистоте, а то как то изо рта у тебя говнецом несет,аж сюда выплескивает, может папа и не твой вовсе, а бомжара из подвала? Но кинь координаты, куда перечислить- все же первый на вопрос ты ответил первый.
Ворота, да, никто не заметил. Заметили бы- так бы и сказали. И это сделал бы ты, если бы об этом знал. Но ты начал с говномета и пацанских рассуждений, так что пересмотри свой уровень компетентности, завышен как бы, по факту.
Маладца! Всё верно расписал. А теперь иди
на херс ресета сигналы читать.Так читаются же, умник. Выше логлевел 1 даташита читаются. Забавно, но ты так и не прочел все мои каменты по этому поводу, а так же прямые указания создателей по этому поводу. Вот только я мог ошибаться,я не профи, а ты крутышка, этого не знал а значит некомпетентен. Пиши digitalWrite в проектах, ослолюб.
Так читаются же
Так я и говорю, иди, читай.
Выше логлевел 1
Выше чего? Давненько такого феерического дятла тут не было!
Мужики, берегите его, завтра он нас научит и с Gnd читать, главное, чтобы сигнал выше, чем HIGH был.
Ты в шаге от взятия приза на самого тупого. Рефы не читал, но осуждаю-твой девиз. Попробую еще раз донести до тебя простую истину: выше уровня лог.1,т.е. выше 2.1 В вполне возможно читать по ADC0, и это будут действительные значения. Попробуй не только тут херню писать, но и в симуляторе хотя бы сэмулировать. Ну а то, что я писал, что шляпа с моим кодом наблюдается и на других каналах ADC ты, как обычно, игнорируй. Тыж погромист-школяр, тебе можно.
т.е. я подумал, что раз разрешение АЦП 10 бит, то и ШИМ 10 бит, как у контроллеров на Ат328 и иже с ними. Вообще с библами, на мой взгляд какая-то ерунда с разрядностью аргументов аналоговых функций: для 328- это 10/10(АЦП/ШИМ), для Attiny - 10/8.
Ой! Это так прекрасно, что ничего комментирвать не нужно. Я только жирным выделил. ;)
Иди уже в сантехники, инвалид, а лучше в дворники - вреда меньше принесешь.
От жеж дрэг ...мит фефэр!
Да, ладно, Влад, давайте оставим дурачка в покое, его и так Господь обидел - создал идиотом. Ему бы посочувствовать, а не гнобить.
Абидна однако. Мужики то про аналог рид то не знали. И когда надо admux напрямую без него пользовали и всё работало. А с ним не работает. Пичалька....
Добрый день!
Сразу хочу сказать, что полный нуб.
Потребовалось измерить напряжение питания (Li-Ion 2S) с помощью Digispark.
Правильно ли я понимаю, что мне необходимо с помощью делителя привести измеряемое напряжение к менее чем 1,1В при полностью заряженной батарее?
Верно ли я понимаю как с этим всем работать?
Заранее благодарен за ответы.
точность 10% устраивает?
Строка №12 не нужна от слова "нафиг".
64 результата analogRead в val может не поместиться.
Что за усреднение такое, суммировали 64 члена, а делите на 16?
В строке №16 первое деление целоичсленное. Замените 16 на 16.0. Впрочем, там по-любому бред в этой строке. Подумайте как переводить поугаев в вольты.
Неизвестно, чем был занят пин P2 до измерений, поэтому строка #12 переводит его в режим аналогового входа.
Как я понимаю, val принимает значения от 0 до 1023, которые для перевода в вольты надо умножить на 1,1В. После этого усредняем - делим на 64. Но 1024/64=16. Поэтому я и делю на 16. В принципе, согласен, усреднение можно упразднить.
А, ну да, я тупой, 1024, наверное, на 64 умножить надо... И делить не на 16 тогда, а на 65536.0...
То есть вот так
будет правильно?
Прекратите нести отсебятину. Такого режима нет в природе. Вам сказали, что эта строка нафиг не нужна, значит - нафиг не нужна.
Программа Ваша? Что-то Вы её неправильно понимаете. В val Вы накапливаете сумму из 64 значений, каждое из которых может быть от 0 до 1023. Стало быть макисмально val может стать 65472. Такое числе в неё просто не поместится! Там больше, чем 32767 не помещается.
С первым согласен, насчёт второго - думайте ещё.
То есть вот так
будет правильно?
Блин, ну Вы ж сами говорите. что максимально может быть 1023. А делите на что?
От 0 до 1023 включительно (включая 0 и 1023) ведь 1024 значения (0, 1, 2, ..., 1021, 1022, 1023)? И 10 измерений. И диапазон 1.1В. То есть мы находим 1/1024 от aref (1.1В), умножаем её на val (сумму всех 10 отсчётов) и делим на количество отсчётов (10).
Хорошо, пусть напряжение равно в точности 1.1 Что при этом вернёт analogRead? И что Вы получите своим расчётом?