Attiny85(Digispart) & analogReference

mal333
Offline
Зарегистрирован: 23.04.2014

Всем привет!

У кого-то работает сабж? Что ни ставь в параметрах функции- все равно 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); не прокатывает почему-то :(
nik182
Offline
Зарегистрирован: 04.05.2015

mal333 пишет:

.....

Сразу говорю, что ADMUX |= (0<<7)|(0<<6)|(0<<4); не прокатывает почему-то :(

Может потому что компилятор  (0<<7)|(0<<6)|(0<<4) просто выбрасывает? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а так?

ADMUX &= 0x1F; 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mal333 пишет:
ADMUX |= (0<<7)|(0<<6)|(0<<4); не прокатывает почему-то :(

А какой глубокий смысл Вы вкладываете в эту глубокомысленную конструкцию? Что она по Вашему должна делать?

По мне, так он не делает ничего и полностью эквивалента тому, как не писать ничего вовсе.

nik182
Offline
Зарегистрирован: 04.05.2015

DetSimen пишет:

а так?

ADMUX &= 0x1F; 

Скорее ADMUX &= 0x2F;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nik182 пишет:

DetSimen пишет:

а так?

ADMUX &= 0x1F; 

Скорее ADMUX &= 0x2F;

0х3F ещё больше!

nik182
Offline
Зарегистрирован: 04.05.2015

Не, 0x3F это (0<<7)|(0<<6) :-)

mal333
Offline
Зарегистрирован: 23.04.2014

Попробовал все предложенные варианты- ни один не дал эффекта, все так же ref=1.1. Евгений, в ADMUX |= (0<<7)|(0<<6)|(0<<4), конечно, нужно знак поставить &,ошибся я, действительно. Сама по себе мысль была принудительно в Setupе выставить ref=Vcc:

Table 19-3. Voltage Reference Selections for ADC
REFS2 REFS1 REFS0 Voltage Reference (V REF ) Selection
X 0 0 VCC used as Voltage Reference, disconnected from PB0 (AREF).
X 0 1External Voltage Reference at PB0 (AREF) pin, Internal VoltageReference turned off.
0 1 0 Internal 1.1V Voltage Reference.
0 1 1 Reserved
1 1 0 Internal 2.56V Voltage Reference without external bypass
capacitor, disconnected from PB0 (AREF) (1) .
1 1 1
Internal 2.56V Voltage Reference with external bypass capacitor at
PB0 (AREF) pin (1) .
 
ADMUX – ADC Multiplexer Selection Register
• Bit 7:6,4 – REFS2:REFS0: Voltage Reference Selection Bits
These bits select the voltage reference (V REF ) for the ADC, as shown in Table 19-3. If these bits
are changed during a conversion, the change will not go in effect until this conversion is
complete (ADIF in ADCSR is set). Whenever these bits are changed, the next conversion will
take 25 ADC clock cycles. {..}
Bit 7 6 5 4 3 2 1 0
0x07 REFS1 REFS0 ADLAR REFS2 MUX3 MUX2 MUX1 MUX0 ADMUX
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 

Набросал простецкую схему в Протеусе с этим контроллером, подсовывал скомпилированный файл - эффект постоянный, отрицательный :( Можете проверить, кста. Писал и компилил все в Ардуино ИДЕ, если что.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nik182 пишет:

Не, 0x3F это (0<<7)|(0<<6) :-)

Точно, это я как-то не подумал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mal333 пишет:

Евгений, в ADMUX |= (0<<7)|(0<<6)|(0<<4), конечно, нужно знак поставить &,ошибся я, действительно. 

Т.е. Вы считаете, что надо  ADMUX &= (0<<7)|(0<<6)|(0<<4) 

Боюсь Вас огорчить, но то, что получилось полностью эквивалентно ADMUX = 0.

Боюсь, что с такими знаниями битовых операций, Вы долго будете конфигурировать ADC.

mal333
Offline
Зарегистрирован: 23.04.2014

ОК, справедливо, я ставил ADMUX&=0x2F, результат тот же, и я даже узнал, почему: в analogread, с бодуна писателя, переконфигурация ADMUX происходит при каждом считывании! Более того, я так понял, что Digispark подменяет фирменный wiring_analog.c на свой, и там почему-то : 

int analogRead(uint8_t pin)
{
  #if defined( CORE_ANALOG_FIRST )
    if ( pin >= CORE_ANALOG_FIRST ) pin -= CORE_ANALOG_FIRST; // allow for channel or pin numbers
  #endif

  // fix? Validate pin?

  ADC_SetVoltageReference( analog_reference );
  ADC_SetInputChannel( pin );

  ADC_StartConversion();

  while( ADC_ConversionInProgress() );

  return( ADC_GetDataRegister() );
}

а в Arduino 

#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
	ADMUX = (analog_reference << 4) | (pin & 0x07);
#else
	ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);
//////здесь только имеющая значение часть
#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif

	// combine the two bytes
	return (high << 8) | low;

Вот Евгений, скажите на милость, что именно и где поправить, чтобы получилось хорошо? Мнения других само собой приветствуются!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничего не нужно править. Нужно пользоваться функцией analogReference().

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

mal333 пишет:

я даже узнал, почему: в analogread, с бодуна писателя, переконфигурация ADMUX происходит при каждом считывании!

Неужели узнал????

Вообще-то в стартовом сообщении топика, ты сам процитировал комментарий в котором написано что это сделано. Там даже написано почему (с какого именно бодуна) это сделано. 

Сколько ж тебе понадобилось сил и времени, чтобы узнать то, что было написано в твоём же собственном посте?

Или ты уже наотмечался по самое не могу с утра? :)))))))))))

