Почему Ардуино получает 10 бит, а передаёт 8 бит?

InterSky
Offline
Зарегистрирован: 24.12.2014

Объясните пожалуйста логику разработчиков, почему Ардуино принимает сигналы в 10 битном формате, а передаёт только 8 бит? Ведь это не аппаратные ограничения (типа вольтметр у них способен 1024 градации напряжения измерить, а генератор настолько не точен что только 256 значений дать может). В чём логика? Это же так не логично...

Из-за этого столько приходится кода писать...
(сейчас кто-нибудь обязательно скажет - "Совсем и не много кода")
Во всяких примерах видишь: ПосылаемЗначение = Округлить( ПолученныйСигнал / 4.1), чтобы при округлении 1023/4 в большую сторону не получить 256.
Ну это примерно как получать время в сишном формате секунд, а передавать в паскалевском формате где день это 1, а чтобы получить минуты и секунды надо 1/24/60/60, в резултате получаешь собсвенноручно переданный сигнал и он не совпадает с тем что ты отослал (может совпасть только если его пытаться опять преобразовывать, и то не факт что при этом своё значение получишь).
Привыкнуть можно ко всему, и писать 1/х+10.0+2.0, и "жалюзИ" говорить, и название валюты писать перед суммой, но у всего должно быть логическое обоснование. А тут ни как не понимаю...

Честно искал в сети ответ на этот вопрос, но так и не нашёл.
Может местные гуру проработавшие с Ардуино более 10 лет, где-то когда-то слышали причину этого?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Зарегистрирован:24.12.2014

блин - полтора года оставаться дыбилом.

кто куда передаёт/получает? - данные передаются по интерфейсам.

то, что ты называешь "отправкой/передачей" на самом деле оным не является и обусловлено аппаратно

analogRead() 

Функция считывает значение с указанного аналогового входа. Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini  и Nano, 16 у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт.

analogWrite()

период рабочего цикла значение между 0 (полностью выключено) and 255 (сигнал подан постоянно).

*нелогично? - разработай, построй по всему миру заводы и начинай выпускать логичные МК.

MagicianT
Offline
Зарегистрирован: 03.10.2015

InterSky пишет:

Объясните пожалуйста логику разработчиков, почему Ардуино принимает сигналы в 10 битном формате, а передаёт только 8 бит? Ведь это не аппаратные ограничения (типа вольтметр у них способен 1024 градации напряжения измерить, а генератор настолько не точен что только 256 значений дать может). В чём логика? Это же так не логично...

Из-за этого столько приходится кода писать...
(сейчас кто-нибудь обязательно скажет - "Совсем и не много кода")
Во всяких примерах видишь: ПосылаемЗначение = Округлить( ПолученныйСигнал / 4.1), чтобы при округлении 1023/4 в большую сторону не получить 256.

Логики там нет, был 10-битный АЦП его и поставили, 16-битный был бы слишком дорог на 8-битном МК.

А кода не много, Вы наверное, пишите неправильно. Если делить целые переменные int8_t int16_t то 1023/4 всегда 255. Для других типов есть способы задать округление вниз, и не морочить голову с 4.1 делителем.

http://www.cplusplus.com/reference/cmath/floor/

InterSky
Offline
Зарегистрирован: 24.12.2014

Для Клапауций 232: Твоего уровня интелекта не хватает ни на что кроме как только привести выжержку из мануала, который повторяет то что я тебе сказал...

Для MagicianT: Ну а почему посылает только 8 бит?

А про код, я просто посмотрел пару уроков
https://www.youtube.com/watch?v=N0jbLZbynjA&feature=youtu.be&t=4m10s
Саму ардуину я даже в глаза не видел.

MagicianT
Offline
Зарегистрирован: 03.10.2015

InterSky пишет:

Для MagicianT: Ну а почему посылает только 8 бит?

Куда посылает? Ардуино хранит результат как 16-битную переменную, это два байта. Если Вы куда то что-то (кого то) посылаете, то это проблема протокола, и Клапуций прав. Можно слать и long и float , так там ваще 32-бита и по то му же серийнику их пихать как 4 байта надо, а это опять протокол должен делать, смотреть где хвост где голова и т.д. 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Есть у меня теория. ТС - это ранний твинк одного из Ардуино-хейтеров.

Вот сейчас он "непонимает", почему ШИМ восьмибитный, а потом ему откроются глаза, что существуют микроконтроллеры с более продвинутым ШИМом. Ну или "костыли" окажутся во всем виноваты...

