Помогите вывести значение регистра в монитор порта.
- Войдите на сайт для отправки комментариев
Чт, 02/09/2021 - 19:59
Добрый день!
Появилась идея, выводить значение регистров в монитор порта. Т.е в консоли отправляем наименование регистра по мануалу, а в ответ получаем его имя и значение.
не могу понять, как выразить значение String, чтобы оно работало в выражении Serial.print(String, BIN),например.
String inString = ""; // string to hold input void setup() { Serial.begin(9600); while (!Serial) {}; Serial.println(DDRB,BIN); // вывод в порт регистра до delay(5000); DDRB|=(1<<DDB0); Serial.print(DDRB,BIN); //вывод в порт после } void loop() { while (Serial.available() > 0) { int inChar = Serial.read(); if (isprint(inChar)) { inString += (char)inChar; //наполняем строку символами } if (inChar == '\n') { //если символ новой строки выводим в порт строку Serial.print(inString );Serial.print("="); Serial.println((int)inString, BIN); // Вот здесь я не понимаю.Если я передал имя регистра, как строки, inString = ""; //как привести его uint16_t или к long, чтобы получить значение этого регистра } } }
если я вас правильно понял, вы пытаетесь превратить строку символов в имя переменной, в вашем случае регистра. Ничего не выйдет.
Имена регистров и переменных существуют только в исходнике, при компиляции они заменяются машинными адресами и контроллер ничего не знает о строке "DDRB"
вашу задачу можно решить в лоб, с учетом того что регистров в МК немного. Сравнивайте пришедшую строчку с именами известных регистров - и если совпало, выводите соответвующий регистр в Сериал. Может не так изящно, как вы задумывали, зато реально работает :)
если я вас правильно понял, вы пытаетесь превратить строку символов в имя переменной, в вашем случае регистра. Ничего не выйдет.
Имена регистров и переменных существуют только в исходнике, при компиляции они заменяются машинными адресами и контроллер ничего не знает о строке "DDRB"
вашу задачу можно решить в лоб, с учетом того что регистров в МК немного. Сравнивайте пришедшую строчку с именами известных регистров - и если совпало, выводите соответвующий регистр в Сериал. Может не так изящно, как вы задумывали, зато реально работает :)
Мысль уловил. Спасибо, b707!
А если, например, отправлять адрес регистра, вместо имени? Как Вы думаете? Получиться?
А если, например, отправлять адрес регистра, вместо имени? Как Вы думаете? Получиться?
этого не знаю.
А если об.явить переменную, в которую заносить адрес регистра. потом на ассемблере читать по этому адресу значение и заносить его в другую переменную, откуда потом методом Serial.print отправлять в монитор порта?
Знающие люди, подскажите, нужно ли сюда приплетать ассемблер? или С++ есть такие функции, чтобы читать значение по прямому адресу?
А если об.явить переменную, в которую заносить адрес регистра. потом на ассемблере читать по этому адресу значение и заносить его в другую переменную, откуда потом методом Serial.print отправлять в монитор порта?
зачем это все? чем вас
Serial.print(DDRB) не устраивает?
А если об.явить переменную, в которую заносить адрес регистра. потом на ассемблере читать по этому адресу значение и заносить его в другую переменную, откуда потом методом Serial.print отправлять в монитор порта?
зачем это все? чем вас
Serial.print(DDRB) не устраивает?
Ну просто хотел пощупать регистры через монитор, для общего развития.
хочется например что то сделать, и потом сразу запросить состояние регистра.... а так придется все время компилировать код....
так придется все время компилировать код....
зачем все время компилировать? - я ж вам написал, как решить вашу задачку, компилировать придется один раз
так придется все время компилировать код....
зачем все время компилировать? - я ж вам написал, как решить вашу задачку, компилировать придется один раз
искренне Вам благодарен. ( если я правильно понял нужно составить несколько case(), для тех регистров, которые интересуют.)
А второй способ, который я тут предположил, думаете это не возможно?
Я не сильно разбираюсь в C++, может кто предложит лучше.
Возьмите нормальную среду с отладчиком и будете видеть все регистры, их содержимое и как меняются значения на каждом шаге программы. А по другому не получится. Что бы вывести значение регистра МК, МК нужно останавливать на каждом шаге программы. Если получать значения портов ввода- вывода, то совет b707 #1 выполнит работу, но тогда к программе придётся пристыковать блок обработки запроса.
Вот посмотрите, этот колхоз работает... немного подправить нужно, как мне кажется.
По библиотекам переменная b должна быть HEX. Как бы сделать так чтобы в консоли я вводил адрес шеснадцатиричн. без префикса 0х т.е только 04 например для DDRB. и такой же была присвоена переменной b?
Ведь компилятор наверняка выражение HEX приведет к BIN.
Может тебе просто учебник по программированию прочитать, для начала?
Может тебе просто учебник по программированию прочитать, для начала?
Ну Вы же сами прекрасно знаете, что там такого нет и что одним чтением не выучишь язык...
те учебники которые я читал, там общий подход и не как не связан с железом.
Ты ни один учебник не изучил до конца, не надо врать. У действий есть порядок. Сначала язык, потом низкоуровневая отладка. Ты все делаешь наоборот, оттого и проблемы.
те учебники которые я читал, там общий подход и не как не связан с железом.
BIN и HEX тем более никак не связаны с железом.
И ркит прав - чтобы понять, как HEX связан с BIN, нужно знать теорию (и ничего кроме теории).
У меня нет ни одного учебника, только скаченные с интернета. и там все на скорую руку сверстано. На уроках ALEX GYVER, воспитан я или недовоспитан... там , к сожалению про это ничего нет.
Если все-таки Вы готовы что то подсказать, по теме. Я хочу задать Вам вопрос: Как в языке С, обратиться к ячейке памяти,зная ее HEX адрес?
те учебники которые я читал, там общий подход и не как не связан с железом.
BIN и HEX тем более никак не связаны с железом.
И ркит прав - чтобы понять, как HEX связан с BIN, нужно знать теорию (и ничего кроме теории).
Я согласен полностью. Однако я хотел увидеть подсказку читай вот тот учебник или используй вот ту функцию.
Неужели ход моих мыслей не достоин подсказки?
точно так же, как и по адресу в BIN
Если честно, то трудно придумать более ламерский вопрос, чем вопросы про hex и bin, такое обычно задают люди, ровно ничего не плнимающие в программировании и в регистрах
Добавлю - в программах Си вообще не используется обращение к памяти непосредственно по числовому адресу, вместо этого адрес обычно разрешается через переменную, ссылку или указатель.
Я так и не понял, зачем вам это, но все больше склоняюсь к тому, что вы и сами этого не знаете
Послушайте, вопрос про hex и bin вообще не стоит. Все кто внимал к моему вопросу на лету поняли и ответили, что не знают решения. либо предложили свое.
Мне это нужно для понимания, как отправить в монитор порта код регистра, и как получить результат обратно.
сначала была мысль отправлять имя регистра задекларированное в define, идея была плоха и благодаря вам я сразу это понял. То что вы предложили сравнивать строчку это хорошо только для этого МК. Но у меня есть еще один от RENESAS он в составе готового устройства и для него нет программатора! только заводской бутлоадер, поэтому хочется понять все-таки как обойтись без сравнения. потом я подумал, что можно отсылать непосредственно адрес регистра.
Например, в консоли я набираю адрес 04 представляя себе. что запрашиваю его в hex формате.
он помещается в String в виде "04", а функция Serial.print(_SFR_IO8(0x..),BIN) ждет настоящий HEX (0x04).
Вопрос. Как String привести к тому самому HEX...
К сожалению такие хотелки разбиваются о правду жизни
. А правда в том, что МК ничего не умеет делать сам. Не может отдать или получить значение регистра. Он может только выполнить программу. Что написано в программе, то он и будет делать. И никакими ушищрениями сложного BIN HEX вывода получить значения регистров невозможно. Тем более из МК программу которого невозможно изменить, а вывод в ней не предусмотрен.
функция Serial.print(_SFR_IO8(0x..),BIN) ждет настоящий HEX (0x04).
могу только повторить - читайте учебник, чтобы не писать подобной чуши. Никакая функция никакой HEX не ждет, HEX формат -(как и BIN или восьмеричный) - это все записи для человека! Компьютер оперирует битами и байтами, для него между записями
_SFR_IO8(0x04) ,
_SFR_IO8(4)
_SFR_IO8(0b00000100)
нет никакой разницы
Ваши потуги превратить полученное из Сериал значение в HEX путем добавление к нему "0х" нелепы и смешны, и, главное, совершенно бессмысленны.
Вся ваша задумка - жуткая чушь. А задаваемые вами вопросы показывают. что вы не знаете самых элементарных вещей. С такими знаниями вам не регистры из МК читать, а таблицу умножения осваивать.
Выше совершенно верно сказали - вы ставите телегу впереди паровоза. СНАЧАЛА проштудируйте какой-нибудь учебник по Си от корки до корки, прорешайте все примеры. И только потом переходите к тонкостям железа МК. Потому что писать для МК, не зная адресов регистров - вполне можно. А вот не зная Си - совсем нельзя.
Однако я хотел увидеть подсказку читай вот тот учебник или используй вот ту функцию.
Неужели ход моих мыслей не достоин подсказки?
Специально для таких подсказок создана тема: http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-novichok-prochti
Там уже все давным давно написано. Если бы Вы не пренебрегали правилами сетевой этики, то не стали бы требовать от людей в сотый раз повторять те подсказки, которые уже были неоднократно даны.
Ответ жа на Ваш конкретный вопрос содержится у Кернигана и Ритчи - учебник хотя и далеко не исчерпывающий применительно к данному форуму, но зато краткий, хорошо и понятно написанный и содержащий большую часть основ.
Писать на форум вопросы, не прочитав этот учебник от корки до корки, - дурной тон.
Сдаётся, что снова грядет срач.
ТС, видимо, думает, что МК - это как привычный ему девайс с модбасом. Положил в регистр 1 - лампочка включилась. Нужно узнать состояние лампочки - прочитал с регистра. Ну и всякие HEX, BIN из той же оперы про модбас.
Никакой КиР не поможет ему, так как он не представляет "механики" работы МК.
КИПовец? - это диагноз :)
КИПовец? - это диагноз :)
RENESAS это в большинстве своих изделий - авто, ну и бытовка и программатор под них конечно имеется и среда программирования тоже, у производителя, а забыл, еще в мощных бесперебойниках он
Насчёт диагноза не знаю, но изучение мира методом тыка - широко распространённый процесс в человеческом обществе.
Мне это нужно для понимания, как отправить в монитор порта код регистра, и как получить результат обратно.
Подавляющее большинство присутствующих (и я в их числе) не могут понять, зачем это может понадобиться.
С того момента, когда МК примет первую букву Вашего запроса, до того момента, когда он отошлет Вам последнюю букву ответа, значение, записанное в регистр, может измениться не одну сотню раз. И, естественно, к тому моменту, когда Вы начнете читать этот ответ, содержимое регистра уже будет совсем не тем, которое содержится в ответе.
То что вы предложили сравнивать строчку это хорошо только для этого МК. Но у меня есть еще один от RENESAS
Чудес не бывает. Кое-какая унификация между различными процессорами возможна только на уровне языков высокого уровня. А так - в каждом процессоре регистры устроены по-своему. Вплоть до полного их отсутствия. Разница настолько велика, что отражается даже на терминологии: то, что Вы привыкли называть регистрами на AVR, может называться совершенно иначе для другого процессора.
потом я подумал, что можно отсылать непосредственно адрес регистра.
У AVR есть адреса регистров. У других процессоров в в общем случае их нет.
Как String привести к тому самому HEX...
Это называется форматным преобразованием. Почитайте для начала что-нибудь о таблице ASCII кодов, чтобы представлять, чем вообще текст отличается от чисел.
Подавляющее большинство присутствующих (и я в их числе) не могут понять, зачем это может понадобиться.
Смысл необязателен - важно желание.)
Раньше, в эпоху МП, подобное называлось монитор-отладчик. И это был базовый софт для голого железа.
Как бы можно и для МК это же иметь. С отладкой только сложнее.)
Раньше, в эпоху МП, подобное называлось монитор-отладчик. И это был базовый софт для голого железа.
Как бы можно и для МК это же иметь. С отладкой только сложнее.)
у меня такое впечатление, что ТС рассчитывает так мониторить чужие прошивки. Типа подсоединился к контроллеру, послал запрос с "настоящим HEX" - получил в ответ содержимое регистров
Ох и тяжело ж ему придётся.) А это странное выражение HEX, BIN...
...он помещается в String в виде "04", а функция Serial.print(_SFR_IO8(0x..),BIN) ждет настоящий HEX (0x04).
Вопрос. Как String привести к тому самому HEX...
чотаржу!!!
Родное сердце! Ну не твое вот-это-вот-всё! Мошт пивка лучше? Ну её, эту бесовскую технику, одно облучение от неё. На моск влияет! ...хотя, для тебя конкретно, это - возможно шанс. ;)))
Подавляющее большинство присутствующих (и я в их числе) не могут понять, зачем это может понадобиться.
Смысл необязателен - важно желание.)
Раньше, в эпоху МП, подобное называлось монитор-отладчик. И это был базовый софт для голого железа.
Как бы можно и для МК это же иметь. С отладкой только сложнее.)
В точку!
Я в самом начале писал:Лабораторная работа. " простыми методами писать/читать "статичные" регистры.
я хорошо понимаю процесс и, не собираюсь через регистр смотреть, как кварц "звенит"...
У меня нет желания тратить деньги на профф. отладчик для avr.лучше тогда для STM. покупать
Методом тыка, я освоил кое какие навыки в этой жизни и они мне принесли плоды. и самое главное огромное удовольствие, чем я занимаюсь. Про ВАШИ темные стороны, Вы сами знаете...
И Микроконтроллеры - не исключение. И те самые плоды, дают возможность позаниматься пустыми тратами времени, если кого-то беспокоит мое пустое времяпровождение. Вопрос задан в "Песочнице", если чего...
Я только у Вас у "умников" спрашиваю, ранее вполне культурным языком,
В стандартном примере ардуино есть пример перевода из String в int.
String.toInt() она дает возможность перевести стринг значение вида 10500 в int 10500
Покажите мне, не знающему языка С, и не прочитавшему до конца ни одного учебника, как строку вида
1А привести к ее числовому виду int.
Я не знаю, как у других семейств МК, но у ST10F,C166,740 семейства РЕНЕСАС, точно так же есть регистры
объявленные в дефайнах, и у всех есть бутлоадеры через которые можно поковыряться в регистрах.Для меня видите ли сейчас это важно, но я не хочу покупать для этого дорогостоящий отладчик. Кстати, для ST10F есть программа монитор, которая позволяет через UART посмотреть небольшой набор регистров. Для AVR есть такое ПО?
Какая связь между преобразованием строки в число и r25 например?
Прежде чем применять культурный язык, попробуйте понять, что существует немалая вероятность, что на нем тоже можно нести околёсицу, ставя в словах приставки на место окончаний.
Хотите asciiz в long перевести? strtol() в помощь. Как найдете там регистры - поделитесь с народом.
как строку вида 1А привести к ее числовому виду int.
вот ведь дятел упорный, все в одну точку долбит :) Похоже он ни черта не понял...
Discover0708, откуда берется строка 1А? Вы ее сами посылаете? - тогда черт возьми, что вам мешает послать десятичное число 26 вместо шестнадцитиричного 1а ? опять пресловутая ересь "функция требует HEX"?
Сколько раз вам повторить, что ваша функция HEX не требует?
UPD о том, что в итоге ваша читалка регистров вообще не заработает так, как вы себе вообразили - я уже не пишу. Не верите - ну попробуйте сами. Но бредятину про перевод Стринг в Хекс или наоборот - уже надоело читать. Учитесь пользлваться гуглем, что ли. если IQ не хвататет учебник понять. Набираете "hex string to int" и читаете ссылки
Раньше, в эпоху МП, подобное называлось монитор-отладчик. И это был базовый софт для голого железа.
Только, полагаю, там программисты писали в программах слова типа mov, jnz , а не for и malloc.
Поэтому тогда был смысл в рассматривания содержимого регистров, а сейчас - не особо. Я бы даже склонялся к тому, что изучение регистров после работы компилятора больше похоже на занятие главного героя фильма "Игры разума".
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра? разве не так в этом коде?
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра? разве не так в этом коде?
если это то, что вам надо - что вас еще не устраивает?
хм, а зачем b - типа лонг? :)))
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра? разве не так в этом коде?
Только переменная b получает не то, что я отправляю в монитор. и мне бы хотелось чтобы она получила, то что я отправил. например я отпрвил 1А и она получила величину 1А A HEX это будет BIN или DEC это не важно., главное чтобы метод Serial.print(_SFR_IO8(b)) вывел результат в монитор
Только переменная b получает не то, что я отправляю в монитор. и мне бы хотелось чтобы она получила, то что я отправил
дерево, так тебе второй день о том и толкуют. что ты Си не знаешь. И строчки от чисел не отличаешь совсем. А ты отправляешь в монитор строку, читаешь из нее символ, а вы итоге тебе нужно число. Вот в этих трех типах данных, как в трех соснах. ты и заблудился.
А все потому, что хочешь читать какие регистры, не выучив таблицу умножения.
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра? разве не так в этом коде?
если это то, что вам надо - что вас еще не устраивает?
хм, а зачем b - типа лонг? :)))
Она еще char у меня была...)
У меня времени конечно не так много, как я написал, но есть... я заступорился на этом.. и думал что мне подскажут как это сделать понятными мне примерами. Если это отнимает много времени, проходите мимо. и пусть Вас не коробит, что я отверткой в регистры полез...
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра?
Ну, и? Напиши не 0xF, а 15 и получишь SFR #15.
Хочешь писать - 0xF, позаботься о конвертации - strtol().
Додумывать за тебя компилятор языка Си не собирается. Даже если начнешь забивать шуруп лезвием топора - ему будет похеру.
и думал что мне подскажут как это сделать понятными мне примерами.
У тебя нет знаний, чтобы это понимать, в принципе. Это как объяснять ядерный реактор человеку, не умеющему сложить 2 и 2. И не хотящему учиться.
Она еще char у меня была...)
начни с понимания простых вещей.
1. Символ '1' не равен числу 1
2. В строке "1А". что ты посылаешь - два символа. А оператор read() читает только один. Значит, чтобы принять "1А" - нужно городить цикл, принимать символы, собирать их в строку, научится различать конец посылки...
Для человека, который в жизни не прочел ни одного учебника - это высший пилотаж. самому не освоить.
Только переменная b получает не то, что я отправляю в монитор. и мне бы хотелось чтобы она получила, то что я отправил
дерево, так тебе второй день о том и толкуют. что ты Си не знаешь. И строчки от чисел не отличаешь совсем. А ты отправляешь в монитор строку, читаешь из нее символ, а вы итоге тебе нужно число. Вот в этих трех типах данных, как в трех соснах. ты и заблудился.
А все потому, что хочешь читать какие регистры, не выучив таблицу умножения.
Дерево и без Вас это знает, что строка и число это разные вещи, и признает, что оно не хочет сейчас изучать строки целый год, чтобы посмотреть в регистр...просит Вас напишите короткое преобразование, дайте посмотреть, как это делается... Либо возьмите на себя ответственность положась на свой большой опыт, заявить что задумка никогда не может быть воплощена в жизнь, т.к такое преобразование не выполнить.
Она еще char у меня была...)
начни с понимания простых вещей.
1. Символ '1' не равен числу 1
2. В строке "1А". что ты посылаешь - два символа. А оператор read() читает только один. Значит, чтобы принять "1А" - нужно городить цикл, принимать символы, собирать их в строку, научится различать конец посылки...
Для человека, который в жизни не прочел ни одного учебника - это высший пилотаж. нсамому не освоить.
Я это знаю. неужели вы это не понимаете?
Какой максимальный размер числа может быть в переменной b, чтобы выражение _SFR_IO8(b) не обращалось в бред?
Дерево и без Вас это знает, что строка и число это разные вещи, и признает, что оно не хочет сейчас изучать строки целый год, чтобы посмотреть в регистр...просит Вас напишите короткое преобразование, дайте посмотреть, как это делается...
нет
Не обманывай себя, если б тебе можно было дать короткий пример и дальше ты бы все понял - ты давно нашел бы это в гугле сам.
Но ты абсолютный ноль в предмете - а значит получив одну подсказку - будешь спрашивать еще и еще, каждую запятую. В итоге все равно кончится тем. что тебя пошлют нах. Так что лучше и не начинать.
Я это знаю. неужели вы это не понимаете?
Какой максимальный размер числа может быть в переменной b, чтобы выражение _SFR_IO8(b) не обращалось в бред?
ЛОЛ. Вторая строка 100% подтверждает. что ты этого не знаешь...
Что за тупая привычка "на слабо" брать?
Нахер нужно кому-то писать примеры для ленивой жопы, которая не может в гугле набрать "arduino получить строку из serial", но лезет в низкоуровневые вещи.
Да, вот какая. изменяя значение переменной b , мы изменяем адрес опрашиваемого регистра?
Спасибо, вечером потренируюсь, по моему это то что мне нужно. Надеюсь, Вы верите в меня...)
rkit, Вам тоже спасибо.
Спасибо, вечером потренируюсь, по моему это то что мне нужно. Надеюсь, Вы верите в меня...)
ЛОЛ, 40 сообщений чтобы доперло, что 0xF и 15 - это одно и тоже :)
ТС, попробуй, но имхо без толку, ничего не выйдет. В строке "15" тоже два символа, а передавать и принимать ты их не умеешь