mal333
Offline
Зарегистрирован: 23.04.2014

Евгений, теоретические рассуждения- отлично, вот только у меня на практике не работает, потому и завел топик. Посмотрите этот долбаный analogReference() - там тупо заглушка с переопределением переменной. Как проверить- я написал.

Ворота, я как-то, как и многие тут, не лезу без особой нужды вглубь функций, написанных умными людьми специально для таких как я, чтобы просто вставить и пользоваться. И я вот не вижу разницы- устанавливать режим Ref отдельной функцией или во время исполнения analogRead. Может надо где-то поправить таки, но где? Не работает оно на тини85.

Да, чтобы долго не ходить вокруг да около, публикую прогу и проект в Протеусе- может тогда что-то сдвинется с места тут.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mal333 пишет:

Посмотрите этот долбаный analogReference() - там тупо заглушка с переопределением переменной.

Да, я то смотрел, это Вы, похоже нифига там не увидели.

Там назначается значение перемнной analog_reference, а потом именно эта переменная и используется для инициализации ADC в analogRead - всё пучком.

mal333 пишет:

Не работает оно на тини85.

У всех, кроме Вас, работает. Программу Вашу мы не видели. Ваша репутация как программиста, после нескольких попыток биты взвести, уж извините, невысока, так что ... полагаю, проблема в Вашей программе.

mal333 пишет:

 публикую

Хотите. чтобы на неё посмотрели - публикуйте здесь (только по правилам форума). Лезть куда-то наружу я не хочу.

Сейчас посмотрю в честь праздника, но на будущее знайте.

Мой протуст такого расширения файла не понимает.

.ino сейчас посмотрю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Какие фьюзы стоят? Вы знаете чтоэто такое и можете ответить?

Если не знаете и не можете, то хотя бы так - Вы понимаете, что Вы пытаетесь читать с пина Reset? И что это невозможно без правильно выставленных фьюзов? А если Вы их правильно выставите, то Вы потеряете возможность прошивать Ваш контроллер иначе как высоковольтным программаторм (он у Вас есть?).

mal333
Offline
Зарегистрирован: 23.04.2014

Мало представляю себе, как тут выложить проект протеуса, поэтому то и внешняя ссылка. Далее отностиельно пинов- все корректно, это не ардуина, это дигиспарк, на всякий. Там все по-другому, в том числе и аналоговые пины. Про фьюзы ничего не знаю, из ардуино IDE шью, нормально все всегда.В смысле знаю, что это, но не заморачивался.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ни хрена с пинами не корректно. Дело не в Ардуине и не в спарке. Дело в микроконтроллере ATtimy85. Пин PB5 - это Reset. Чтобы им пользоваться надо специальным образом конфигурировать фьюзы. Но тогда нужно иметь дорогой высоковольтный программатор.

Если слова "фьюзы" и "высоковольтный программатор" для Вам пустой звук, то забейте, просто считайте, что этого пина у Вас нет - им нельзя пользоваться.

