Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перекодировка для ЖКИ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
goodking
Привет! Не могу разобраться, как результат с АЦП перевести в подходящий для вывода на ЖКИ, помогите плз! МК Silabs c8051F120, ЖКИ 160203В.
barabek
Конкретизируйте, пожалуйста, Ваш вопрос. Что конкретно Вас интересует. Перевод выходного кода ацп в напряжение, выраженное в переменной определенного типа ( float, int ...) U=Ladc/(2^N)*Uref*Kdiv, Ladc - выходной код ацп, Kdiv - коэффициент предделителя. Либо что-то ещё?
goodking
У меня уже имеется готовый вычисленный результат с АЦП, но на ЖКИ его вывести нельзя, т.к. нужно определенным образом преобразовать в "понятный" ЖКИ, вот я и спрашиваю, как это лучше сделать?
7_on_off
Вы задали вопрос, так укажите ссылку на ЖКИ 160203В. похоже это экзотика.
esaulenka
Беглый осмотр гугля показал, что оно построено на Seico M1632, а он, в свою очередь - аналог 44780, так что никакой экзотики. Хотя могу ошибаться, конечно, изучать вопрос детально лень.

Впрочем, да, вопрос чЮдный. Подозреваю, топикстартер пользуется ассемблером, т.к. я ещё не видел ни одной книжки про си, в которой не упоминался бы printf ;-)
goodking
Цитата(7_on_off @ Dec 21 2009, 17:03) *
Вы задали вопрос, так укажите ссылку на ЖКИ 160203В. похоже это экзотика.

пожалуйста http://www.arihav.com/Products/DataSheet/L...-%20Catalog.pdf smile.gif

Цитата(esaulenka @ Dec 21 2009, 17:21) *
Беглый осмотр гугля показал, что оно построено на Seico M1632, а он, в свою очередь - аналог 44780, так что никакой экзотики. Хотя могу ошибаться, конечно, изучать вопрос детально лень.

Впрочем, да, вопрос чЮдный. Подозреваю, топикстартер пользуется ассемблером, т.к. я ещё не видел ни одной книжки про си, в которой не упоминался бы printf ;-)

нет-нет, printf ни при чем, нужно как-то преобразовать результат с АЦП в шестнадцатиричный, либо в двоичный, который можно вывести на ЖКИ
7_on_off
ЖКИ состоит из 16 сегментов. По моему его лучше использовать как барграф. Разбить динамический диапазон АЦП на 16 частей и выводить результат посегментно.
goodking
если точнее то преобразовать в тип unsigned char
7_on_off
Смотря что вы собираетесь отображать на дисплее, какой процесс и с какой точностью.
goodking
Цитата(7_on_off @ Dec 21 2009, 18:53) *
Смотря что вы собираетесь отображать на дисплее, какой процесс и с какой точностью.

мне нужно отображать непрерывное измерение температуры, с точностью ну где-то до 4-го знака!
esaulenka
Цитата(goodking @ Dec 21 2009, 18:26) *
с точностью ну где-то до 4-го знака!

Хорошее начало. Предоставьте, пожалуйста расчёты, подтверждающие, что Вы можете измерить температуру с такой точностью.


Хм. unsigned char с точностью до четвёртого знака. Звучит... smile.gif

Модератор (rezident). Фиксирую оффтопик в сообщении. Вопрос топикстартера про способы отображения, а не про точность измерения!
rezident
Цитата(goodking @ Dec 21 2009, 18:12) *
Привет! Не могу разобраться, как результат с АЦП перевести в подходящий для вывода на ЖКИ, помогите плз! МК Silabs c8051F120, ЖКИ 160203В.
Не ленитесь пользоваться поиском! Тема двоично-десятичного преобразования (BCD - Binary-Coded Decimal) мусолится на форуме постоянно.
Навскидку
http://electronix.ru/forum/index.php?showtopic=66009
http://electronix.ru/forum/index.php?showtopic=68217
Или вот статья из Википедии
goodking
Цитата(rezident @ Dec 21 2009, 23:28) *
Не ленитесь пользоваться поиском! Тема двоично-десятичного преобразования (BCD - Binary-Coded Decimal) мусолится на форуме постоянно.

