Страница 1 из 2
Программирование AVR на C. Мелкие вопросы
Добавлено: Сб сен 26, 2009 20:35:41
Twen
Здравствуйте, тут у меня возникли некоторые вопрсы и я создал тему, может у кого-то тоже еще возникнут, пускай пишут сюда.
1.Я слышал что не лицензионный Code Visio транслирует код не больше 2КБ. Правда ли это?
2. Хотел спросить по поводу фенкции sprintf.
Есть такое выражение: sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);
где
char lcd_buffer[33];
int temp;
как бы записываем у lcd_buffer значение Temp, а "t=%i.%u\xdfC" - что за набор, а потом еще temp%1 ??
Добавлено: Сб сен 26, 2009 20:57:34
Redrik Shuhart
я тож хочу спросить КАК ЗАПУСТИТЬ ПРЕРЫВАНИЯ НА PA0 ?
Добавлено: Сб сен 26, 2009 21:07:22
ARV
Twen, никогда не хотелось вам книжку по Си почитать?
Redrik Shuhart, никогда не хотелось вам даташит почитать?
Re: Программирование AVR на C. Мелкие вопросы
Добавлено: Сб сен 26, 2009 21:15:06
smac
Twen писал(а):Здравствуйте, тут у меня возникли некоторые вопрсы
2. Хотел спросить по поводу фенкции sprintf.
Есть такое выражение: sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);
где
char lcd_buffer[33];
int temp;
как бы записываем у lcd_buffer значение Temp, а "t=%i.%u\xdfC" - что за набор, а потом еще temp%1 ??
Это значит что мы записываем в lcd_buffer строку символов, состоящую из "t=<целое значение температуры>.<дробное значение температуры><0xDF>С", например если температура 23,6 градусов цельсия, то в буфере будет "t=23.6<знак градус>С". А вообще смотрите описание функции sprintf в документации к компилятору или в книге по си (например от создателей С - Кернигана и Ричи)
Добавлено: Сб сен 26, 2009 21:19:05
Twen
Ну почему же, я читал по С книгу...на С я знаю есть функция printf -
функция вывода, у кавычках пишется строка символов для вывода (" ") , %i- вместо подставляется выводимое число целого типа.
А вот не пойму %u\xdfC и вот это temp%1 зачем?
Добавлено: Сб сен 26, 2009 21:19:35
Redrik Shuhart
Redrik Shuhart, никогда не хотелось вам даташит почитать?
у мя 7 за английский в атестате стоит :Р типо его знаю
Добавлено: Сб сен 26, 2009 21:21:28
Twen
Я смотрел у файле STDIO.H написано :
void sprintf(char *str, char flash *fmtstr,...);
Но по этому разобраться сложно...нужно полюбе документацию на Code Visio скачать
Добавлено: Сб сен 26, 2009 21:26:31
Twen
А где можно скачать документацию на Code Visio ?
Добавлено: Сб сен 26, 2009 21:32:48
ARV
Twen писал(а):smac: спасибо я понял, а temp%1 зачем?
А где можно скачать документацию на Code Visio ?
судя по всему там должно быть
temp%10, но нолик куда-то потерялся

Добавлено: Сб сен 26, 2009 21:34:36
Twen
Да,да я это и имел введу.
Добавлено: Сб сен 26, 2009 21:56:51
Twen
Смотрите, если я объявляю
int temp;
а потом вызываю функцию
temp=ds18b20_temperature(&rom_code[0]);
и если датчик настроен на 12 битовый режим , то у temp cохраняется целое значние температуры.Тоесть если датчик показует 12.34 градуса, то у temp будет 12 ?
Добавлено: Сб сен 26, 2009 21:58:19
Twen
Наверное нужно
float temp
Добавлено: Сб сен 26, 2009 22:02:22
Twen
Просто у меня проблема у выводе десятых...
Добавлено: Сб сен 26, 2009 23:16:55
kalobyte
int tmp = 1234;
float temp = tmp/100; 12,34
Добавлено: Вс сен 27, 2009 14:26:32
Danko
Twen писал(а):А где можно скачать документацию на Code Visio ?
У гугла попроси найти вот эту фразу "CodeVisionAVR Пособие для начинающих" - если прям таки хочется про CodeVisio
n на русском почитать.
Читаешь по английски ищи вот это "CodeVisionAVR user manual"
Добавлено: Вс сен 27, 2009 16:23:20
smac
ARV писал(а):судя по всему там должно быть
temp%10, но нолик куда-то потерялся

Вопрос в том как представлено temp. Если она представлена целым числом равным температура*10, то нужно выводить сначала temp/10, а потом отделенные точкой temp%10, если же она представлена дробным числом, то в примере по-идее все правильно, т. к. приведение к целому при выводе должно отбросить дробную часть, которая возмется при temp%1. По-моему так.
Добавлено: Вс сен 27, 2009 16:45:11
Synergetik
smac писал(а):приведение к целому при выводе должно отбросить дробную часть, которая возмется при temp%1. По-моему так.
Эту задачу спецификатор %u выполняет самостоятельно без лишних отбрасываний.
Добавлено: Вс сен 27, 2009 17:44:19
izmmisha
Redrik Shuhart писал(а):я тож хочу спросить КАК ЗАПУСТИТЬ ПРЕРЫВАНИЯ НА PA0 ?
Надо бы знать какой контроллер чтобы ответить на данный вопрос. Для tiny2313 (и тех у которых прерывание PCINT одно) обсуждалось
тут
Добавлено: Вс сен 27, 2009 17:47:37
ARV
smac писал(а):Вопрос в том как представлено temp. Если она представлена целым числом равным температура*10, то нужно выводить сначала temp/10, а потом отделенные точкой temp%10, если же она представлена дробным числом, то в примере по-идее все правильно, т. к. приведение к целому при выводе должно отбросить дробную часть, которая возмется при temp%1. По-моему так.
если
temp представлена дробным числом, то вообще непонятно, к чему изврат: можно использовать спецификатор
%f и выводить сразу и целую и дробную части.
Добавлено: Вс сен 27, 2009 17:56:59
izmmisha
smac писал(а):Вопрос в том как представлено temp.
...
если же она представлена дробным числом, то в примере по-идее все правильно, т. к. приведение к целому при выводе должно отбросить дробную часть, которая возмется при temp%1. По-моему так.
Код: Выделить всё
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);
Если тут temp не целое, то %i выведет совершенно не то что хотелось.
Я конечно не знаю какой у вас компилятор, но GCC просто выдает предупреждение, что тип не соответствует, возможно другой какой-нибудь компилятор может сделать приведение типа, но это работа программиста.