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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

stas00n с него и хотел начать, но ht PICC сам нормально не встал, а настроить не получилось, ругался на неверно указаные опции компиляции.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

Да ничего там не должно ругаться, у меня, во всяком случае с первого раза все заработало. В Project Wizard выбираем нужный МК, потом тулсъют HTPICC, и все, пишем.
egride
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн окт 05, 2009 15:18:29

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

Сообщение egride »

ARV писал(а):да чего там ломать-то? в вашу элементарную формулу добавьте умножение на 1000 и вычисляйте все в целых числах. а при выводе сначала запишите результат в строку, а потом вставьте десятичную точку в нужное место. вот вам и будет и вычисления в целых и ограничение до 3-го знака одновременно :)

правда ахинея у вас на дисплее наверняка не из-за float, а из-за какой-то иной ошибки в программе... ибо с float AVR хоть и медленно, но работает вполне нормально.


Действительно! Как я сам до такой простой мысли не догадался! Спасибо!
Только я не понял, как можно "вклинить" запятую чтобы отделить целые вольты? Вот как я вывожу:

char s[5]; //Массив для вывода
unsigned int vivod; //Результирующая переменная для напряжения.
...
vivod=(5*1000*adc_data[0])/1024; //Преобразование в вольты. Тут я домножил на 1000 чтобы избавиться от дробей.

lcd_clear();
lcd_gotoxy(0,1);
sprintf(s, "%i", vivod); //Преобразовать переменную в массив
lcd_puts(s); //Вывести массив


Какой командой можно вставлять символ в массив, чтобы правая часть(дробная) сдвигалась? Или это лучше вручную сделать?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Дежавю какое-то... Вроде недавно где-то об этом писал. Толи +- тему, толи +- форум :-)
egride писал(а):vivod=(5*1000*adc_data[0])/1024; //Преобразование в вольты. Тут я домножил на 1000 чтобы избавиться от дробей.
Компилятор за Вас сокращать дроби не будет. Не потому, что не умеет, а потому, что не имеет права.

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

vivod=(1250UL*adc_data[0])/256;
В результате сдвиг на 10 бит превратится в сдвиг на 8 бит, что займёт меньше кода (сдвиг на 10 состоит из сдвига на 8 -- копирования байтов -- и двух сдвигов на 1).

egride писал(а):sprintf(s, "%i", vivod); //Преобразовать переменную в массив
lcd_puts(s); //Вывести массив
Какой командой можно вставлять символ в массив, чтобы правая часть(дробная) сдвигалась? Или это лучше вручную сделать?

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

sprintf(s, "%d.%03d", vivod / 1000, vivod % 1000);
Только это прокатит для беззнаковых, для знаковых вручную придётся обработать знак. Можно как-то так

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

sprintf(s, "%с%d.%03d", vivod < 0 ? '-' : ' ', abs(vivod) / 1000, abs(vivod) % 1000);
но с временными переменными может оказаться длиннее в исходнике, зато короче во флеше.
abs() обычно прописан в <stdlib.h>
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

p.s. Точно, недавно писалось об этом.
viewtopic.php?f=20&t=40313&p=672329#p672329

и в той же теме выше о том, как обойтись без плавающей точки.

Хотя я вот как раз сегодня и printf с плавучкой подключил, и суммы чисел и их квадратов для последющего вычисления стандартного отклонения в плавучке стал делать... в меге328 занято пока 18кило, ну ещё 4-6 займётся основным функционалом... Лучше я отдам кила четыре под плавающие форматы "%.2f" и прочие плавающие * / да sqrt() и не буду прикидывать - что там влазит в 16 бит, а что в 32-ух надо считать и то аккуратно. Всё равно в мегу168 никто этот пяток пультов ужимать не будет. Дрого это -- за пятиратную разницу в цене меги328 и меги168 лишние пару дней потратить.
А в сэкономленное время что другое сделаю.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

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

Сообщение asteroid7 »

Кислый писал(а):код в студию :)

:shock:
Код чего?... Определения массива констант на Си?
skader
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Чт дек 23, 2010 19:40:47

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

Сообщение skader »

stas00n, мплаб в ближайших планах)) Но текущий девайс буду заканчиавать на микрос, ибо, в общем, ну короче)))
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

вопрос
есть две строки по 16 символов HD44780
во второй строке формируется вывод информации, нужно чтоб часть строки оставалась неподвижной, в остальной части происходило скролирование надписи
на фото всё видно, надо чтоб дата осталась неподвижной, а скролировалось название дня, если оно не влезло

что у меня есть счас
//Считываем время из микросхемы и выводим на LCD
rtc_get_time(&hour,&minute,&second);//Считываем время из микросхемы
lcd_gotoxy(4,0); //Курсор в 4-й столбец, 0-я строка
sprintf(lcd_time,"%02d:%02d:%02d",hour,minute,second); //Формируем строку вывода времени
lcd_puts(lcd_time);// Выводим на LCD
rtc_get_date(&date,&month,&year);//Считываем дату из микросхемы
lcd_gotoxy(0,1); //Курсор в 1-й столбец, 1-я строка
sprintf(lcd_date,"%02d/%02d/20%02d",date,month,year); //Формируем строку вывода даты
lcd_puts(lcd_date); //Выводим на LCD

