Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Ghost in shell писал(а):Я вроде ясно написал в первом топике
Да и я вроде не заумно писал. Вчитайтесь в свои слова и вдумайтесь хорошенько что Вы пишете. Перечитайте все ответы ещё раз 10-20. Может всё-таки до Вас дойдёт что Вы пишете бред...
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Непонимание физики процесса :)
Контроллер знает только двоичную систему счисления. Другой он не знает. В Си вы можете представлять числа в каком угодно виде. Хоть в двоичной хоть в десятичной хоть в какой другой.
Что вам потом надо сделать с этим числом? Вывести на LCD дисплей? Или еще куда? Я не понимаю почему вам не все равно в какой системе счисления оно есть. Число то одно и тоже...
Если нужно выводить на LCD скажем, используя printf оно будет выводится в десятичной системе по дефолту, если в форматной строке указать %x в 16 ричной... Поясните суть проблемы, иначе имеете шанс не получить ответ на свой вопрос.

ЗЫ я бы не писал этого вообще с вашим отношением к делу, да только делать нечего :)))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Дубль №5 :))
Ghost in shell писал(а):берем из регистра ADRES число, переводим его в десятичное
Его не надо ни в чего перводить. Просто берём и пользуемся в таком виде, в котором удобно. :hunger:
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

Не знаю кому как, а мне удобнее считывать с 4-х разрядного семисегментника содержимое регистра ADRES в десятичной системе.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

считывать с 4-х разрядного семисегментника содержимое регистра ADRES
да ещё и
в десятичной системе
Вы сами то поняли что сказали ?

Всё, выхожу из дискуссии... :facepalm:
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Аlex писал(а):
считывать с 4-х разрядного семисегментника содержимое регистра ADRES
да ещё и
в десятичной системе
Вы сами то поняли что сказали ?

Всё, выхожу из дискуссии... :facepalm:

чего вы до парня докопались, ну сказал неправильно.Считывать показания можно не только контроллером:).Человек хочет считывать визуальные показания с
Ghost in shell писал(а):4-х разрядного семисегментника
глазами.А туда их, в свою очередь, помещает микроконтроллер основываясь на данных ADC, преобразовав их предварительно в удобоваримый для человека вид.

Ghost in shellХочу вас поправить, значение ацп хранится не в процентном виде.
для того, чтобы перевести ваше напряжение и вывести на "дисплей" нужно определить максимальное значение , которое может появиться на входе ацп,определиться с точностью измерений.потом с помощью нехитрых преобразований в виде деления или умножения перевести это значение к физическому показателю(температура,угол поворота,напряжение и тд).
И уже после этого выводить на "дисплей".
А уже сама функция перевода из цифрового в десятичный вид будет заполнять ваш массив чисел на индикаторе.
В поисках истины человек развивается.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

vitalik_1984
Спасибо. Хотя я не могу себе представить, чем еще кроме глаз можно считывать показания с семисегменника. :dont_know: И зачем вообще эта дискуссия на тему "а зачем, а откуда". Ну надо мне перевести восьмибитное двоичное число в десятичное. Если не найду функции, сделаю это "в лоб".

Опорное напряжение у меня = 5В. И на входе АЦП выше небудет. На данном этапе мне абсолютно все равно, что появляется в регистре ADRES: абы одно напряжение отличалось от другого.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Ghost in shell писал(а):vitalik_1984
Спасибо. Хотя я не могу себе представить, чем еще кроме глаз можно считывать показания с семисегменника. :dont_know: И зачем вообще эта дискуссия на тему "а зачем, а откуда". Ну надо мне перевести восьмибитное двоичное число в десятичное. Если не найду функции, сделаю это "в лоб".

Опорное напряжение у меня = 5В. И на входе АЦП выше небудет. На данном этапе мне абсолютно все равно, что появляется в регистре ADRES: абы одно напряжение отличалось от другого.

с опорным определились...а измеряемое?
в теме Attiny2313+DS1307+DS18B20 как раз используется вывод на четыре семи сегм.

вот пример кода кусками

Код: Выделить всё

