реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Непонятки с компилятором, CVAVR
Lexi
сообщение Dec 18 2007, 09:01
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



Народ помогаем!!
Застряна богальном.
При переходе с PIC на AVR возникла дурацкая проблема.

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

Как тут поступить??
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Dec 18 2007, 09:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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 ? Функция много отжирает ресурсов, для мелких целей проще свою написать.
Go to the top of the page
 
+Quote Post
ALexx
сообщение Dec 19 2007, 07:57
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(Lexi @ Dec 18 2007, 13:01) *
А в компиляторе CVAVR так делать не хочет, покрайней мере способа я не нашел.


Все прекрасно работает. Где-то вы ошиблись.
Куда выводить хотим?
printf() по умолчанию в последовательный порт данные выводит. Естественно, он (порт) должен быть предварительно инициализирован, а прерывания от него запрещены.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Dec 19 2007, 11:55
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



НУ да запрещены.... Нет так нельзя. Он у меня еще и слушать должен "собеседника". Принимать команды. 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); //выводим данные
}


Сообщение отредактировал Lexi - Dec 19 2007, 11:58
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 19 2007, 12:07
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(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?

Сообщение отредактировал aesok - Dec 19 2007, 13:07
Go to the top of the page
 
+Quote Post
vet
сообщение Dec 19 2007, 15:00
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



aesok, понимает, и long, и float, и форматирование.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Lexi
сообщение Dec 20 2007, 05:35
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



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

Анатолий.

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

Ну если все так просто, и вы уже это все прочли, то почему просто не сказать в чем трабла???
Читай тут читай там... Да знаю я все это, в ВУЗе я это изучал все а не проходил.
Сдесь совсем другая проблема - особеность ПО.
В PICC все работает, WinAVR тоже. А вот а CVAVR не хочет.
Ну и ладно, один фиг сча я этот контроллер перевел на SPI для общения с "главным".
Go to the top of the page
 
+Quote Post
ALexx
сообщение Dec 20 2007, 08:35
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(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++];
}


Это лишь один из вариантов реализации
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 20 2007, 10:28
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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


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

Код
long foo;

printf("%l", foo);




Анатолий.
Go to the top of the page
 
+Quote Post
GDI
сообщение Dec 20 2007, 13:34
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



В CV есть куча примеров, вроде и с выводом на уарт что то было, почему бы не посмотреть как там все сделано.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Lexi
сообщение Dec 21 2007, 13:53
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752



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

Иного лучше свое изобрести чем юзать готовое, но мало понятное.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016