Преобразование результата работы АЦП в текст

May 11, 2014 by admin Комментировать »

Создаём новый проект, как мы делали это раньше, который я назову conv Напишем программу:

#include <pic16f887h> typedef unsigned int word

word at 0x2007 CONFIG1 = 0x2FF2

char text[4]                //массив для хранения текста unsigned int dat = 1023     //целое для преобразования char tmp = 0                //временная переменная

void main(void) {

tmp = dat/1000                    //сколько тысяч в числе

if (tmp == 0)text[3] = 48         //если ноль, то ноль и запишем else text[3] = tmp + 48     //иначе переведём в символ цифры

if (tmp = 0) dat = dat – 1000*tmp //удалим тысячи из числа tmp = dat/100                     //сколько сотен в числе

if (tmp == 0) text[2] = 48        //если ноль, то ноль и запишем else text[2] = tmp + 48     //иначе переведём в символ цифры

if (tmp = 0) dat = dat – 100*tmp //удалим тысячи из числа tmp = dat/10                //сколько десятков в числе

if (tmp == 0) text[1] = 48        //если ноль, то ноль и запишем else text[1] = tmp + 48     //иначе переведём в символ цифры

if (tmp = 0) dat = dat – 10*tmp  //если не ноль, то удалим десятки text[0] = dat + 48                //переведём остаток в символ цифры

for (;) {                         //бесконечный цикл

}

}

После трансляции программы и запуска отладчика я добавлю наблюдение за переменной text Поскольку эта переменная (массив) из четырёх байтов, я изменю размер переменной (щелчок правой клавишей мышки по переменной):

Рис 515 Проверка работы программы в MPLABX

Как и в случае изменения размера переменной, если щёлкнуть правой клавишей мышки по значению этой переменной, то из выпадающего меню можно выбрать вид отображения На рисунке символьное отображение значения

Когда я дошёл до этого места в рассказе, мне захотелось проверить преобразование других чисел Я изменил значение переменной dat на 750, начал было показывать, как всё чудесно получилось, но…

Рис 516 Странный результат при конвертации числа 750

Я много раз повторял программу в разных вариантах, повторял с другими числами, выводил и в символьном виде, и в шестнадцатеричном… Я проверил отладку исходной программы в MicroC и не обнаружил странностей Полученный результат не только озадачил меня, но и заинтриговал Программа достаточно простая, чтобы в ней не разобраться, а разобраться в происходящем не получается

Чтобы избавиться от некоторых сомнений, я в программе MicroC добавил вывод на ЖКИ Результат работы программы я сравнил с выводом на ЖКИ программы (напомню, программа одна и та же) оттранслированной в MPLABX

Рис 517 Результат работы hex-файла из MicroC

Любые числа, присваиваемые в этом случае переменной dat, правильно отображаются после трансляции на ЖКИ

Рис 518 Результат работы hex-файла из MPLABX

Не хочу вас утомлять подробностями экспериментов, приведу только результат

Формально операция tmp = dat/100 может не вызывать сомнений, при том, что первая переменная имеет байтовый тип, а вторая беззнаковое целое После деления получается число в диапазоне 0-9, которое умещается в байт Язык Си не очень требователен к применению типов данных, оставляя это на совести программиста Но разные компиляторы могут интерпретировать происходящее по-разному

Достаточно в программе, транслируемой компилятором SDCC, изменить тип данных переменной:

unsigned int tmp = 0

чтобы полученный hex-файл правильно отображал любые числа

Рис 519 Окончательная проверка программы в режиме отладки Тот же результат даёт и программа, выводящая число на ЖКИ

Можно было бы не рассказывать об этом казусе, но это хороший пример того, что следует быть очень внимательным при использовании языка Си, и не оставлять без внимания любые странности и неполадки

Вернёмся к первоначальной задаче

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты