|
|
  |
Непонятки с компилятором, CVAVR |
|
|
|
Dec 18 2007, 09:44
|
Местный
  
Группа: Свой
Сообщений: 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 ? Функция много отжирает ресурсов, для мелких целей проще свою написать.
|
|
|
|
|
Dec 19 2007, 07:57
|

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

|
Цитата(Lexi @ Dec 18 2007, 13:01)  А в компиляторе CVAVR так делать не хочет, покрайней мере способа я не нашел. Все прекрасно работает. Где-то вы ошиблись. Куда выводить хотим? printf() по умолчанию в последовательный порт данные выводит. Естественно, он (порт) должен быть предварительно инициализирован, а прерывания от него запрещены.
|
|
|
|
|
Dec 19 2007, 11:55
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
НУ да запрещены.... Нет так нельзя. Он у меня еще и слушать должен "собеседника". Принимать команды. UART работает на ура. Но только не хочет выполнять 1 процедуру. Это выход целых чисел int i=13, и выводить на уарт как 0x31 0x33. Вот что я от него и хотел. Пришлось написать собсвенную процедуру. Час времени и проценты памяти. Ладно, фиг с ним. Зато приятнее с масивами работать чем на пике. Это факт.  Вот тока с таймерами еще разобраться. Нужен частотомер на базе 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
|
|
|
|
|
Dec 19 2007, 12:07
|
Знающий
   
Группа: Участник
Сообщений: 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); //выводим данные }  Пожалуйста прочитайте описание функции printf, например здесь: http://ru.wikipedia.org/wiki/PrintfАнатолий. PS: Или printf в CVAVR не понимает тип long?
Сообщение отредактировал aesok - Dec 19 2007, 13:07
|
|
|
|
|
Dec 20 2007, 05:35
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 27-06-07
Из: Беларусь, Гомель
Пользователь №: 28 752

|
Цитата(aesok @ Dec 19 2007, 16:07)   Пожалуйста прочитайте описание функции printf, например здесь: http://ru.wikipedia.org/wiki/PrintfАнатолий. PS: Или printf в CVAVR не понимает тип long? Ну если все так просто, и вы уже это все прочли, то почему просто не сказать в чем трабла??? Читай тут читай там... Да знаю я все это, в ВУЗе я это изучал все а не проходил. Сдесь совсем другая проблема - особеность ПО. В PICC все работает, WinAVR тоже. А вот а CVAVR не хочет. Ну и ладно, один фиг сча я этот контроллер перевел на SPI для общения с "главным".
|
|
|
|
|
Dec 20 2007, 08:35
|

Местный
  
Группа: Свой
Сообщений: 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++]; } Это лишь один из вариантов реализации
|
|
|
|
|
Dec 20 2007, 10:28
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Lexi @ Dec 20 2007, 08:35)  Читай тут читай там... Да знаю я все это, в ВУЗе я это изучал все а не проходил. Я придерживаюсь мнения что человет который изучал функцию "printf" все а не проходил ее, никогда бы не стал изобретать "dprintf", а написал бы чтото типа: Код long foo;
printf("%l", foo); Анатолий.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|