Если бы Вы сразу опубликовали код, Вам бы это (про то, что пин PB5 так нагло использовать нельзя) сказали бы сразу. Имейте это в виду в будущем – всегда публикуйте код

Теперь несколько замечаний по тексту программы. Вы не просили, но считайте это подарком к празднику.

Строка 11.

(А) она просто не нужна, т.к. такой режим установлен по умолчанию.

(Б) если уж хотите её написать, то никогда в таких местах не используйте голые числа. Есть константа DEFAULT, вот её и передавайте analogRefference.

Строка 17. Она не нужна. А в некоторых случаях может оказаться и вредной. Не надо инициализировать аналоговые входы как цифровые. Убирайте.

Строка 26. Переменная val используется только в функции loop, так нафига Вы её определили глобально в строке 7? Строку 7 удаляйте, а в строке 26 пишите

const int val = analogRead(pinin);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

У Вас же есть свободные пины. Пользуйтесь ими. Про PB5 забудьте!

mal333
Offline
Зарегистрирован: 23.04.2014

Я нигде не говорил, что программатор и фьюзы для меня пустой звук, просто это к теме не относится. Насчет пинов- а где про порт 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:

/*=============================================================================
  Veneer for the ATtiny85 ADC
=============================================================================*/

#if defined( __AVR_ATtinyX5__ )

typedef enum
{
  ADC_Reference_VCC                             = B000,
  ADC_Reference_External                        = B001,
  ADC_Reference_Internal_1p1                    = B010,
  ADC_Reference_Reserved_1                      = B011,
  ADC_Reference_Internal_2p56                   = B110,
  ADC_Reference_Internal_2p56_Bypass_Capacitor  = B111
}
adc_vr_t;

__attribute__((always_inline)) static inline void ADC_SetVoltageReference( adc_vr_t vr )
{
  ADMUX = (ADMUX & ~MASK3(REFS1,REFS0,REFS2)) 
      | (((vr & B011) >> 0) << REFS0) 
      | (((vr & B100) >> 2) << REFS2);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mal333 пишет:

Я нигде не говорил, что программатор и фьюзы для меня пустой звук,

А как же пост №16?

mal333 пишет:

Про фьюзы ничего не знаю

Далее

mal333 пишет:
а где про порт 0 написано то, что вы утверждаете?

Я утверждаю про PB5, который у Вас на схеме. Про порт 0 я не утверждал ничего. А написано - так вот у Вас же и написано.

mal333 пишет:
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

Тут и про пин, и про фьюз RSTDISBL. Вы понимаете, что здесь написано? Если нет, я уже говорил, забейте и считайте, что этого пина у Вас нет.

Вы, похоже, не верите мне, ну это дело Ваше, доказывать я Вам ничего не собираюсь.

А вот в это 

mal333 пишет:
какой- бы я пин не поставил- результат тот же самый

я не верю.

Хотя, может и так, я ведь не знаю, что Вы понимаете под результатом - откуда Вы знаете, что там реф = 1,1

У меня создалось впечатление, что Вы посчитали, что я на Вас нападаю и начали защищаться. Напрасно, я на Вас не нападал, просто пытался помочь. Видимо, напрасно, так что я исчезаю, хорошего Нового года.
 

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Мужик, ты кончай тупить, тебе дело говорят.

Вот читай, по-русски, если по аглицки не умеешь: "Начнем с первого пина (PIN 1): он в ATtiny85 используется для необходимого при прошивке сигнала Reset и при переносе кода его не стоит использовать. Если этого не удалось избежать, то приготовьтесь пользоваться сложным высоковольтным программатором" (https://voltiq.ru/digispark-attiny85-review/).

Что до остальных пинов, тебя тут уже спрашивали, как ты настраивал фьюзы в протеусе? Если никак, то по умолчанию, она (85-ая)работает на частоте 1МГц, а нормальный дигиспарк на какой? На 16МГц. Вот твоя программа и считает, что там частота 16, а на самом деле 1. Там до хрена чего может не работать.

А вообще, ты когда хочешь спросить пруфы, ты на людей смотри. Тут на форуме есть несколько спецов (и тебе помогал один из них), у которых лично я пруфы не спрашиваю, а считаю пруфом то, что они сказали.

mal333
Offline
Зарегистрирован: 23.04.2014

Евгений, это не вопрос веры. Есть протеус, в нем модель А85, компилятор для ардуины тоже имеетя, так ведь? Или все то, что было написано выше- лишь теоретические рассуждения обо мне и представления, как оно должно быть? Так и у меня такие представления были, я сюда после шока и пошел. Если у вас получится другой результат, я вас запытаю о том, как это получилось и на телефон(сберкарту) несколько денег накину. Я подключал переменник к разным портам, +5 и gnd на крайние ножки, отвод- на пин (это чтобы не сомневались, что я не в реостатном включении резистор использовал :))- результат свечения светодиода на плате и показания вольтметра я игнорировать никак не могу. Схемотехнично этот весь вопрос обойти можно, изменив параметры ФНЧ, но это не очень меня устраивает по некоторым причинам.

З.Ы. Тренд такой что ли, считать окружающих идиотами, но если представить мнение обо мне иначе, двинемся к решению быстрее, имхо.

З.З.Ы Ворота, на зоне на людей смотри. Пишешь какую-то хрень, про частоты, куда смотреть,пруфы и тупость. Перечитай мои каменты и свои, сравни и сделай вывод о своей адекватности.

mal333
Offline
Зарегистрирован: 23.04.2014

С НОВЫМ ГОДОМ!!11 всех в этом чатике :)

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

