AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
28.01.2021, 21:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,504
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: CodevisionAVR си
Не получается никак и не можете разобраться что есть куда? Тогда забейте и возьмите стандартные функции преобразования atoi и itoa, входящие в заголовочник stdlib.h
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
28.01.2021, 21:48
|
|
Прописка
Регистрация: 07.01.2010
Сообщений: 104
Сказал спасибо: 60
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: CodevisionAVR си
Заменил char a, b, c, d;
на int a, b, c, d;
Заработало! Вопрос снят.
Всем спасибо!
|
|
|
|
28.01.2021, 21:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,417
Сказали Спасибо 894 раз(а) в 581 сообщении(ях)
|
Re: CodevisionAVR си
напишите в программе ADC_temp=5; и проверьте,получается ли d=5. То есть алгоритм преобразования. Затем число 37,например. И так далее для всех разрядов.
|
|
|
|
28.01.2021, 22:11
|
|
Прописка
Регистрация: 07.01.2010
Сообщений: 104
Сказал спасибо: 60
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: CodevisionAVR си
Сообщение от baiderin
|
напишите в программе ADC_temp=5; и проверьте,получается ли d=5. То есть алгоритм преобразования. Затем число 37,например. И так далее для всех разрядов.
|
У меня проблема была именно в:
a = 0x30; b = 0x37; c = 0x36; d = 0x35;
ADC = (a & 0x0F) * 1000 + (b & 0x0F) * 100 + (c & 0x0F) * 10 + (d & 0x0F);
a, b, c, d были заданы как char.
Заменил на int.
А в программе по преобразованию в десятичное - проблем нет.
|
|
|
|
28.01.2021, 23:03
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 586
Сказал спасибо: 222
Сказали Спасибо 232 раз(а) в 152 сообщении(ях)
|
Re: CodevisionAVR си
Сообщение от Виктор_М
|
ADC = (a & 0x0F) * 1000 + (b & 0x0F) * 100 + (c & 0x0F) * 10 + (d & 0x0F);
a, b, c, d были заданы как char.
Заменил на int.
|
зачем? все что нужно было сделать указать размерность констант unsigned integer
Код:
|
ADC = (a & 0x0F) * 1000U + (b & 0x0F) * 100U + (c & 0x0F) * 10U + (d & 0x0F); |
и да, это есть в мануале на ваш компилятор раздел 4.6
ЗЫ из-за проблем протеза при отображении регистров быстрого доступа, переменные принудительно адресованы в ОЗУ общего назначения на результат это не влияет.
Последний раз редактировалось DmitriyVDN; 29.01.2021 в 00:46.
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
29.01.2021, 18:29
|
|
Прописка
Регистрация: 07.01.2010
Сообщений: 104
Сказал спасибо: 60
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: CodevisionAVR си
Сообщение от DmitriyVDN
|
зачем? все что нужно было сделать указать размерность констант unsigned integer
Код:
|
ADC = (a & 0x0F) * 1000U + (b & 0x0F) * 100U + (c & 0x0F) * 10U + (d & 0x0F); |
и да, это есть в мануале на ваш компилятор раздел 4.6
Вложение 160305
ЗЫ из-за проблем протеза при отображении регистров быстрого доступа, переменные принудительно адресованы в ОЗУ общего назначения на результат это не влияет.
|
Спасибо огромнейшее, но я если честно не совсем понял.
То есть компилятор не будет правильно считать в случае если переменная a типа char
Код:
|
int ADC;
ADC = a * 100; |
если a сделать типа int то всё будет корректно работать.
Правильно?
|
|
|
|
29.01.2021, 19:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,727
Сказал спасибо: 2,417
Сказали Спасибо 894 раз(а) в 581 сообщении(ях)
|
Re: CodevisionAVR си
Будет переполнение и старшая часть отбросится. При умножении на 100 и 1000.
|
|
|
Сказали "Спасибо" baiderin
|
|
|
29.01.2021, 21:42
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 586
Сказал спасибо: 222
Сказали Спасибо 232 раз(а) в 152 сообщении(ях)
|
Re: CodevisionAVR си
Сообщение от Виктор_М
|
То есть компилятор не будет правильно считать в случае если переменная a типа char
Код:
int ADC;
ADC = a * 100;
если a сделать типа int то всё будет корректно работать.
Правильно?
|
именно в такой записи без разницы какой будет тип у а , результат будет int тк ADC у вас int.
но в длинной записи при сложении нескольких выражений, для каждого выражения создается временная переменная размерностью членов выражения
У вас "a" (тип char) * 1000 ( тип int) результат будет int.
"a" (тип char) * 100 и 10 (тип char) результат будет char , старший бит буде отброшен,
но если вы принудительно укажите размерность или для выражения, или просто для константы 100U или 10U результат уже будет int .
грабли можно обойти изменив настройки компилятора , поставив птицы в эти пункты
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
30.01.2021, 00:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,792
Сказал спасибо: 2,912
Сказали Спасибо 3,120 раз(а) в 2,111 сообщении(ях)
|
Re: CodevisionAVR си
А потом все эти "%" и "/" будут вставлены в обработчик прерывания и... курсант Виктор_М попробует поднять эту халабуду в воздух.
__________________
Экзорцист 40-го уровня.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ForcePoint за это сообщение:
|
|
|
30.01.2021, 06:29
|
|
Прописка
Регистрация: 07.01.2010
Сообщений: 104
Сказал спасибо: 60
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: CodevisionAVR си
Сообщение от ForcePoint
|
А потом все эти "%" и "/" будут вставлены в обработчик прерывания и... курсант Виктор_М попробует поднять эту халабуду в воздух.
|
Есть поднять в воздух халабуду!
Последний раз редактировалось Виктор_М; 30.01.2021 в 06:32.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:59.
|
|