Страница 378 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 15, 2017 23:29:26
uk8amk
serg_svd писал(а):И меня смущает наличие в строчке ошибки знака указателя (*).
Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.
Коротко:
Для вывода строки lcd_puts
Для вывода числа как одиночного символа lcd_putchar
Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 08:36:41
serg_svd
uk8amk писал(а):
Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.
А разве строка
char text2[10]="Test"; не является строковым массивом?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 09:27:56
uk8amk
Эта запись таки является массивом. Но ведь у вас в коде ошибка в ином месте:
переменная i массивом совсем не является.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 09:30:31
serg_svd
uk8amk, спасибо!
sprintf помогло. Но хочу уточнить, прямого вывода числа нет на экран? Вывод только после преобразования в строковый вид?
Эта запись таки является массивом. Но ведь у вас в коде ошибка в ином месте:
Да, но я по наивности думал, что получу числовое значение длины строки и выведу это число на экран. Но я не разобрался, что выводить можно только строковые переменные.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 09:47:11
Аlex
serg_svd писал(а):прямого вывода числа нет на экран?
Курите доку на библиотеку, возможно что там есть такая возможность.
Но, даже если и есть функция, принимающая на входе числа, она будет использовать преобразование числа в строку.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 10:01:28
serg_svd
Аlex писал(а):Курите доку на библиотеку
Уже всю вдоль и поперек. Она короткая. Там только вывод строковых переменных из разных областей памяти и выод отдельных символов.
Мне очень не хватает книжки по изучению языка С с подробными комментариями и примерами. Не подскажете такую?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 10:13:33
*Trigger*
Я с этой книги знакомство с МК и Си начал:
Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR
Там как раз основы описаны, и примеры в CVAVR есть.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 10:25:14
serg_svd
*Trigger*, О! Спасибо. Сейчас поищу. Хотя возможно это нечто похожее на №3 в моем списке литературы. Но все равно найду и почитаю.
PS
uk8amk писал(а):Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.
Мама дорогая!!!
У меня проект использует в качестве микроконтроллера ATmega8A. Ну я вот мигаю светодиодом на нем, на жк вывожу....
Так вот! До компиляции с оператором
sprintf объем программы в памяти МК был 9,8%, с ее введением 21,9%!!!
Чего она так память жрет то?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 10:35:44
Apparatchik
Попробуйте
itoa. Если её нет в библиотеках, то не составит труда написать самому:
Спойлер
Код: Выделить всё
/* itoa: конвертируем n в символы в s */
void itoa(uint32_t n, char *str) {
uint8_t i, length;
char c;
i = 0;
do { /* генерируем цифры в обратном порядке */
str[i++] = n % 10 + '0'; /* берем следующую цифру */
} while ((n /= 10) > 0); /* удаляем */
str[i] = '\0'; // конец строки
/*переворачиваем строку*/
for (i = 0, length = strlen(str) - 1; i < length; i++, length--) {
c = str[i];
str[i] = str[length];
str[length] = c;
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 10:38:20
*Trigger*
Не стоит эти sprinf-ы использовать. Дело в том, что эта функция универсальная - она может любое число переменных любого типа преобразовать в строку, разбирая при этом строку формата. Только для перевода чисел и вывода их сразу на индикатор лучше использовать что-то такое (это для положительных чисел, для отрицательных нужно доработать):
Код: Выделить всё
void lcd_putnum(unsigned int n){
unsigned char digits[5];
unsigned char i
signed char j;
while(n){
digits[i]=n%10;
n/=10;
i++;
}
for(j=i-1;j>=0;j--)
lcd_putchar(digits[j]+'0');
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 11:19:08
serg_svd
Apparatchik , за совет спасибо!
сделал так
Код: Выделить всё
unsigned char string[10];
unsigned char i
.........
i=strlenf(text); Текст хранится в FLASH
itoa(i,string);
lcd_gotoxy(0,3);
lcd_puts("Char=");
lcd_puts(string)
Все работает, объем кода стал 12%
Ктати еще насчет памяти подскажите в двух словах. Есть память FLASH и SRAM. Где лучше хранить данные и почему? Просто в бэйсике я не задавал апмять. Видимо компилятор сам "распихивал"
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 11:56:54
rxstart1
корее всего puts(unsigned char *s);
а значит передавать нужно строку
unsigned char str[5]={'h','e','l','l','o'};
puts(*str);
как то так, правда я никогда не пользовался стандартными функциями

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 12:01:38
uk8amk
И тем не менее если проект разростётся до уровня скажем atmega256 или 128, то расходы на sprintf могут оказаться сопоставимыми или даже меньше чем кучка lcd_putnum для всех условий.
serg_svd писал(а): Где лучше хранить данные и почему?
Константы и неизменные данные разумнее держать только во флеш просто потому что они изначально сохраняются туда вместе с программой, а размер ОЗУ обычно много дефицитнее флеш.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 12:58:16
serg_svd
rxstart1 писал(а):
unsigned char str[5]={'h','e','l','l','o'};
У меня строковый массив задается так:
unsigned char str[5]="hello";
Я не знаю насчет правильности такого написания для С, но в книге и в хэлпе кодевижена прописаны оба варианта. Да и мне удобнее писать просто предложением, нежели разбивать на символы. Выводится то на экран все равно одной функцией.
rxstart1 писал(а):правда я никогда не пользовался стандартными функциями
Это хорошо, но на начальном этапе желательно иметь универсальную программу с библиотеками. Поэтому я после раздумий и начал ковырять в кодевижен, а не в студии.
uk8amk, спасибо! примерно такое представление было и у меня. Значит думал в нужном направлении.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 13:12:51
WiseLord
Вообще-то строка "hello" занимает 6 байтов, а не 5.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 14:24:05
rxstart1
да по барабану я просто в качестве примера привел, а так то да

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 14:43:44
serg_svd
WiseLord писал(а):Вообще-то строка "hello" занимает 6 байтов, а не 5.
Это да. Я тоже скопировал и не проверил.
Как раз вот сейчас у себя в коде на это нарвался.
На данный момент реализовал побуквенный вывод из строкового массива. Но провозился долго, и, честно говоря, шел путем научного тыка, опять же из-за непонимания чего от меня Си хочет.
Тот же код
вывод
Код: Выделить всё
str[0] извлечет 'h'
str[1] извлечет 'е'
....
и тд
А как правильно объявить переменную, которой можно присвоить эти значения и потом вывести на ЖК?
Я сделал так:
Код: Выделить всё
unsigned char temp[2];
.......цикл.....
{
temp[0]=str[n];
lcd_puts(temp);
delay_us(500);
}
но не уверен, что это правильно.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 15:02:43
ARV
для константной, т.е. неизменной, строки нет необходимости задавать размер явно
Код: Выделить всё
char str1[6] = "hello"; // не надо так
char str[] = "hello"; // надо так
компилятор сам добавит дополнительный байт с ноликом. инициализация в фигурных скобках - это еще менее предпочтительный вариант, чем первый.
Код: Выделить всё
unsigned char str[5]={'h','e','l','l','o'}; // вот так будет задан МАССИВ, а не строка
разница между массивом и строкой в том, что компилятор ничего не добавляет сам, и вы получаете не строку с ноликом на конце, а массив из 5 символов.
если откинуть unsigned, то с точки зрения компилятора такой массив ничем от строки не будет отличаться, если его передавать в функции работы со строками, но именно в этом и кроется 90% всех багов операционных систем: в этом случае программа не сможет верно определить количество символов в строке! обычно все функции работы со строками знают, что если в строке попался ноль - это признак конца строки и дальше не надо лезть. в вышепоказанном примере такого нуля не будет, и любая функция работы со строкой полезет ЗА ПРЕДЕЛЫ этого массива по ОЗУ и бог знает, когда ей там попадется ноль и чего она к тому времени успеет натворить... не делайте так.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 16:13:34
rxstart1
не люблю я встроенные функции, лучше писать самому, для МК каждый байт дорог. Яркий пример библиотека опроса датчика ds18b20

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн янв 16, 2017 18:45:30
ARV
если вы не любите стандартные функции - это ваши сексуальные предпочтения... но знать-то правила работ с ними следует, раз уж взялись за Си во всей его красе. это не конкретно вам совет - это тем, кто пытается понять, что есть Си и как им не подавиться.