mal333, после схемы, использующей reset в сообщении #16 и про "фьюзы ничего не знаю" я бы про адекватность людей не ругал.
Да и порт у 85-й всего один, если не в курсе.
Ничего личного, only взгляд со стороны...

mal333
Offline
Зарегистрирован: 23.04.2014

OlegK, так же в сообщениях я писал, что эффект не меняется при смене канала АЦП, а так же  чуть далее, в том же каменте про "фьюзы ничего не знаю" - "В смысле знаю, что это, но не заморачивался". Надо где-то их выставлять для Arduino IDE? :) Что, если терминология несколько отличаетсяот общепринятой, то все фактические рассуждения можно уже отметать? Про Reset таки читали в первоисточнике, или просто "этого не может быть, КГ/АМ" потому что у вас такая картина мира? Я понимаю, возможно все, что я описывал кажется какой-то хренью из-за некоторых неточностей, за это прошу прощения у аудитории. Но,блин, у меня на руках факт, что дигиспарк не программируется на Ref, отличный от 1.1В, и он проверен практической схемой и симуляцией в протеусе, и не зависит от канала АЦП, который я менял в программе.

mal333
Offline
Зарегистрирован: 23.04.2014

Хех, я нашел, в чем дело :)) Никуда глубоко не надо лезть, все видно даже в моем коде, где там ошибка :) Интригу может разрулить каждый из вас, а полагаю.

Первому, кто тут отпишется о причине-200р на ЯД/Сбер/телефон :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И что, АЦП заработал на пине Reset c фьзами по умолчанию? Давайте лучше я Вам вышлю :)

mal333
Offline
Зарегистрирован: 23.04.2014

Евгений, собрал,проверил и вот какой результат: сам по себе канал ADC0 работает, но при уровне входного напряжения < лог."1" контроллер уходит в перезагруз, как, собственно и должно быть. Так что тут скорее ничья в нашем споре :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С Вами кто-то спорил? Вы ошиблись, возможно Вы с кем-то и "спорили", но я с Вами - нет, ибо спорить тут абсолютно не очем. Просто решил помочь и объяснил, что этим пином пользоваться нельзя. И уже пожалел об этом. Вы всё равно ничего не поняли, только "поспорили". Кто людям помогает, тот тратит время зря. Так что впредь "спорьте" с кем-нибудь другим.

mal333
Offline
Зарегистрирован: 23.04.2014

Евгений, вы чувак крутой, судя по темам на этом форуме, но очень уж обидчивы и придираетесь к словам. За вашу помощь спасибо, вы не остались к теме равнодушным, и может даже поэтому я таки смог найти ошибку сам. Видя ваши знания в устройстве МК и языка С,  я(да и, как и все тут вопрошающие) ожидал увидеть здесь реальную помощь в любом виде, но получил вместо этого обсуждение меня, где я слегка ошибся или назвал что-то немного по-другому. Такое ощущение, что на этом форуме знатокам сильно не хватает ЧСВ и они тешат себя принижением остальных участников. Самое забавное, что на ошибку так никто и не смог указать, все потрепались, показали, что они круты, выставили меня идиотом и обиделись :)) Детский сад, штаны на лямках.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ой! Жалко, что ты, родное сердце, мне вчера не попался. Женя "взял огонь на себя".