мне нужно преобразовать в строку то-есть в char smile.gif

пробую так
Код
temperaturefin = (temperature-41857)/154;//это вычисление температуры
    sprintf(buf,"%d",temperaturefin);


в окне просмотра показывает нормальную температуру, а на ЖКИ высвечивается 01, непонятно smile.gif
Dog Pawlowa
Цитата(goodking @ Dec 22 2009, 13:55) *
непонятно smile.gif

Непонятно, чего Вы веселитесь, вместо того, чтобы помочь желающим помочь Вам.
Какие типы переменных?
Какая переменная правильно видна в окне отладки?
Какие их значения?
temperature?
temperaturefin?
buf?
goodking
Цитата(Dog Pawlowa @ Dec 22 2009, 14:49) *
Какие типы переменных?
Какая переменная правильно видна в окне отладки?

в окне отладки ставится по умолчанию, предположительно int

а вот интересно, Вы спросили про значение buf в окне, я посмотрел, высветило следующее- 0x2a "0", хотя temperaturefin=14(т.е. правильно)
Dog Pawlowa
Цитата(goodking @ Dec 22 2009, 14:57) *
а вот интересно ...

cranky.gif Вам трудно ответить на конкретные вопросы? Зачем тему создавали?
goodking
извините, temperaturefin-long

все типы переменных-long
rezident
Цитата(goodking @ Dec 22 2009, 14:55) *
мне нужно преобразовать в строку то-есть в char smile.gif
Если бы вы потрудились почитать по ссылкам, то могли бы понять, что для перевода бинарного представления числа в символьное для начала нужно его (число) преобразовать в двоично-десятичное представление, где каждая тетрада (полубайт) имеет значение от 0 до 9. Дальнейшее преобразование в символы ASCII не представляет трудности, поскольку для этого достаточно к каждой тетраде прибавить код символа '0' - 0x30. В языке Си имеются и готовые функции для преобразования чисел в строку символов. Почитайте какой-нибудь "букварь" по языку Си наконец.
MrYuran
Цитата(goodking @ Dec 22 2009, 14:38) *
извините, temperaturefin-long
все типы переменных-long

buf должен быть не лонг, а указатель на char[]
Попробуйте char buf[10] (ну или 20, 30 - сколько надо символов)

Цитата(rezident @ Dec 22 2009, 15:10) *
В языке Си имеются и готовые функции для преобразования чисел в строку символов. Почитайте какой-нибудь "букварь" по языку Си наконец.

Дык эта... sprintf вроде как раз это и делает. Только ему указатель на правильный буфер надо подсунуть
Цитата
sprintf(buf,"%d",temperaturefin);
goodking
Цитата(MrYuran @ Dec 22 2009, 16:54) *
buf должен быть не лонг, а указатель на char[]
Попробуйте char buf[10] (ну или 20, 30 - сколько надо символов)


Дык эта... sprintf вроде как раз это и делает. Только ему указатель на правильный буфер надо подсунуть

нет, buf у меня как раз обьявлен char buf[10]; но все -равно на выходе какая-то ерунда выходит, 0x10 "0l"
MrYuran
Цитата(goodking @ Dec 22 2009, 16:10) *
нет, buf у меня как раз обьявлен char buf[10]; но все -равно на выходе какая-то ерунда выходит, 0x10 "0l"

а "HelloWorld" выводит?
если константой забить, причём прямо в буфер
goodking
Цитата(MrYuran @ Dec 22 2009, 17:26) *
а "HelloWorld" выводит?
если константой забить, причём прямо в буфер

