Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки с компилятором
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Lexi
Народ помогаем!!
Застряна богальном.
При переходе с PIC на AVR возникла дурацкая проблема.

К примеру есть нейкое int i. i=16;
В компиляторе который я юзал для PIC командой printf("%d", i); у меня выводились данные '1' '6' в нормальном ASCII. А в компиляторе CVAVR так делать не хочет, покрайней мере способа я не нашел. А вычилять делить на 100 или на 10 с добавлением 48 бред.

Как тут поступить??
andrvisht
Цитата(Lexi @ Dec 18 2007, 13:01) *
Народ помогаем!!
Застряна богальном.
При переходе с PIC на AVR возникла дурацкая проблема.

К примеру есть нейкое int i. i=16;
В компиляторе который я юзал для PIC командой printf("%d", i); у меня выводились данные '1' '6' в нормальном ASCII. А в компиляторе CVAVR так делать не хочет, покрайней мере способа я не нашел. А вычилять делить на 100 или на 10 с добавлением 48 бред.

Как тут поступить??

CV не пользовал, только просматривал, равно как и printf, но помниться что там есть настройки формата printf. Поиграйтесь с ними. А вообще что вам нужно сделать при помощи printf ? Функция много отжирает ресурсов, для мелких целей проще свою написать.
ALexx
Цитата(Lexi @ Dec 18 2007, 13:01) *
А в компиляторе CVAVR так делать не хочет, покрайней мере способа я не нашел.


Все прекрасно работает. Где-то вы ошиблись.
Куда выводить хотим?
printf() по умолчанию в последовательный порт данные выводит. Естественно, он (порт) должен быть предварительно инициализирован, а прерывания от него запрещены.
Lexi
НУ да запрещены.... Нет так нельзя. Он у меня еще и слушать должен "собеседника". Принимать команды. UART работает на ура. Но только не хочет выполнять 1 процедуру. Это выход целых чисел int i=13, и выводить на уарт как 0x31 0x33. Вот что я от него и хотел. Пришлось написать собсвенную процедуру. Час времени и проценты памяти. Ладно, фиг с ним. Зато приятнее с масивами работать чем на пике. Это факт. smile.gif Вот тока с таймерами еще разобраться. Нужен частотомер на базе ATmega8L. Кстати, он умеет ли по I2C аппаратно говорить или он только SPI держит?
Код

void dprintf(long int i)
{
int a[8];
int b;
a[0]=i/1000000;
i=i-a[0]*1000000;
a[1]=i/100000;
i=i-a[1]*100000;
a[2]=i/10000;
i=i-a[2]*10000;
a[3]=i/1000;
i=i-a[3]*1000;
a[4]=i/100;
i=i-a[4]*100;
a[5]=i/10;
i=i-a[5]*10;
a[6]=i/1;
for(b=0;b<7;b++) if(a[b]!=0) break; //отсекаем нули первые
for(b;b<7;b++) printf("%c", a[b]+48); //выводим данные
}
aesok
Цитата(Lexi @ Dec 19 2007, 14:55) *
Код

void dprintf(long int i)
{
int a[8];
int b;
a[0]=i/1000000;
i=i-a[0]*1000000;
a[1]=i/100000;
i=i-a[1]*100000;
a[2]=i/10000;
i=i-a[2]*10000;
a[3]=i/1000;
i=i-a[3]*1000;
a[4]=i/100;
i=i-a[4]*100;
a[5]=i/10;
i=i-a[5]*10;
a[6]=i/1;
for(b=0;b<7;b++) if(a[b]!=0) break; //отсекаем нули первые
for(b;b<7;b++) printf("%c", a[b]+48); //выводим данные
}



biggrin.gif Пожалуйста прочитайте описание функции printf, например здесь: http://ru.wikipedia.org/wiki/Printf

Анатолий.

PS: Или printf в CVAVR не понимает тип long?
vet
aesok, понимает, и long, и float, и форматирование.
Lexi
Цитата(aesok @ Dec 19 2007, 16:07) *
biggrin.gif Пожалуйста прочитайте описание функции printf, например здесь: http://ru.wikipedia.org/wiki/Printf

Анатолий.

PS: Или printf в CVAVR не понимает тип long?

Ну если все так просто, и вы уже это все прочли, то почему просто не сказать в чем трабла???
Читай тут читай там... Да знаю я все это, в ВУЗе я это изучал все а не проходил.
Сдесь совсем другая проблема - особеность ПО.
В PICC все работает, WinAVR тоже. А вот а CVAVR не хочет.
Ну и ладно, один фиг сча я этот контроллер перевел на SPI для общения с "главным".
ALexx
Цитата(Lexi @ Dec 19 2007, 15:55) *
НУ да запрещены.... Нет так нельзя. Он у меня еще и слушать должен "собеседника". Принимать команды. UART работает на ура. Но только не хочет выполнять 1 процедуру. Это выход целых чисел int i=13, и выводить на уарт как 0x31 0x33.
Код

void dprintf(long int i)
....
}


Формируете массив, а затем опять таки функцией printf отправляете его в порт. Зачем так сложно?
Почему бы не оставить printf в покое и работать по прерываниям? Тогда и принимать и передавать сможете без циклов ожидания и прочих проблем.

Код
#define BUF_SIZE  8

uchar Buf[BUF_SIZE];
uint i=13;

uchar TxIndex;
bit TxFlag=0;

void main(void){
....

ownPrintf(Buf,i);
...
}

void ownPrintf(uchar bf, uint Val){
  uchar j;  
  
  while(!TxFlag);
  TxFlag=0;
  for(j=0;j<BUF_SIZE;j++) bf[j]=0x30; //чистим
  j=0;
  while(Val){ // преобразование числа в строку
    bf[j++]=((uchar)(Val%10))|0x30;
    Val/=10;  
  }
// Начинаем отправку массива. Тут уже делаете как вам надо, но начинается
// все с записи первого байта в регистр данных УАРТА
  TxIndex=0;
  UDR=bf[TxIndex++];
}


// один из вариантов прерывания по прередаче
interrupt [USART_TXC] void UART_TransmitComplete(void){
  if(TxIndex>=BUF_SIZE) TxFlag=1;
  else UDR=Buf[TxIndex++];
}


Это лишь один из вариантов реализации
aesok
Цитата(Lexi @ Dec 20 2007, 08:35) *
Читай тут читай там... Да знаю я все это, в ВУЗе я это изучал все а не проходил.


Я придерживаюсь мнения что человет который изучал функцию "printf" все а не проходил ее, никогда бы не стал изобретать "dprintf", а написал бы чтото типа:

Код
long foo;

printf("%l", foo);




Анатолий.
GDI
В CV есть куча примеров, вроде и с выводом на уарт что то было, почему бы не посмотреть как там все сделано.
Lexi
Если чесно, я уже и забыл про эту проблему.
Наладил прошивку для меги, завел ip/tcp стек на сим300 и успешно передаю данные из удаленного места по GPRS так сказать.

Иного лучше свое изобрести чем юзать готовое, но мало понятное.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.