Где у тебя ошибки - их две: первая в ДНК, а вторая не твоя...

1. Ты сдвигаешь 0! (0<<6) и все подобное в начале темы, тупой или тролль?

2. Ты используешь РЕСЕТ пин, и еще лезешь в дискуссию с людьми, которые собаку сьели без соли на этих платах.

3. ты, не моргнув глазом, пишешь в analogWrite() числа, большие 255. Ты хоть учебник для даунов, типа видео "от Блума", смотрел?

------------

И теперь, недоросль, ты учишь, как тебе нужно было помогать! Совсем берега попутал!

Форум, НЕ ДЛЯ ПОМОЩИ, мля! Форум, он для общения по интересам. Понимаешь? - по интересам. То есть нужно быть интересным для других.

Вот на кой хрен ты, с тупостью заваренной на апломбе, тут нужен? Рассказать мне про мое ЧСВ? О вей'з мир! И что бы я без тебя делал?!

---

Ты в самом деле не понимаешь, что задавая почти любой вопрос на форуме, ты себя унижаешь? Если ответ можно найти САМОМУ - в гугле, вики, видеоуроках или даташите, то ты выставляешь себя тупьем или, еще хуже - ленивым уродом.

На форуме - обсуждают идеи, дискутируют о вариантах решений, сообщают о найденных любопытных темах, касающихся нашего хобби.

Да, и вопросы тоже задают, но те, которые стоит обсудить, а не те, которые уже обсосаны до костей и густо унавожены в любом поисковике.

Еще раз - форум - это, мля, не справочная и не армия спасения.

====================

Теперь еще раз по теме твоего вопроса:

Всегда, нет, запомни четко и крепко: ВСЕГДА, когда тебе кажется, что есть ошибка в ИДЕ, библиотеке, компиляторе, стандарте языка, работе микроконтроллера (или тексте Торы ;) ) - тебе кажется НЕ ПРАВИЛЬНО ! Ищи ошибку у себя. Исключения из этого правила - ничтожны и вряд ли встретятся на твоем жизненном пути.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Мужик, ты и впрямь думаешь, что никто не заметил того, что ты про маппинг забыл? Дурачёк, тебе пытались объяснить гораздо более глобальную ошибку про ресет, но ты оказался умнее всех и всех переспорил. Молодец! Оставайся идиотом, пользуйся ресетом и учи всех как тебе помогать!

mal333
Offline
Зарегистрирован: 23.04.2014

Итак, настало время подведения итогов. На самом деле моя ошибка состояла в том, что я использовал digitalWrite() c параметром для Digispark (Attiny85) больше 255, а это неверно. т.е. диапазон измерений уменьшился в 4 раза и получалось максимальное значение как раз около 1.1 в, точнее при измерении где-то 1.2в. Вот я и сделал неверный вывод, что это Ref у меня не меняется. :)Но самый прикол, что analogRead() возвращает 10-ти битовое значение, т.е. я подумал, что раз разрешение АЦП 10 бит, то и ШИМ 10 бит, как у контроллеров на Ат328 и иже с ними. Вообще с библами, на мой взгляд какая-то ерунда с разрядностью аргументов аналоговых функций: для 328- это 10/10(АЦП/ШИМ), для Attiny - 10/8. Казалось бы, высокоуровневые языки на то и нужны, чтобы абстрагироваться от железа, но это не тот случай, видимо.

Разборка темы выглядит так: мне посоветовали

ADMUX &= 0x2F;

что как бы должно было решить проблему,т.к. я накосячил с битшифтом. Но оказалось, что на самом деле это ничего не решает,т.к. в библе analogWrite() все равно это каждый раз херется на и устанавливается в соответствии с ф-цией AnalogReference(). Самое интерессное, что когда советовали никто об этом не знал. Забавно- корифеи, и не знали. Ладно, бывает. И тут включается у некоторых говномет- вместо того, чтобы указать на явный мой косяк с analogWrite(). Далее кто-то советует обратить внимание на частоты эмуляции, как будто это как-то повлияет на результат(компетентные школяры подтянулись, ага), а так же на то, что юзается пин Reset, а не какой другой. На мою ремарку, что эта хрень не зависит от пина никто не реагирует, все видят только схему, что я выставил, текст никто не читает. Подключается тема высоковольтного программатора и факта обладания им, хотя к теме вопроса это никак не относится, я об этом не спрашивал и никак не акцентировал внимания. Быть может, мне это было не существенно, но порутчика было уже не остановить :) Далее посыпались каменты об уважухи, частных взглядах на цели образования форума и оскорблениях меня как недоумка, ибо видео не смотрел, к когорте избранных не подлизался и вообще мимо проходил. ЕвгенийП обиделся на слово "спор" и ушел в игнор, как признанный тут гений, вынужденный общаться с чернью:) Не, его право, он сделал то, что мог, наверное он замечательный чел, ему еще раз благодарность за внимание к вопросу.