Выводит!
demiurg_spb
Цитата(rezident @ Dec 21 2009, 23:28) *
Не ленитесь пользоваться поиском! Тема двоично-десятичного преобразования (BCD - Binary-Coded Decimal) мусолится на форуме постоянно.
А причём тут BCD, простите? Ему надо просто коды АЦП пересчитать в температуру, а её отобразить в виде строки на дисплее.
goodking
Все, разобрался, всем большое спасибо! biggrin.gif
rezident
Цитата(demiurg_spb @ Dec 22 2009, 19:40) *
А причём тут BCD, простите?
А что по-вашему делает sprintf при указании формата %d, как не BCD + конвертация в ASCII?
Цитата(demiurg_spb @ Dec 22 2009, 19:40) *
Ему надо просто коды АЦП пересчитать в температуру, а её отобразить в виде строки на дисплее.
Ну да. Загвоздка была как раз в отображении.
Цитата(goodking @ Dec 22 2009, 20:29) *
Все, разобрался, всем большое спасибо! biggrin.gif
Разобрались - хорошо. Только нужно огласить причину, чтобы у отвечающих не пропало желание в следующий раз вновь помогать вам.
goodking
Цитата(rezident @ Dec 22 2009, 18:47) *
А что по-вашему делает sprintf при указании формата %d, как не BCD + конвертация в ASCII?
Ну да. Загвоздка была как раз в отображении.
Разобрались - хорошо. Только нужно огласить причину, чтобы у отвечающих не пропало желание в следующий раз вновь помогать вам.

причина была в неверном присвоении типов используемых переменных!
demiurg_spb
Цитата(rezident @ Dec 22 2009, 18:47) *
А что по-вашему делает sprintf при указании формата %d, как не BCD + конвертация в ASCII?
Это да.
Цитата(rezident @ Dec 22 2009, 15:10) *
для начала нужно его (число) преобразовать в двоично-десятичное представление, где каждая тетрада (полубайт) имеет значение от 0 до 9.
Вы просо усложняете немного. Зачем ему тут вообще знать про упакованный BCD? ИМХО это немного лишне для совсем начинающегоsmile.gif
rezident
Цитата(demiurg_spb @ Dec 22 2009, 23:58) *
Это да.Вы просо усложняете немного. Зачем ему тут вообще знать про упакованный BCD? ИМХО это немного лишне для совсем начинающегоsmile.gif
Как раз начинать нужно с основ языка, типовых алгоритмов и примитивов. В следующий раз ему понадобиться float на дисплей выводить и sprintf начнет требовать такой размер ОЗУ для стека, которого просто нет в кристалле. Что вы предложите: взять кристалл "пожирнее" или самостоятельно написать простой алгоритм вывода float на индикацию?
goodking
Цитата(rezident @ Dec 23 2009, 09:53) *
Как раз начинать нужно с основ языка, типовых алгоритмов и примитивов. В следующий раз ему понадобиться float на дисплей выводить и sprintf начнет требовать такой размер ОЗУ для стека, которого просто нет в кристалле. Что вы предложите: взять кристалл "пожирнее" или самостоятельно написать простой алгоритм вывода float на индикацию?

А что в таком случае надо сделать??
demiurg_spb
Цитата(goodking @ Dec 23 2009, 10:34) *
А что в таком случае надо сделать??
Застрелиться.
Цитата(rezident @ Dec 23 2009, 08:53) *
Как раз начинать нужно с основ языка, типовых алгоритмов и примитивов. В следующий раз ему понадобиться float на дисплей выводить и sprintf начнет требовать такой размер ОЗУ для стека, которого просто нет в кристалле. Что вы предложите: взять кристалл "пожирнее" или самостоятельно написать простой алгоритм вывода float на индикацию?
Вариантов достаточно. Ну если так пойти то начинать надо было с архитектуры MCU, понятиях стек, способы адресации, способы передачи аргументов. Изучить ассемблер хотя бы одного самого примитивного семейства. А уже потом браться за Сиsmile.gif Ну а ещё раньше системы исчисления, форматы чисел, булеву алгебру и т.д. и т.п. Спорить дпльше не вижу смысла. Главное не загубить в человеке желания учиться и саморазвиваться! Остальное приложится!
goodking
Цитата(demiurg_spb @ Dec 23 2009, 13:29) *
Застрелится.

Что сделать с программой, а не с собой? smile.gif
demiurg_spb
Цитата(goodking @ Dec 23 2009, 12:33) *
Что сделать с программой, а не с собой? smile.gif
Нет, тут Вы не правы, с программой можно больше ничего пока не делать.
А вот собой заняться стоит! Купить пару умных книжек по Си и изучить их внимательно, как вам уже здесь советовали.
goodking
Цитата(demiurg_spb @ Dec 23 2009, 12:46) *
Нет, тут Вы не правы, с программой можно больше ничего пока не делать.
А вот собой заняться стоит! Купить пару умных книжек по Си и изучить их внимательно, как вам уже здесь советовали.

