ATiny2313+ds18b20 ошибка при измерении температуры
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Исправлять бесполезно,параметр стандартной функции идёт как s_int.
#include<stdlib.h>
char *itoa(int value, char * string, int radix);
#include<stdlib.h>
char *itoa(int value, char * string, int radix);
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Андрей, дайте кусок кода, который отвечает за таинственную "выдачу" неизвестно куда не того, что Вы хотите увидеть.andrey_ims писал(а):Полный код
Скажите, что и куда выдаёт это "не то". Объясните, почему он должен выдавать то, что Вы хотите увидеть.
Не будет никто ковыряться в куче кода, одновременно угадывая Ваши мысли.
Re: ATiny2313+ds18b20 ошибка при измерении температуры
andrey_ims Простите за некорректность предыдущего моего поста, просто был возмущен, что разговор на "пальцах" ведется почти неделю, если можно бы выложить код полностью , тут бы этот код кто нибудь из пользователей как говорится "разгрыз".
Однако увидев код, попутно интересует вопрос , вы автор Andrii Artemenko?
Однако увидев код, попутно интересует вопрос , вы автор Andrii Artemenko?
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):дайте кусок кода
Ну как-то так:
Код: Выделить всё
...
unsigned long int electricCounter = 0;
...
// Send byte to UART.
void USART_Transmit(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)) );
UDR = data;
}
// Send string to UART.
void USART_Send(char* str)
{
while (*str)
USART_Transmit(*str++);
USART_Transmit(0x0d);
}
// Execute recived command.
void execute(char command){
...
case 0x62: {
itoa(electricCounter, Buffer);
break;
}
...
USART_Send(Buffer);
}
...
Последний раз редактировалось andrey_ims Пт сен 13, 2013 11:18:24, всего редактировалось 1 раз.
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
C@at писал(а):Однако увидев код, попутно интересует вопрос , вы автор Andrii Artemenko?
Ага
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
andrey_ims писал(а):Код: Выделить всё
...
unsigned long int electricCounter = 0;
...
itoa(electricCounter, Buffer);
...
Vov123 писал(а):Исправлять бесполезно,параметр стандартной функции идёт как s_int.
#include<stdlib.h>
char *itoa(int value, char * string, int radix);
ЗЫ: Попробуйте sprintf.
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):Я пробовал использовать ltoa, эффект тот-же
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Я этого не писалandrey_ims писал(а):Аlex писал(а):Я пробовал использовать ltoa, эффект тот-же
Про itoa Вам уже написали, что не получится.
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):
Про itoa Вам уже написали, что не получится.
Да не itoa, a ltoa. Ltoa
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
ну а на сигнед лонг перевести, если на то пошло ?
пользуется в ltoa
применение стандартной stdlib сразу утяжеляет код, а вы жалуетесь, что места не хватает.
Пользуйтесь чем-то полегче.
пользуется в ltoa
применение стандартной stdlib сразу утяжеляет код, а вы жалуетесь, что места не хватает.
Пользуйтесь чем-то полегче.
Код: Выделить всё
void fnItoA(uint tmp)
{
const uint step[DIGIT]={1000,100,10,1};
uchar i;
uint val,temp,atemp;;
val=tmp;
for (i=0; i<DIGIT; i++)
{
temp=step[i];
atemp=0;
while(val >= temp)
{
atemp++;
val-=temp;
}
cCalculate[i]=atemp+0x30;
}
}-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
urry писал(а):ну а на сигнед лонг перевести, если на то пошло ?
пользуется в ltoa
Пробовал - не помогает
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Не поленился, скачал CVAVR, установил (больше сносить не буду, оставлю на всякий случай), попробовал :
, всё отлично выводится. Не знаю, что у Вас всё не работает...
Проект целиком, вместе с проектом протеуса
Код: Выделить всё
char buff[16];
unsigned long cnt=32768;
...................
...................
cnt++;
sprintf(buff,"%ld \n", cnt);
USART_Send(buff);
ltoa(cnt, buff);
USART_Send(buff);
Проект целиком, вместе с проектом протеуса
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):
Ваш пример действительно работает.
Сейчас в моем коде для ltoa выводится ошибка:
"outside of memory size", хотя программой занято всего 70% памяти
А при использовании sprintf не хватает памяти при компиляции
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Ну у Вас просто памяти не хватает.
Попробуйте так:
Я проверил, работает.
Попробуйте так:
Код: Выделить всё
void mLtoA(unsigned long val, char* buf, unsigned char size){
buf+=size;
*buf--=0x00;
while(size--){
*buf-- = val%10 + '0';
val/=10;
}
}
.............................
mLtoA(cnt, buff, 5);
USART_Send(buff);
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Или так, если размер неизвестен :
Код: Выделить всё
void mLtoA(unsigned long val, char* buf){
unsigned char size=0, buf_tmp[10], *p_buf=buf_tmp;
while(val){
*p_buf++ = val%10 + '0';
val/=10;
size++;
}
while(size--){
*buf++ = *--p_buf;
}
*buf=0x00;
}
........................
cnt=1234567;
mLtoA(cnt, buff);
USART_Send(buff);
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):Или так, если размер неизвестен :
Спасибо огромное, вот это помогло! А как это так получается, что Ваш алгоритм компактней?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Может он и компактней, но я не думаю, что он выполняется быстрее того-же sprintf.
А ltoa, sprintf и тому подобные, нужно использовать только в тех МК, для которых эти функции как "комарик укусил", уж очень они кушают много...
А ltoa, sprintf и тому подобные, нужно использовать только в тех МК, для которых эти функции как "комарик укусил", уж очень они кушают много...
-
andrey_ims
- Открыл глаза
- Сообщения: 73
- Зарегистрирован: Пн июл 01, 2013 22:38:09
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Аlex писал(а):Или так, если размер неизвестен :Код: Выделить всё
void mLtoA(unsigned long val, char* buf){
unsigned char size=0, buf_tmp[10], *p_buf=buf_tmp;
while(val){
*p_buf++ = val%10 + '0';
val/=10;
size++;
}
while(size--){
*buf++ = *--p_buf;
}
*buf=0x00;
}
........................
cnt=1234567;
mLtoA(cnt, buff);
USART_Send(buff);
Нашел небольшой баг. Не умеет конвертировать 0.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Ну вот и попробуйте его исправитьandrey_ims писал(а):Нашел небольшой баг
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: ATiny2313+ds18b20 ошибка при измерении температуры
Исправил
Плюс добавил вывод отрицательных чисел.
Код: Выделить всё
void mLtoA(signed long val, char* buf){
unsigned char size=0, buf_tmp[10], *p_buf=buf_tmp, s_flag=0;
if(val<0){
val*=-1;
s_flag=1;
}
do{
*p_buf++ = val%10 + '0';
val/=10;
size++;
}while(val);
if(s_flag) *buf++ ='-';
while(size--) *buf++ = *--p_buf;
*buf=0x00;
}


