ATiny2313+ds18b20 ошибка при измерении температуры

Обсуждаем контроллеры компании Atmel.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение Vov123 »

Исправлять бесполезно,параметр стандартной функции идёт как s_int.


#include<stdlib.h>
char *itoa(int value, char * string, int radix);
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

andrey_ims писал(а):Полный код
Андрей, дайте кусок кода, который отвечает за таинственную "выдачу" неизвестно куда не того, что Вы хотите увидеть.
Скажите, что и куда выдаёт это "не то". Объясните, почему он должен выдавать то, что Вы хотите увидеть.
Не будет никто ковыряться в куче кода, одновременно угадывая Ваши мысли.
Реклама
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение C@at »

andrey_ims Простите за некорректность предыдущего моего поста, просто был возмущен, что разговор на "пальцах" ведется почти неделю, если можно бы выложить код полностью , тут бы этот код кто нибудь из пользователей как говорится "разгрыз".
Однако увидев код, попутно интересует вопрос , вы автор Andrii Artemenko?
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение andrey_ims »

А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 ошибка при измерении температуры

Сообщение andrey_ims »

C@at писал(а):Однако увидев код, попутно интересует вопрос , вы автор Andrii Artemenko?

Ага
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

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 ошибка при измерении температуры

Сообщение andrey_ims »

Аlex писал(а):Я пробовал использовать ltoa, эффект тот-же
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

andrey_ims писал(а):
Аlex писал(а):Я пробовал использовать ltoa, эффект тот-же
Я этого не писал :)

Про itoa Вам уже написали, что не получится.
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение andrey_ims »

Аlex писал(а):
Про itoa Вам уже написали, что не получится.



Да не itoa, a ltoa. Ltoa
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение urry »

ну а на сигнед лонг перевести, если на то пошло ?
пользуется в 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 ошибка при измерении температуры

Сообщение andrey_ims »

urry писал(а):ну а на сигнед лонг перевести, если на то пошло ?
пользуется в ltoa


Пробовал - не помогает
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

Не поленился, скачал CVAVR, установил (больше сносить не буду, оставлю на всякий случай), попробовал :

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

char buff[16];
unsigned long cnt=32768;
...................
...................

cnt++;
sprintf(buff,"%ld \n", cnt);
USART_Send(buff);

ltoa(cnt, buff);
USART_Send(buff);

, всё отлично выводится. Не знаю, что у Вас всё не работает...

Проект целиком, вместе с проектом протеуса
tmp.rar
(93.93 КБ) 148 скачиваний
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение andrey_ims »

Аlex писал(а):
tmp.rar



Ваш пример действительно работает.


Сейчас в моем коде для ltoa выводится ошибка:
"outside of memory size", хотя программой занято всего 70% памяти

А при использовании sprintf не хватает памяти при компиляции
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

Ну у Вас просто памяти не хватает.
Попробуйте так:

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

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 ошибка при измерении температуры

Сообщение А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);

andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение andrey_ims »

Аlex писал(а):Или так, если размер неизвестен :

Спасибо огромное, вот это помогло! А как это так получается, что Ваш алгоритм компактней?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

Может он и компактней, но я не думаю, что он выполняется быстрее того-же sprintf.
А ltoa, sprintf и тому подобные, нужно использовать только в тех МК, для которых эти функции как "комарик укусил", уж очень они кушают много...
andrey_ims
Открыл глаза
Сообщения: 73
Зарегистрирован: Пн июл 01, 2013 22:38:09

Re: ATiny2313+ds18b20 ошибка при измерении температуры

Сообщение andrey_ims »

А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 ошибка при измерении температуры

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

andrey_ims писал(а):Нашел небольшой баг
Ну вот и попробуйте его исправить :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: ATiny2313+ds18b20 ошибка при измерении температуры

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

Исправил :) Плюс добавил вывод отрицательных чисел.

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

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;
}
Ответить

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