Теперь о говнах. Не я первый начал, так что извиняйте, если кого брызгами заденет.

wdrakula, убогий школота ты наш местный! А не запахнуть ли тебе свой поганый ротик и задуматься о своей генной чистоте, а то как то изо рта у тебя говнецом несет,аж сюда выплескивает, может папа и не твой вовсе, а бомжара из подвала? Но кинь координаты, куда перечислить- все же первый на вопрос ты ответил первый.

Ворота, да, никто не заметил. Заметили бы- так бы и сказали. И это сделал бы ты, если бы об этом знал. Но ты начал с говномета и пацанских рассуждений, так что пересмотри свой уровень компетентности, завышен как бы, по факту.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Маладца! Всё верно расписал. А теперь иди на хер с ресета сигналы читать.

mal333
Offline
Зарегистрирован: 23.04.2014

Так читаются же, умник. Выше логлевел 1  даташита читаются. Забавно, но ты так  и не прочел все мои каменты по этому поводу, а так же прямые указания создателей по этому поводу. Вот только я мог ошибаться,я не профи, а ты крутышка, этого не знал а значит некомпетентен. Пиши digitalWrite в проектах, ослолюб.

 

 

 

 

 

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

mal333 пишет:

Так читаются же

Так я и говорю, иди, читай.

mal333 пишет:

Выше логлевел 1 

Выше чего? Давненько такого феерического дятла тут не было!

Мужики, берегите его, завтра он нас научит и с Gnd читать, главное, чтобы сигнал выше, чем HIGH был.

mal333
Offline
Зарегистрирован: 23.04.2014

Ты в шаге от взятия приза на самого тупого. Рефы не читал, но осуждаю-твой девиз. Попробую еще раз донести до тебя простую истину: выше уровня лог.1,т.е. выше 2.1 В вполне возможно читать по ADC0, и это будут действительные значения. Попробуй не только тут херню писать, но и в симуляторе хотя бы сэмулировать. Ну а то, что я писал, что шляпа с моим кодом наблюдается и на других каналах ADC ты, как обычно, игнорируй. Тыж погромист-школяр, тебе можно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

mal333 пишет:

т.е. я подумал, что раз разрешение АЦП 10 бит, то и ШИМ 10 бит, как у контроллеров на Ат328 и иже с ними. Вообще с библами, на мой взгляд какая-то ерунда с разрядностью аргументов аналоговых функций: для 328- это 10/10(АЦП/ШИМ), для Attiny - 10/8.

Ой! Это так прекрасно, что ничего комментирвать не нужно. Я только жирным выделил. ;)

Иди уже в сантехники,  инвалид, а лучше в дворники - вреда меньше принесешь.

От жеж дрэг ...мит фефэр!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ладно, Влад, давайте оставим дурачка в покое, его и так Господь обидел - создал идиотом. Ему бы посочувствовать, а не гнобить.

nik182
Offline
Зарегистрирован: 04.05.2015

Абидна однако. Мужики то про аналог рид то не знали. И когда надо admux напрямую без него пользовали и всё работало. А с ним не работает. Пичалька....

pepelnyy
Offline
Зарегистрирован: 29.01.2016

Добрый день!

Сразу хочу сказать, что полный нуб.

Потребовалось измерить напряжение питания (Li-Ion 2S) с помощью Digispark.

Правильно ли я понимаю, что мне необходимо с помощью делителя привести измеряемое напряжение к менее чем 1,1В при полностью заряженной батарее?

Верно ли я понимаю как с этим всем работать?


int val = 0;           // переменная для хранения считываемого значения
float voltage = 0;     // измеренное напряжение после делителя

void setup()
{
   analogReference(internal)  
}

