CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CodeVision AVR в вопросах и ответах

Сообщение uk8amk »

serg_svd писал(а):И меня смущает наличие в строчке ошибки знака указателя (*).

Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.
Коротко:
Для вывода строки lcd_puts
Для вывода числа как одиночного символа lcd_putchar
Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

uk8amk писал(а):Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.


А разве строка char text2[10]="Test"; не является строковым массивом?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CodeVision AVR в вопросах и ответах

Сообщение uk8amk »

Эта запись таки является массивом. Но ведь у вас в коде ошибка в ином месте:

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

char i;
lcd_puts(i);

переменная i массивом совсем не является.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

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

Эта запись таки является массивом. Но ведь у вас в коде ошибка в ином месте:

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

Re: CodeVision AVR в вопросах и ответах

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

serg_svd писал(а):прямого вывода числа нет на экран?
Курите доку на библиотеку, возможно что там есть такая возможность.
Но, даже если и есть функция, принимающая на входе числа, она будет использовать преобразование числа в строку.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

Аlex писал(а):Курите доку на библиотеку

Уже всю вдоль и поперек. Она короткая. Там только вывод строковых переменных из разных областей памяти и выод отдельных символов.

Мне очень не хватает книжки по изучению языка С с подробными комментариями и примерами. Не подскажете такую?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *Trigger* »

Я с этой книги знакомство с МК и Си начал:
Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR

Там как раз основы описаны, и примеры в CVAVR есть.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

*Trigger*, О! Спасибо. Сейчас поищу. Хотя возможно это нечто похожее на №3 в моем списке литературы. Но все равно найду и почитаю.

PS
uk8amk писал(а):Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.

Мама дорогая!!! :shock: :shock: :shock:
У меня проект использует в качестве микроконтроллера ATmega8A. Ну я вот мигаю светодиодом на нем, на жк вывожу....
Так вот! До компиляции с оператором sprintf объем программы в памяти МК был 9,8%, с ее введением 21,9%!!!
Чего она так память жрет то? :shock: :shock: :shock:
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение 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;
   }
}
Последний раз редактировалось Apparatchik Пн янв 16, 2017 10:45:55, всего редактировалось 2 раза.
«И всё-таки она вертится!»
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: CodeVision AVR в вопросах и ответах

Сообщение *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');
}
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

Apparatchik , за совет спасибо! :beer:
сделал так

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

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. Где лучше хранить данные и почему? Просто в бэйсике я не задавал апмять. Видимо компилятор сам "распихивал"
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение rxstart1 »

корее всего puts(unsigned char *s);
а значит передавать нужно строку
unsigned char str[5]={'h','e','l','l','o'};


puts(*str);

как то так, правда я никогда не пользовался стандартными функциями :))
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CodeVision AVR в вопросах и ответах

Сообщение uk8amk »

И тем не менее если проект разростётся до уровня скажем atmega256 или 128, то расходы на sprintf могут оказаться сопоставимыми или даже меньше чем кучка lcd_putnum для всех условий.

serg_svd писал(а): Где лучше хранить данные и почему?


Константы и неизменные данные разумнее держать только во флеш просто потому что они изначально сохраняются туда вместе с программой, а размер ОЗУ обычно много дефицитнее флеш.
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

rxstart1 писал(а):unsigned char str[5]={'h','e','l','l','o'};

У меня строковый массив задается так:
unsigned char str[5]="hello";
Я не знаю насчет правильности такого написания для С, но в книге и в хэлпе кодевижена прописаны оба варианта. Да и мне удобнее писать просто предложением, нежели разбивать на символы. Выводится то на экран все равно одной функцией.
rxstart1 писал(а):правда я никогда не пользовался стандартными функциями

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

uk8amk, спасибо! примерно такое представление было и у меня. Значит думал в нужном направлении.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Вообще-то строка "hello" занимает 6 байтов, а не 5.
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение rxstart1 »

да по барабану я просто в качестве примера привел, а так то да :)))
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: CodeVision AVR в вопросах и ответах

Сообщение serg_svd »

WiseLord писал(а):Вообще-то строка "hello" занимает 6 байтов, а не 5.

Это да. Я тоже скопировал и не проверил.
Как раз вот сейчас у себя в коде на это нарвался.

На данный момент реализовал побуквенный вывод из строкового массива. Но провозился долго, и, честно говоря, шел путем научного тыка, опять же из-за непонимания чего от меня Си хочет.
Тот же код

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

unsigned char str[6]="hello";


вывод

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

str[0] извлечет 'h'
str[1] извлечет 'е'
....
и тд


А как правильно объявить переменную, которой можно присвоить эти значения и потом вывести на ЖК?
Я сделал так:

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

unsigned char temp[2];
.......цикл.....
{
  temp[0]=str[n];
  lcd_puts(temp);
  delay_us(500);
}

но не уверен, что это правильно.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

для константной, т.е. неизменной, строки нет необходимости задавать размер явно

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

char str1[6] = "hello"; // не надо так
char str[] = "hello"; // надо так

компилятор сам добавит дополнительный байт с ноликом. инициализация в фигурных скобках - это еще менее предпочтительный вариант, чем первый.

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

unsigned char str[5]={'h','e','l','l','o'}; // вот так будет задан МАССИВ, а не строка
разница между массивом и строкой в том, что компилятор ничего не добавляет сам, и вы получаете не строку с ноликом на конце, а массив из 5 символов.

если откинуть unsigned, то с точки зрения компилятора такой массив ничем от строки не будет отличаться, если его передавать в функции работы со строками, но именно в этом и кроется 90% всех багов операционных систем: в этом случае программа не сможет верно определить количество символов в строке! обычно все функции работы со строками знают, что если в строке попался ноль - это признак конца строки и дальше не надо лезть. в вышепоказанном примере такого нуля не будет, и любая функция работы со строкой полезет ЗА ПРЕДЕЛЫ этого массива по ОЗУ и бог знает, когда ей там попадется ноль и чего она к тому времени успеет натворить... не делайте так.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: CodeVision AVR в вопросах и ответах

Сообщение rxstart1 »

не люблю я встроенные функции, лучше писать самому, для МК каждый байт дорог. Яркий пример библиотека опроса датчика ds18b20 :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»