toc
Offline
Зарегистрирован: 09.02.2013

MagicianT пишет:
Если делить целые переменные int8_t int16_t то 1023/4 всегда 255. Для других типов есть способы задать округление вниз, и не морочить голову с 4.1 делителем.

предпочитаю вместо /4
написать >>2

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

InterSky, если вы имеете ввиду почему у ардуиновской функции analogWrite разрядность 8 бит (0..255) -потому, что больше обычно и не нужно. Кому нужно больше, тот сам сделает. На 16 битном таймере можно сделать любую разрядность вплоть до 16 бит (0..65535). PS: Не советую использовать программы, подобные той, что на вашем видео. Вместо того, что-б учить язык СИ и изучать аппаратную сторону М.К. забивают голову людям какой-то ненужной хренью. Лучше уж смотрите уроки от Джереми Блюма, к нему тоже есть претензии, но в целом для обучения годится.

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

InterSky пишет:

Из-за этого столько приходится кода писать...

Сколько?

InterSky пишет:

Во всяких примерах видишь: ПосылаемЗначение = Округлить( ПолученныйСигнал / 4.1), чтобы при округлении 1023/4 в большую сторону не получить 256.

Покажите, пожалуйста, такие примеры. Очень хочется увидеть. Пока же мне кажется, что Вы приболели и бредите :))))

Вы это ... выздоравливайте, негоже болеть-то!

Logik
Offline
Зарегистрирован: 05.08.2014

Gippopotam пишет:

Есть у меня теория. ТС - это ранний твинк одного из Ардуино-хейтеров.

Не исключено. Может "многоэсный" уже старые ники скупает. Посмотрим что дальше ...

А ща проверим!!

Скажите, уважаемый InterSky, а STM - это круто?

InterSky
Offline
Зарегистрирован: 24.12.2014

ЕвгенийП пишет:
Покажите, пожалуйста, такие примеры. Очень хочется увидеть.
Специально для вас выложил видео, чтобы вы и услышали и увидели... Но вы очевидно пишете не читая...

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

InterSky пишет:

ЕвгенийП пишет:
Покажите, пожалуйста, такие примеры. Очень хочется увидеть.
Специально для вас выложил видео, чтобы вы и услышали и увидели... Но вы очевидно пишете не читая...

Я как раз читаю и очень внимательно. А вот видео не смотрю. Не понимаю что можно показать на видео о программе. Мне нужно не видео, а примеры программ в которых "ПосылаемЗначение = Округлить( ПолученныйСигнал / 4.1), чтобы при округлении 1023/4 в большую сторону не получить 256."

Понимаете, примеры программ. Программы - это тексты, а не видео. Покажите мне хоть один пример. Вы же сказали, что таковых много ("Во всяких примерах видишь"). Вот и покажите. 
 
А так, по секрету Вам скажу. Фраза "ПосылаемЗначение = Округлить( ПолученныйСигнал / 4.1), чтобы при округлении 1023/4 в большую сторону не получить 256" является бредом сивой кобылы в чистом виде. Причем крайне безграмотной сивой кобылы - привет автору видео! При целочисленном делении остаток всегда отбрасывается, даже если он 0.999999999999 - вверх не округляется никогда! Запомните это и не тиражируйте любой бред, который услышите. 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Жень, Вы напрасно не посмотрели видео - все стало бы на свои места: там 7-летний ребенок рассказывает для своих сверстников, как бороться с Ардуино при помощи Скретча. Рассказывает, естественно, в меру своего понимания.

Это не "сивая кобыла", это всего лишь маленький ребенок. Ну, возможно, в немного перевранном пересказе.

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

andriano, ну на видео может и маленький ребёнок, не видел, а здесб в первом посте темы ... вполне себе взрослый участник форума.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

InterSky
Offline
Зарегистрирован: 24.12.2014

ЕвгенийП пишет:
При целочисленном делении остаток всегда отбрасывается, даже если он 0.999999999999 - вверх не округляется никогда!
Так бы и сказали, что в программировании вы полный ноль.
Тогда понятно почему видео боялись открыть...

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

InterSky пишет:

ЕвгенийП пишет:
При целочисленном делении остаток всегда отбрасывается, даже если он 0.999999999999 - вверх не округляется никогда!
Так бы и сказали, что в программировании вы полный ноль.
Тогда понятно почему видео боялись открыть...

та, да - испугался, что ты покусишься на его бесценную математическую безграмотность.

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

Во, блин, ещё один прогер завёлся.