void loop()
{  
  //Здесь что-то делаем..
  pinMode(2, INPUT); //переводим P2 в режим аналогового входа
  for (int i=0; i <= 63; i++) {
     val = val + analogRead(1); // считываем значение c P2
  }
  voltage = val / 16 * 1.1; // усредняем и переводим в вольты (1024/64=16)
  //далее производим необходимые действия с voltage: по желанию - 
  //домножим на коэффициент делителя, вычтем напряжение отсечки и т.д.
  //делаем что-то ещё.
}

Заранее благодарен за ответы.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

точность 10% устраивает?

Строка №12 не нужна от слова "нафиг".

64 результата analogRead в val может не поместиться.

Что за усреднение такое, суммировали 64 члена, а делите на 16?

В строке №16 первое деление целоичсленное. Замените 16 на 16.0. Впрочем, там по-любому бред в этой строке. Подумайте как переводить поугаев в вольты.

pepelnyy
Offline
Зарегистрирован: 29.01.2016

Неизвестно, чем был занят пин P2 до измерений, поэтому строка #12 переводит его в режим аналогового входа.
Как я понимаю, val принимает значения от 0 до 1023, которые для перевода в вольты надо умножить на 1,1В. После этого усредняем - делим на 64. Но 1024/64=16. Поэтому я и делю на 16. В принципе, согласен, усреднение можно упразднить.

pepelnyy
Offline
Зарегистрирован: 29.01.2016

А, ну да, я тупой, 1024, наверное, на 64 умножить надо... И делить не на 16 тогда, а на 65536.0...

pepelnyy
Offline
Зарегистрирован: 29.01.2016

То есть вот так 

int val = 0;           // переменная для хранения считываемого значения
float voltage = 0;     // измеренное напряжение после делителя

void setup()
{
   analogReference(internal)  
}

void loop()
{  
  //Здесь что-то делаем..
  pinMode(2, INPUT); //переводим P2 в режим аналогового входа
  for (int i=0; i <= 9; i++) {
     val = val + analogRead(1); // считываем значение c P2
  }
  voltage = float(val) / 10240.0 * 1.1; // усредняем и переводим в вольты 
  //далее производим необходимые действия с voltage: по желанию - 
  //домножим на коэффициент делителя, вычтем напряжение отсечки и т.д.
  //делаем что-то ещё.
}

будет правильно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pepelnyy пишет:
Неизвестно, чем был занят пин P2 до измерений, поэтому строка #12 переводит его в режим аналогового входа.

Прекратите нести отсебятину. Такого режима нет в природе. Вам сказали, что эта строка нафиг не нужна, значит - нафиг не нужна.

pepelnyy пишет:
Как я понимаю, val принимает значения от 0 до 1023

Программа Ваша? Что-то Вы её неправильно понимаете. В val Вы накапливаете сумму из 64 значений, каждое из которых может быть от 0 до 1023. Стало быть макисмально val может стать 65472. Такое числе в неё просто не поместится! Там больше, чем 32767 не помещается.

pepelnyy пишет:
А, ну да, я тупой, 1024, наверное, на 64 умножить надо...

С первым согласен, насчёт второго - думайте ещё.

pepelnyy
Offline
Зарегистрирован: 29.01.2016

То есть вот так

int val = 0;           // переменная для хранения считываемого значения
float voltage = 0;     // измеренное напряжение после делителя

void setup()
{
   analogReference(internal)  
}

void loop()
{  
  //Здесь что-то делаем...
  for (int i=0; i <= 9; i++) {
     val = val + analogRead(1); // считываем значение c P2
  }
  voltage = float(val) / 10240.0 * 1.1; // усредняем и переводим в вольты 
  //далее производим необходимые действия с voltage: по желанию - 
  //домножим на коэффициент делителя, вычтем напряжение отсечки и т.д.
  //делаем что-то ещё.
}

будет правильно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну Вы ж сами говорите. что максимально может быть 1023. А делите на что?

pepelnyy
Offline
Зарегистрирован: 29.01.2016

От 0 до 1023 включительно (включая 0 и 1023) ведь 1024 значения (0, 1, 2, ..., 1021, 1022, 1023)? И 10 измерений. И диапазон 1.1В. То есть мы находим 1/1024 от aref (1.1В), умножаем её на val (сумму всех 10 отсчётов) и делим на количество отсчётов (10).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хорошо, пусть напряжение равно в точности 1.1 Что при этом вернёт analogRead? И что Вы получите своим расчётом?