Да и я вроде не заумно писал. Вчитайтесь в свои слова и вдумайтесь хорошенько что Вы пишете. Перечитайте все ответы ещё раз 10-20. Может всё-таки до Вас дойдёт что Вы пишете бред...Ghost in shell писал(а):Я вроде ясно написал в первом топике
Вопросы по С/С++ (СИ)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Непонимание физики процесса 
Контроллер знает только двоичную систему счисления. Другой он не знает. В Си вы можете представлять числа в каком угодно виде. Хоть в двоичной хоть в десятичной хоть в какой другой.
Что вам потом надо сделать с этим числом? Вывести на LCD дисплей? Или еще куда? Я не понимаю почему вам не все равно в какой системе счисления оно есть. Число то одно и тоже...
Если нужно выводить на LCD скажем, используя printf оно будет выводится в десятичной системе по дефолту, если в форматной строке указать %x в 16 ричной... Поясните суть проблемы, иначе имеете шанс не получить ответ на свой вопрос.
ЗЫ я бы не писал этого вообще с вашим отношением к делу, да только делать нечего
Контроллер знает только двоичную систему счисления. Другой он не знает. В Си вы можете представлять числа в каком угодно виде. Хоть в двоичной хоть в десятичной хоть в какой другой.
Что вам потом надо сделать с этим числом? Вывести на LCD дисплей? Или еще куда? Я не понимаю почему вам не все равно в какой системе счисления оно есть. Число то одно и тоже...
Если нужно выводить на LCD скажем, используя printf оно будет выводится в десятичной системе по дефолту, если в форматной строке указать %x в 16 ричной... Поясните суть проблемы, иначе имеете шанс не получить ответ на свой вопрос.
ЗЫ я бы не писал этого вообще с вашим отношением к делу, да только делать нечего
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Дубль №5

Его не надо ни в чего перводить. Просто берём и пользуемся в таком виде, в котором удобно.Ghost in shell писал(а):берем из регистра ADRES число, переводим его в десятичное

- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Вопросы по С/С++ (СИ)
Не знаю кому как, а мне удобнее считывать с 4-х разрядного семисегментника содержимое регистра ADRES в десятичной системе.
Кот гуляет сам по себе, но вблизи холодильника.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
да ещё исчитывать с 4-х разрядного семисегментника содержимое регистра ADRES
Вы сами то поняли что сказали ?в десятичной системе
Всё, выхожу из дискуссии...

- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Аlex писал(а):да ещё исчитывать с 4-х разрядного семисегментника содержимое регистра ADRESВы сами то поняли что сказали ?в десятичной системе
Всё, выхожу из дискуссии...
чего вы до парня докопались, ну сказал неправильно.Считывать показания можно не только контроллером:).Человек хочет считывать визуальные показания с
глазами.А туда их, в свою очередь, помещает микроконтроллер основываясь на данных ADC, преобразовав их предварительно в удобоваримый для человека вид.Ghost in shell писал(а):4-х разрядного семисегментника
Ghost in shellХочу вас поправить, значение ацп хранится не в процентном виде.
для того, чтобы перевести ваше напряжение и вывести на "дисплей" нужно определить максимальное значение , которое может появиться на входе ацп,определиться с точностью измерений.потом с помощью нехитрых преобразований в виде деления или умножения перевести это значение к физическому показателю(температура,угол поворота,напряжение и тд).
И уже после этого выводить на "дисплей".
А уже сама функция перевода из цифрового в десятичный вид будет заполнять ваш массив чисел на индикаторе.
В поисках истины человек развивается.
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Вопросы по С/С++ (СИ)
vitalik_1984
Спасибо. Хотя я не могу себе представить, чем еще кроме глаз можно считывать показания с семисегменника.
И зачем вообще эта дискуссия на тему "а зачем, а откуда". Ну надо мне перевести восьмибитное двоичное число в десятичное. Если не найду функции, сделаю это "в лоб".
Опорное напряжение у меня = 5В. И на входе АЦП выше небудет. На данном этапе мне абсолютно все равно, что появляется в регистре ADRES: абы одно напряжение отличалось от другого.
Спасибо. Хотя я не могу себе представить, чем еще кроме глаз можно считывать показания с семисегменника.
И зачем вообще эта дискуссия на тему "а зачем, а откуда". Ну надо мне перевести восьмибитное двоичное число в десятичное. Если не найду функции, сделаю это "в лоб".Опорное напряжение у меня = 5В. И на входе АЦП выше небудет. На данном этапе мне абсолютно все равно, что появляется в регистре ADRES: абы одно напряжение отличалось от другого.
Кот гуляет сам по себе, но вблизи холодильника.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ghost in shell писал(а):vitalik_1984
Спасибо. Хотя я не могу себе представить, чем еще кроме глаз можно считывать показания с семисегменника.И зачем вообще эта дискуссия на тему "а зачем, а откуда". Ну надо мне перевести восьмибитное двоичное число в десятичное. Если не найду функции, сделаю это "в лоб".
Опорное напряжение у меня = 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: Вопросы по С/С++ (СИ)
bin2bcd
unsigned char Bin2Dec ( unsigned char i )
{
return ( ( i / 10 ) * 0x10 + ( i % 10 ) );
} // Bin2Dec
http://www.microchip.ru/phorum/read.php ... 5&t=136035
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: Вопросы по С/С++ (СИ)
Ghost in shell уберите свой гонор подальше, вы говорите полную хрень, и еще злитесь что вам не отвечают.
Для того чтобы выводить число на семисегментник надо написать еще функцию динамической индикации.
Эта функция в виде параметра будет принимать число. А вот какой вы сделаете эту функцию - будет зависеть в какой системе счисления будет происходить вывод.
Если вы возьмете число из вашего регистра АЦП и запишете его в 8 разрядный ПОРТ контроллера, к которому подключены по одному светодиоду - тогда у вас число будет выведено в ДВОИЧНОМ виде.
Для того чтобы вывести его в ДЕСЯТИЧНОМ - нужно знать какой индикатор и написать для него ту функцию, что я выше говорил. И она ничем не похожа на перевод из двоичной в десятичную СС.
Для того чтобы выводить число на семисегментник надо написать еще функцию динамической индикации.
Эта функция в виде параметра будет принимать число. А вот какой вы сделаете эту функцию - будет зависеть в какой системе счисления будет происходить вывод.
Если вы возьмете число из вашего регистра АЦП и запишете его в 8 разрядный ПОРТ контроллера, к которому подключены по одному светодиоду - тогда у вас число будет выведено в ДВОИЧНОМ виде.
Для того чтобы вывести его в ДЕСЯТИЧНОМ - нужно знать какой индикатор и написать для него ту функцию, что я выше говорил. И она ничем не похожа на перевод из двоичной в десятичную СС.
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Вопросы по С/С++ (СИ)
vitalik_1984
спасибо, но вы слишком отклонились от первоначального вопроса. Когда разберусь с функцией sprintf
http://php.spb.ru/php/printf.html
http://www.cplusplus.com/reference/clib ... o/sprintf/
благо, PICC ее поддерживает, выясню, что именно выдает АЦП в регистр ADRES после измерения. Зная входное напряжение несложно подобрать формулу для вывода на семисегментник в удобном для меня виде.
urry
спасибо, но я сначала разберусь с функцией sprintf
BCluster
ну не силен я в терминологии.
А если бы злился из-за таких пустяков, уже даавно сидел бы в психушке. Просто мне жалко своего времени: я же не спрашивал, как организовать динамическую индикацию, или в какой системе счисления работает МК. Функцию вывода на семисегментник мне любезно подсказал urry. Она для десятичного числа. Хотябы поэтому мне надо преобразовать из двоичной системы в десятичную.
спасибо, но вы слишком отклонились от первоначального вопроса. Когда разберусь с функцией sprintf
http://php.spb.ru/php/printf.html
http://www.cplusplus.com/reference/clib ... o/sprintf/
благо, PICC ее поддерживает, выясню, что именно выдает АЦП в регистр ADRES после измерения. Зная входное напряжение несложно подобрать формулу для вывода на семисегментник в удобном для меня виде.
urry
спасибо, но я сначала разберусь с функцией sprintf
BCluster
ну не силен я в терминологии.
А если бы злился из-за таких пустяков, уже даавно сидел бы в психушке. Просто мне жалко своего времени: я же не спрашивал, как организовать динамическую индикацию, или в какой системе счисления работает МК. Функцию вывода на семисегментник мне любезно подсказал urry. Она для десятичного числа. Хотябы поэтому мне надо преобразовать из двоичной системы в десятичную.
Последний раз редактировалось Ghost in shell Вт дек 13, 2011 12:17:52, всего редактировалось 2 раза.
Кот гуляет сам по себе, но вблизи холодильника.
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не надо никуда ничего преобразовывать. Просто передайте в эту функцию значение регистра и все. Вы не понимаете сути того, о чем говорите.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
Подскажите как массив в параметры функции вставить?
Вот так делаю со строкой
array_find(u0_buff,150, "string",6)
А вот такой байтовый массив как вставить без предварительного объявления {0x04,0xFD,0x00.............} ? Или нельзя методами С такое реализовать?
Вот так делаю со строкой
array_find(u0_buff,150, "string",6)
А вот такой байтовый массив как вставить без предварительного объявления {0x04,0xFD,0x00.............} ? Или нельзя методами С такое реализовать?
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Можно. Для этого надо в функцию передать указатель на этот массив.
char* buff;
array_find(u0_buff,150, buff,6)
Рекомендую почитать про указатели в Си, тема очень обширная, описать ее в одном посте весьма проблематично ) если будут вопросы - спрашивайте.
char* buff;
array_find(u0_buff,150, buff,6)
Рекомендую почитать про указатели в Си, тема очень обширная, описать ее в одном посте весьма проблематично ) если будут вопросы - спрашивайте.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
BCluster писал(а):Можно
Вдруг когда нибудь понадобится изменить эти команды. А я думаю что вызываются они неоднократно. Так поменяете один раз дефайн, а иначе придется во всем коде их выиискивать
Да и еще имхо дефайны лучше в .h файл класть... но это дело вкуса
О, то что надо
Практически однократно(максимум 2-3 раза и то в одном месте программы) . При этом команд столько, что лазить за каждой командой(посмотреть где-чего) в отдельный .h фаил напряжно. Когда смотришь на кучу индексных имён, - программа как бы "оторвана от реальности".
Вот таких вот последовательностей - из 3-5 байт - штук 70 в разных местах программы - и каждая однократно сравнивается или в порт отправляется.
- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну дело хозяйское
Я раньше думал также как и вы, но в итоге пришел к выводу что лучше абстрагироваться от этой белиберды. Можно ведь дать осмысленное имя - типа #define CONNECT "AT+asdjfljkasdf"
И так для всех. Ноу еще раз повторю - дело хозяйское
И так для всех. Ноу еще раз повторю - дело хозяйское
- Ghost in shell
- Держит паяльник хвостом
- Сообщения: 931
- Зарегистрирован: Пн июн 15, 2009 06:01:38
- Откуда: USSR
Re: Вопросы по С/С++ (СИ)
Не надо никуда ничего преобразовывать. Просто передайте в эту функцию значение регистра и все. Вы не понимаете сути того, о чем говорите.
BCluster
Спасибо! Проверил, работает.
Значение регистра можно так присвоить переменной ?
Код: Выделить всё
strOut.Out_Indik = ADRES;vitalik_1984
А разве вы сейчас не знаете какое напряжение? я так считал, что от до 5 вольт вы же сами писали.
это опорное у меня +5В. Я так понимаю, выше опорного АЦП не меряет? Запятые мне сейчас ненужны - хочу знать, какому напряжению на входе соответствует какое число в ADRES. Мне для аналоговой клавиатуры надо задать соответствие, и мне действительно все равно, что там будет. Абы такое-то число (точнее, диапазон чисел) соответствовало такой-то клавише.
Кот гуляет сам по себе, но вблизи холодильника.