lcd_gotoxy(11,1); //Курсор во 2-ю строку, 13-й столбец
day=day_of_week(date,month,year); //Вычисление дня недели
Вложения
foto2_новый ра.jpg
(114.09 КБ) 453 скачивания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

попробуйте почитать вот это http://arv.radioliga.com/content/view/217/49/ я писал специально для бегущей строки и прочих эффектов... думаю, должно помочь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
egride
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн окт 05, 2009 15:18:29

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

Сообщение egride »

avreal писал(а):

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

sprintf(s, "%d.%03d", vivod / 1000, vivod % 1000);
Только это прокатит для беззнаковых, для знаковых вручную придётся обработать знак. Можно как-то так

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

sprintf(s, "%с%d.%03d", vivod < 0 ? '-' : ' ', abs(vivod) / 1000, abs(vivod) % 1000);
но с временными переменными может оказаться длиннее в исходнике, зато короче во флеше.
abs() обычно прописан в <stdlib.h>


Благодарю, Вы очень помогли мне. Поискал и смог разобраться с функцией sprintf().
А что делает функция abs() с переменной? Не смог найти про это ничего.

Еще поясните пожалуйста вот эту строчку: vivod=(1250UL*adc_data[0])/256;
Что означают буквы UL?
Последний раз редактировалось egride Пн янв 24, 2011 20:43:10, всего редактировалось 1 раз.
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

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

Сообщение lix »

abs() - значение модуля числа.
egride
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн окт 05, 2009 15:18:29

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

Сообщение egride »

А разве оно может отрицательное получиться? Вроде как по расчету минуса не должно получаться.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

«ну так вот я и говорю»™ — если числа «по жизни» беззнаковые, то тогда первый пример sprintf, а если знаковые, то нужно повозиться, либо второй пример sprintf в этой теме, либо дополнительный код перед вызовом sprintf, как в теме по ссылке. В зависимости от компилятора/отимизации/расположения звёзд вариант с дополнителным кодом перед sprintf, но с упрощением его вызова, может оказаться короче во флеше.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

так. подойдет ли данное описание для ассемблерных вставок в avr-gcc ?
и в каких конкретно случаях их использование оправдано ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

egride писал(а):Что означают буквы UL?


unsigned long ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Какое-то старое описание...
http://www.nongnu.org/avr-libc/user-manual/pages.html - «Inline Assembler Cookbook»
И с avr-gcc оно же идёт, причём именно на ту версию, которая в комплекте.
/usr/share/doc/avr-libc/avr-libc-user-manual/index.html
либо
WinAVR\doc\avr-libc\avr-libc-user-manual\index.html
в зависимости от ОС.

Рекомендую не спешить ими пользоваться. С нии всё очень хорошо :-), просто, на мой взгляд, их интенсивное использование мешает самому программисту думать на С.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

ой что-то я туплю

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

char buf[32];
//fuse_lo равен 0х06
itoa(fuse_lo,buf,16);
LCDsendString(buf);

на экран выводит просто 6. а надо 06 что зделать то что-бы было 06
заранее спасибо
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
shurikss123
Грызет канифоль
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

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

Сообщение shurikss123 »

о вот то что мне надо

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

sprintf(buf,"%02d",sig_1);
LCDsendString(buf);

подсмотрел тут рядом!
спасибо levaclaus
вопрос
есть две строки по 16 символов HD44780
во второй строке формируется вывод информации, нужно чтоб часть строки оставалась неподвижной, в остальной части происходило скролирование надписи
на фото всё видно, надо чтоб дата осталась неподвижной, а скролировалось название дня, если оно не влезло

что у меня есть счас
//Считываем время из микросхемы и выводим на LCD
rtc_get_time(&hour,&minute,&second);//Считываем время из микросхемы
lcd_gotoxy(4,0); //Курсор в 4-й столбец, 0-я строка
sprintf(lcd_time,"%02d:%02d:%02d",hour,minute,second); //Формируем строку вывода времени
lcd_puts(lcd_time);// Выводим на LCD
rtc_get_date(&date,&month,&year);//Считываем дату из микросхемы
lcd_gotoxy(0,1); //Курсор в 1-й столбец, 1-я строка
sprintf(lcd_date,"%02d/%02d/20%02d",date,month,year); //Формируем строку вывода даты
lcd_puts(lcd_date); //Выводим на LCD

lcd_gotoxy(11,1); //Курсор во 2-ю строку, 13-й столбец
day=day_of_week(date,month,year); //Вычисление дня недели
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

char buf[32];
//fuse_lo равен 0х06
itoa(fuse_lo,buf,16);
if(strlen(buf) < 2) LCDsendString("0");
LCDsendString(buf);

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

Мой уютный бложик... заходите!
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

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

Сообщение Кислый »

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

#include <stdio.h>

int main ()
{
  char buffer [50];
  int n;
  char byte = 10;
  n = sprintf (buffer, "%.*X", 5, byte); // 5 - в данном случае - разрядность
  printf ("[%s] %d\n",buffer,n);
  n = sprintf (buffer, "%.*d", 5, byte);
  printf ("[%s] %d\n",buffer,n);
  return 0;
}


кстати что у нас делает itoa? я их вечно путаю..
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Ответить

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