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

 
 
> Непонятки с компилятором, 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
 
Start new topic
Ответов
Lexi
сообщение Dec 19 2007, 11:55
Сообщение #2


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

Группа: Свой
Сообщений: 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
ALexx
сообщение Dec 20 2007, 08:35
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 18:16
Рейтинг@Mail.ru


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