Как прочитать и Serial.print содержимое (текущие значения) 8-битного регистра?

arduino-uno arduino-nano print registers

В настоящее время я использую:

 ADMUX = 0b01100000; //пример
for (int i = 7; i >= 0; i--) {
Serial.print (bitRead (ADMUX, i));
}

Это правильно печатает:

 01100000

Но есть ли более простой способ?

Прежде чем придумать описанный выше цикл for, я пробовал использовать только:

  ADMUX = 0b01100000; //example
  for (int i = 7; i >= 0; i--) {
    Serial.print(bitRead(ADMUX, i));
  }

Что-то еще, о чем я не знаю?

, 👍0

Обсуждение

Вы спрашиваете, потому что пытаетесь избежать написания цикла самостоятельно, потому что вам интересно, возможно ли это сделать с меньшим количеством движущихся частей (независимо от того, сделано ли это в вашем коде или в чьем-то еще), или вы спрашиваете, потому что вы находитесь под впечатление, что без встроенной вещи вам нужно было бы писать цикл каждый раз, когда вы хотите напечатать значение таким образом?, @timemage

Я тоже не совсем понимаю, о чем вы спрашиваете ;), @Gaai

Я новичок в использовании таймеров и регистров, недавно прочитал и поэкспериментировал, и я просто хочу знать, какой предпочтительный или самый элегантный способ сделать это. Я сам не нашел здесь ответа. Итак, я попробовал вышеуказанные способы. Может быть, есть что-то лучше. Если есть, хотелось бы узнать ;), @Gaai

itoa(n, buffer, 2) не является частью C++, но доступен в Arduino и выполняет те же функции, что и Serial.println(num, BIN);. Перед использованием необходимо определить буфер, например char buffer[33], так что это не намного проще., @hcheung

Если вы посмотрите, как определяется [print_number](https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Print.cpp#L203-L221), который вызывается всеми Serial.print( число, основание), и как [binary](https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/binary.h) определяется в Arduino Core, на самом деле нет более простого способа . Просто определите цикл for..loop как функцию print_binary() и используйте ее, если вам нужно., @hcheung

«лучше» (без квалификации) и «предпочтительно» очень контекстуальны и в основном основаны на мнении, что является чем-то, для чего вопросы закрываются на стеке. Итак, если у вас есть способ сделать вопрос более конкретным или дать объективный ответ, вероятно, это хорошая идея., @timemage

@timemage Я спросил «проще»., @Gaai

@hcheung itoa(), за которым следует Serial.print, по-прежнему не имеет начальных нулей. Так ведь то же самое. Спасибо за ваш вклад. Доволен циклом for, а затем для печати. И я думаю, что для других целей меня не должны беспокоить пропущенные начальные нули, поскольку я полагаю, что они в любом случае не имеют значения при чтении или сравнении., @Gaai

@Gaai, я заметил. это часть того, что вызвало мой первоначальный вопрос. может это только я., @timemage


1 ответ


1

Другой вариант:

#include <LibPrintf.h>
printf("%.8b", ADMUX); // печатает: 0110000

Библиотека LibPrintf.h входит в стандартную комплектацию плат ESP. %b означает двоичный файл. .8 для 8 знаков после запятой, что добавляет ведущие нули ко всем усеченным (двоичным) числам.

Это становится *проще, если вы хотите напечатать имя переменной вместе с ним, например:

printf("ADMUX: %.8b", ADMUX); 

Результаты:

ADMUX: 01100000

*Проще в том смысле, что теперь занимает всего одну строку кода.

,

Там, где вопрос был помечен UNO и NANO, всем, кто рассматривает этот маршрут, может быть полезно знать следующее. Минимальная тестовая среда для рассматриваемого кода приводит к тому, что _Sketch использует **1542 байта (4%)** пространства для хранения программы. Максимум 32256 байт._ То же самое с кодом в ответе приводит к тому, что _Sketch использует **11456 байт (35%)** места для хранения программы. Максимум 32256 байт._, @timemage

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

Или только то, что стоимость как бы амортизируется (через не снимается) за счет _более_ использования LibPrintf. Я не особо задумывался о том, обман это или нет. Только вот об этом может быть особенно важно знать. Любая реализация printf — зверь. Однако на проекте любого серьезного размера avr-libc (или что-то еще) часто уже, так сказать, оплачено тем, что хотя бы раз использовалось в чужом коде, нравится вам это или нет., @timemage

Итак, если какой-либо printf или что-то подобное уже используется где-то еще (в любом случае занимает это дорогостоящее пространство памяти), вы также можете использовать его для этого? Это что ты имеешь в виду? (пришлось искать амортизированные, учась каждый день;), @Gaai

Нет, это не так просто. Это происходит **за** реализацию printf. Цена за звонок для любой отдельной реализации printf() _огромна_, когда вы используете ее _один раз_. Таким образом, в худшем случае у вас есть одно использование avr-libc и одно использование libprintf. Кроме того, авторы [задокументировали](https://github.com/embeddedartistry/arduino-printf), как вы можете удалить функции, чтобы уменьшить размер библиотеки. Я могу сказать гораздо больше об этом, имеющем отношение к вашему ответу., @timemage