#include <delay.h> 
#include <bcd.h>
unsigned char digit_out[4], cur_dig;
// ----------
void hex_to_dec(void) {
        unsigned char celie, drob, tmp;
        unsigned int temp, celie_tmp, drob_tmp;
 
        temp = (unsigned int) temperature;                     
       
        if (temperature>=0) {
                digit_out[0]=PROBEL;       // первый символ (сотни) пустой
        }
        else {       
                temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид
                digit_out[0]=MINUS;        // и высветить знак минус (в дальнейшем атрибут отр.темп.)
             };
        digit_out[3]=GRADUS; zpt_ON=1;

        celie_tmp = temp >> 4;     // целая часть числа
        drob_tmp  = temp & 0x000F; // дробная часть числа с точностью 1/16 градуса
               
        celie = (unsigned char) celie_tmp;  // я люблю явное преведение типов
        drob  = (unsigned char) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
       
        //if (celie >= 100) { tmp=bin2bcd(celie-100); digit_out[0] = 1;} else tmp=bin2bcd(celie); // версия для мега8
        tmp=bin2bcd(celie); // версия для тини2313
             
        if ((celie >= 100) || ((digit_out[0] == MINUS) && (celie >= 10))) { //  если больше 100,0 гр. или если темп. меньше -10 точность 1 гр.
                zpt_ON=0;
                digit_out[1] = tmp >> 4;    // десятки
                digit_out[2] = tmp & 0x0F;  // единицы
        }
       
        if ((digit_out[0] == MINUS) && (celie < 10)) { // если темп.меньше 0 и больше -10 точность 0,1 гр.
                digit_out[1]=celie; // единицы
                digit_out[2]=drob;  // дробная часть
        }
       
        if ((digit_out[0] == PROBEL) && (celie < 100)) { // если темп. меньше 100,0 гр и больше 0 гр точность 0,1 гр.
                if (tmp >> 4) digit_out[0] = tmp >> 4; // десятки - если десятков нет то и не показывать
                digit_out[1] = tmp & 0x0F;             // единицы
                digit_out[2]=drob;                     // дробная часть
        }
}  // ----------
В поисках истины человек развивается.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

bin2bcd
unsigned char Bin2Dec ( unsigned char i )
{
return ( ( i / 10 ) * 0x10 + ( i % 10 ) );
} // Bin2Dec
http://www.microchip.ru/phorum/read.php ... 5&t=136035
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Ghost in shell уберите свой гонор подальше, вы говорите полную хрень, и еще злитесь что вам не отвечают.
Для того чтобы выводить число на семисегментник надо написать еще функцию динамической индикации.
Эта функция в виде параметра будет принимать число. А вот какой вы сделаете эту функцию - будет зависеть в какой системе счисления будет происходить вывод.

Если вы возьмете число из вашего регистра АЦП и запишете его в 8 разрядный ПОРТ контроллера, к которому подключены по одному светодиоду - тогда у вас число будет выведено в ДВОИЧНОМ виде.

Для того чтобы вывести его в ДЕСЯТИЧНОМ - нужно знать какой индикатор и написать для него ту функцию, что я выше говорил. И она ничем не похожа на перевод из двоичной в десятичную СС.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

vitalik_1984
спасибо, но вы слишком отклонились от первоначального вопроса. Когда разберусь с функцией sprintf
http://php.spb.ru/php/printf.html
http://www.cplusplus.com/reference/clib ... o/sprintf/
благо, PICC ее поддерживает, выясню, что именно выдает АЦП в регистр ADRES после измерения. Зная входное напряжение несложно подобрать формулу для вывода на семисегментник в удобном для меня виде.
urry
спасибо, но я сначала разберусь с функцией sprintf
BCluster
ну не силен я в терминологии. :dont_know: А если бы злился из-за таких пустяков, уже даавно сидел бы в психушке. Просто мне жалко своего времени: я же не спрашивал, как организовать динамическую индикацию, или в какой системе счисления работает МК. Функцию вывода на семисегментник мне любезно подсказал urry. Она для десятичного числа. Хотябы поэтому мне надо преобразовать из двоичной системы в десятичную.
Последний раз редактировалось Ghost in shell Вт дек 13, 2011 12:17:52, всего редактировалось 2 раза.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Не надо никуда ничего преобразовывать. Просто передайте в эту функцию значение регистра и все. Вы не понимаете сути того, о чем говорите.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Ghost in shell писал(а):vitalik_1984
спасибо, но вы слишком отклонились от первоначального вопроса. Когда разберусь с функцией sprintf

вы сами похоже еще не решили чего же вам таки нужно.
чтобы вам "увидеть" что выдает ацп в регистр ADRES нужно просто присвоить результат преобразования любому порту,предварительно отбросив лишние два бита.никаких sprintf не нужно

Ghost in shell писал(а):Зная входное напряжение несложно подобрать формулу

А разве вы сейчас не знаете какое напряжение? я так считал, что от до 5 вольт вы же сами писали.
Ghost in shell писал(а): Она для десятичного числа. Хотябы поэтому мне надо преобразовать из двоичной системы в десятичную.

Она не для десятичного числа, она переводит двоичное в десятичное.

Код: Выделить всё

tmp=bin2bcd(celie);

я вам пример кода привел, где это преобразование делается.
тут celie это переменная с двоичным числом а tmp уже в вашем необходимом формате
Кстати вы зря примером брезгуете там точно такая же задача как у вас раскрывается.как раз точка где нужно ставится.
В поисках истины человек развивается.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Вопросы по С/С++ (СИ)

Сообщение demiurg301 »

Подскажите как массив в параметры функции вставить?

Вот так делаю со строкой
array_find(u0_buff,150, "string",6)
А вот такой байтовый массив как вставить без предварительного объявления {0x04,0xFD,0x00.............} ? Или нельзя методами С такое реализовать?
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Можно. Для этого надо в функцию передать указатель на этот массив.

char* buff;

array_find(u0_buff,150, buff,6)

Рекомендую почитать про указатели в Си, тема очень обширная, описать ее в одном посте весьма проблематично ) если будут вопросы - спрашивайте.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Вопросы по С/С++ (СИ)

Сообщение demiurg301 »

BCluster писал(а):Можно. Для этого надо в функцию передать указатель на этот массив.

char* buff;

array_find(u0_buff,150, buff,6)

Рекомендую почитать про указатели в Си, тема очень обширная, описать ее в одном посте весьма проблематично ) если будут вопросы - спрашивайте.


А, ну так то понятно... Так и делаю... С указателями разобрался более менее.

Просто со строками вот такое прокатывает.
т.е. можно было бы так написать

flash unsigned char str[]="AT+CPIN";
POLL(str,2);

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

POLL("AT+CPIN",2) ;

- вроде работает.

А вот как такое реализовать для
flash unsigned char str[5]={0x10,0x5B,0xFE,0x59,0x16} ?
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

demiurg301 писал(а):flash unsigned char str[5]={0x10,0x5B,0xFE,0x59,0x16}

Можно

Код: Выделить всё

POLL("\x10\x5B\xFE\x59\x16", 2); // в вашем случае


demiurg301 писал(а):Но неудобно то, что реальные значения в самой программе скрываются за именами переменных.

Не переменных а констант в данном случае. Да и неправильный это подход.
Правильнее эти массивчики прятать в дефайны.

Код: Выделить всё

#define ATCPIN      "AT+CPIN"
#define SOMEBYTES   "\x10\x5B\xFE\x59\x16"


Вдруг когда нибудь понадобится изменить эти команды. А я думаю что вызываются они неоднократно. Так поменяете один раз дефайн, а иначе придется во всем коде их выиискивать :)

Да и еще имхо дефайны лучше в .h файл класть... но это дело вкуса
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Вопросы по С/С++ (СИ)

Сообщение demiurg301 »

BCluster писал(а):Можно

Вдруг когда нибудь понадобится изменить эти команды. А я думаю что вызываются они неоднократно. Так поменяете один раз дефайн, а иначе придется во всем коде их выиискивать :)
Да и еще имхо дефайны лучше в .h файл класть... но это дело вкуса


О, то что надо :)

Практически однократно(максимум 2-3 раза и то в одном месте программы) . При этом команд столько, что лазить за каждой командой(посмотреть где-чего) в отдельный .h фаил напряжно. Когда смотришь на кучу индексных имён, - программа как бы "оторвана от реальности".
Вот таких вот последовательностей - из 3-5 байт - штук 70 в разных местах программы - и каждая однократно сравнивается или в порт отправляется.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Ну дело хозяйское :) Я раньше думал также как и вы, но в итоге пришел к выводу что лучше абстрагироваться от этой белиберды. Можно ведь дать осмысленное имя - типа #define CONNECT "AT+asdjfljkasdf"
И так для всех. Ноу еще раз повторю - дело хозяйское :)
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Вопросы по С/С++ (СИ)

Сообщение Ghost in shell »

Не надо никуда ничего преобразовывать. Просто передайте в эту функцию значение регистра и все. Вы не понимаете сути того, о чем говорите.

BCluster
Спасибо! Проверил, работает.
Значение регистра можно так присвоить переменной ?

Код: Выделить всё

strOut.Out_Indik = ADRES;


vitalik_1984
А разве вы сейчас не знаете какое напряжение? я так считал, что от до 5 вольт вы же сами писали.

это опорное у меня +5В. Я так понимаю, выше опорного АЦП не меряет? Запятые мне сейчас ненужны - хочу знать, какому напряжению на входе соответствует какое число в ADRES. Мне для аналоговой клавиатуры надо задать соответствие, и мне действительно все равно, что там будет. Абы такое-то число (точнее, диапазон чисел) соответствовало такой-то клавише.
Кот гуляет сам по себе, но вблизи холодильника.
Ответить

Вернуться в «Разные вопросы по МК»