Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
stas00n с него и хотел начать, но ht PICC сам нормально не встал, а настроить не получилось, ругался на неверно указаные опции компиляции.
Re: Вопросы по С/С++ (СИ)
Да ничего там не должно ругаться, у меня, во всяком случае с первого раза все заработало. В Project Wizard выбираем нужный МК, потом тулсъют HTPICC, и все, пишем.
Re: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
Дежавю какое-то... Вроде недавно где-то об этом писал. Толи +- тему, толи +- форум 
В результате сдвиг на 10 бит превратится в сдвиг на 8 бит, что займёт меньше кода (сдвиг на 10 состоит из сдвига на 8 -- копирования байтов -- и двух сдвигов на 1).
Только это прокатит для беззнаковых, для знаковых вручную придётся обработать знак. Можно как-то так
но с временными переменными может оказаться длиннее в исходнике, зато короче во флеше.
abs() обычно прописан в <stdlib.h>
Компилятор за Вас сокращать дроби не будет. Не потому, что не умеет, а потому, что не имеет права.egride писал(а):vivod=(5*1000*adc_data[0])/1024; //Преобразование в вольты. Тут я домножил на 1000 чтобы избавиться от дробей.
Код: Выделить всё
vivod=(1250UL*adc_data[0])/256;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: Вопросы по С/С++ (СИ)
p.s. Точно, недавно писалось об этом.
viewtopic.php?f=20&t=40313&p=672329#p672329
и в той же теме выше о том, как обойтись без плавающей точки.
Хотя я вот как раз сегодня и printf с плавучкой подключил, и суммы чисел и их квадратов для последющего вычисления стандартного отклонения в плавучке стал делать... в меге328 занято пока 18кило, ну ещё 4-6 займётся основным функционалом... Лучше я отдам кила четыре под плавающие форматы "%.2f" и прочие плавающие * / да sqrt() и не буду прикидывать - что там влазит в 16 бит, а что в 32-ух надо считать и то аккуратно. Всё равно в мегу168 никто этот пяток пультов ужимать не будет. Дрого это -- за пятиратную разницу в цене меги328 и меги168 лишние пару дней потратить.
А в сэкономленное время что другое сделаю.
viewtopic.php?f=20&t=40313&p=672329#p672329
и в той же теме выше о том, как обойтись без плавающей точки.
Хотя я вот как раз сегодня и printf с плавучкой подключил, и суммы чисел и их квадратов для последющего вычисления стандартного отклонения в плавучке стал делать... в меге328 занято пока 18кило, ну ещё 4-6 займётся основным функционалом... Лучше я отдам кила четыре под плавающие форматы "%.2f" и прочие плавающие * / да sqrt() и не буду прикидывать - что там влазит в 16 бит, а что в 32-ух надо считать и то аккуратно. Всё равно в мегу168 никто этот пяток пультов ужимать не будет. Дрого это -- за пятиратную разницу в цене меги328 и меги168 лишние пару дней потратить.
А в сэкономленное время что другое сделаю.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: Вопросы по С/С++ (СИ)
Кислый писал(а):код в студию
Код чего?... Определения массива констант на Си?
Re: Вопросы по С/С++ (СИ)
stas00n, мплаб в ближайших планах)) Но текущий девайс буду заканчиавать на микрос, ибо, в общем, ну короче)))
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
вопрос
есть две строки по 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); //Вычисление дня недели
есть две строки по 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: Вопросы по С/С++ (СИ)
попробуйте почитать вот это http://arv.radioliga.com/content/view/217/49/ я писал специально для бегущей строки и прочих эффектов... думаю, должно помочь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
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 раз.
Re: Вопросы по С/С++ (СИ)
abs() - значение модуля числа.
Re: Вопросы по С/С++ (СИ)
А разве оно может отрицательное получиться? Вроде как по расчету минуса не должно получаться.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
«ну так вот я и говорю»™ — если числа «по жизни» беззнаковые, то тогда первый пример sprintf, а если знаковые, то нужно повозиться, либо второй пример sprintf в этой теме, либо дополнительный код перед вызовом sprintf, как в теме по ссылке. В зависимости от компилятора/отимизации/расположения звёзд вариант с дополнителным кодом перед sprintf, но с упрощением его вызова, может оказаться короче во флеше.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
так. подойдет ли данное описание для ассемблерных вставок в avr-gcc ?
и в каких конкретно случаях их использование оправдано ?
и в каких конкретно случаях их использование оправдано ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
egride писал(а):Что означают буквы UL?
unsigned long ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Какое-то старое описание...
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
в зависимости от ОС.
Рекомендую не спешить ими пользоваться. С нии всё очень хорошо
, просто, на мой взгляд, их интенсивное использование мешает самому программисту думать на С.
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: Вопросы по С/С++ (СИ)
ой что-то я туплю
на экран выводит просто 6. а надо 06 что зделать то что-бы было 06
заранее спасибо
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
о вот то что мне надо
подсмотрел тут рядом!
спасибо levaclaus
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
Код: Выделить всё
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
@hobbyelectronics