Хорошо, спасибо smile.gif
goodking
Читаю книжку по МК, там есть пример с выводом результата на LCD, в программе указана следующая таблица
Код
code byte LCDCODE[132] = {0xdb,0xd1,0xdc,0xd9,0x41,0xA0,0x42,0xa1,
                          0xe0,0x45,0xA3,0xA4,0xa5,0xa6,0x4b,0xa7,
                          0x4d,0x48,0x4f,0xa8,0x50,0x43,0x54,0xa9,
                          0xaa,0x58,0xe1,0xab,0xac,0xe2,0xad,0xae,
                          0x62,0xaf,0xb0,0xb1,0x61,0xb2,0xb3,0xb4,
                          0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,
                          0xbc,0xbd,0x6f,0xbe,0x70,0x63,0xbf,0x79,
                          0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,
                          0xc4,0xc5,0xc6,0xc7};


я не совсем понимаю, для чего эта подпрограмма, и как она используется, обьясните пожалуйста!
rezident
Посмотрите и сравните кодировку символов символьных LCD, основанных на контроллере HD44780U и его клонах, с кодировками Win-1251, KOI-8R.
http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
DpInRock
Слишком тихо телепатируете текст подпрограммы.
По тем обрывкам, что слышу сквозь ментальную атаку пришельцев, полагаю, что символы для вывода на LCD
имеют вполне определенную собственную кодировку. Которая не обязана совпадать с какой-либо существующей, например DOS (и в ней самой куча кодировок, не совпадающих).

Самый простой способ перекодировки из одной системы в другую: входной параметр служит индексом массива. А значение массива - выходным параметром.

Таким образом, чтобы перекодировать один байт в любой другой байт нужна таблица размером в 256 байт.
goodking
То-есть таблица служит для перевода символов, которые не поддерживает ЖКИ?
SasaVitebsk
Цитата(DpInRock @ Dec 24 2009, 14:54) *
Таким образом, чтобы перекодировать один байт в любой другой байт нужна таблица размером в 256 байт.

Точнее 128, так как младшая половина обычно совпадает.

Если брать конкретно HD44780 и выводить в формате WIN (1251), то выглядит так:

Код
const uint8_t __flash TabWin[] =    
{
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,   // псевдографика
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,   // псевдографика
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,   // псевдографика
0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,   // псевдографика
0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,   // псевдографика
0xa2, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,   // Ё    псевдографика
0xfe, 0xff, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec,   // псевдографика
0xb5, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xfd, 0xff,   // ё    псевдографика
0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4,   // АБВГДЕЖЗ
0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f, 0xa8,   // ИЙКЛМНОП
0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab,   // РСТУФХЦЧ
0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,   // ШЩЪЫЬЭЮЯ
0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7,   // абвгдежз
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f, 0xbe,   // ийклмноп
0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0,   // рстуфхцч
0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,   // шщъыьэюя
};


Начало п/п вывода примерно так
Код
       if(c>=0x80)
       {                            // Если символ не латинский, то
         c -= 0x80;                    // Уменьшить таблицу
         c = TabWin[c];                // Перекодировать
       }
SysRq
Отображающуюся на экране букву следует воспринимать как два компонента: графическое изображение символа, и код символа.
Код символа - первичные данные, а изображение символа - функция от кода символа. Функция эта основана на кодировке - таблице соответствий кодов их графическим изображениям.

Суть в том, что в разных кодировках одинаково изображаемые символы имеют разный код, или одинаковый код символа отображается в разные графические изображения в разных кодировках. То что в одной кодировке выглядит как "Абвгд", в другой выглядит как "бВЧЗД", но при этом в виде кодов символов оно одинаково.

Т.о., если вы хотите чтобы набранная строка "Превед" в исходнике вашей программы на компьютере, в кодировке DOS (как предлагают авторы вашей книжки), осталась выглядеть как "Превед" и на LCD-экранчике вашего устройства, у которого своя специальная кодировка, то необходимо преобразовывать коды символов этой строки таким образом, чтобы совпали графические изображения символов. Преобразовывать на основе двух кодовых страниц.

// Ваш К.О.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.