WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Anatrulij
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс июл 20, 2008 12:37:07

Сообщение Anatrulij »

ARV писал(а): если хотите - обратитесь ко мне на форум - там отвечу, как положено...

Можно ссылчку вашего форума :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

как говаривал tych "под кнопкой WWW" :) нажмите и перейдете ко мне на сайт - а уж там не заблудитесь
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
DeltaQ
Открыл глаза
Сообщения: 45
Зарегистрирован: Чт окт 30, 2008 13:26:18

Сообщение DeltaQ »

ARV писал(а):если вы "пульнете" так:

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

PORTB |= (1<<PB2);
PORTB &= ~(1<<PB2);
то у вас и так между двумя этими "пулями" будет минимум 2 такта паузы - не забывайте, что оператор Си - это далеко не всегда единственный оператор ассемблера :) ну а если это слишком маленькая задержка, то подключите в инклюдах util/delay.h и напишите так:

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

PORTB |= (1<<PB2);
_delay_us(5); // 5 мкс паузы
PORTB &= ~(1<<PB2);


Ого.. ничего себе там у них на отсчет микросекунд...
Разве она сможет 1 микросекунду остчитать? это как минимум 14.5 такта при частоте кварца 14.7456МГц

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

void _delay_us(double __us)
{
   uint8_t __ticks;
   double __tmp = ((F_CPU) / 3e6) * __us;
   if (__tmp <1> 255)
   {
      _delay_ms(__us / 1000.0);
      return;
   }
   else
      __ticks = (uint8_t)__tmp;
   _delay_loop_1(__ticks);
}


З.Ы. маленький вопрос по си...
Тип переменная 1 бит как можно иницализировать?
bool BitF=0; (так можно? ибо в том компиляторе это была переменная типа bit)
и еще как правильно написать присвоение 1 бита? ибо компилятор ругается на запись PD4 = 0; я так понимаю он думает что я пытаюсь
записать ему байт?
Anatrulij
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Вс июл 20, 2008 12:37:07

Сообщение Anatrulij »

DeltaQ писал(а):З.Ы. маленький вопрос по си...
Тип переменная 1 бит как можно иницализировать?
bool BitF=0; (так можно? ибо в том компиляторе это была переменная типа bit)
и еще как правильно написать присвоение 1 бита? ибо компилятор ругается на запись PD4 = 0; я так понимаю он думает что я пытаюсь
записать ему байт?


Желательно биты в регистарх устанавливать вот так
UCSR1B = (1<<RXEN1) | (1<<TXEN1);

так ясно что ты установил бит RXEN1 регистра UCSR1B
Аватара пользователя
Man
Встал на лапы
Сообщения: 83
Зарегистрирован: Чт ноя 13, 2008 19:22:03

Сообщение Man »

Подскажите что значит ошибка :
disp.c:123 : error: size of variable 'image' is too large
ошибка возникает при выводе масива вот масив 33030 байт ,компилится без ошибок а 33032 уже выдает ошибку.
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

по поводу dtostrf

Сообщение vitmeat »

прошу помощи всезнающие коты )))
не хочет у меня работать функция dtostrf хоть тресни от злости ... (((
а не хочет она именно в winavr'e работать, парит жутко...
даже свою подобную функцию написал, НО даже она, именно в winavr'e не работает!!!
Проверял обе в стареньком QC компиляторе, в котором они работают. Для проверки поставил CodeVision, и в нем работают причем, и моя, и dtostrf функции работают!!!
:(

моя функция выглядит так

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

void print_float_to_buf(char *buf, char numDigits, float x)
{
   char i, digit;
   float z,y,place = 1.0;

   // определяем знак
   if(x<0)
      buf[0]='-';
   else
      buf[0]='+';

   // преобразуем в абсолютное значение
//   x = (x<0)?(x):(-x);  // это тоже кстати  в winavr отказалось работать
   x = fabs(x);


   // поиск первого знака
   for(i=1; i<16; i++)
   {
      if((x/place) < 10.0)
         break;
      else
         place *= 10.0;
   }

   // печать
   for(i=1,digit=0; i<numDigits; i++)
   {
      y = x/place;            // узнаем следующую цифру
      digit = (char)(y);
      buf[i] = digit+0x30;

      if(place == 1.0)
      {
         i++;
         buf[i]='.';
      }

      z = (float)(digit);
      x -= z*place;         // отнимаем соответствующий десяток
      place /= 10.0;
   }
}


причом завел две лишних переменные для прямого преобразования типов, все считает до точки, а дальше нули (((
может это не только в моем winavr'e ???

з.ы. как ни странно dtostre прекрасно работает...
но она мне не нравиться :(
з.з.ы. пользуюсь winavr-20080610
Kalipso
Родился
Сообщения: 9
Зарегистрирован: Сб дек 13, 2008 22:28:09
Откуда: Казань

по поводу dtostrf

Сообщение Kalipso »

Доброго времени!!!
По поводу dtostrf - пользовал ее в AtmanAVR 5.8.6 все отлично работало
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

Сообщение vitmeat »

Благодарю Kalipso.
Эх, да в том то вся и проблема что хочется на WinAvr'e написать...
Так то dtostrf и в CodeVision работает...
Но в силу некоторых обстоятельств проект должен быть именно опен сорсовый )))
А твой AtmanAVR 5.8, я так погуглил, еще и крякнуть никто толком не может )))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Эта функция (dtostrf) не входит в библиотеку libc.a, и поэтому должна ис-пользоваться лишь совместно с подключением к линкеру математической библиотеки libm.a директивой компилятора –lm.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

Сообщение vitmeat »

Да, спасибо ARV.
Я поковырялся в WinAvr'e и видел про эту директиву...
Вообще чтобы работала функция dtostrf и вообще printf надо немного пошаманить над makefail'ом.
Вот что пишется в стандартном makefail'е:


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

#---------- Library Options ----------
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min

# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt

# If this is left blank, then it will use the Standard printf version.
#PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
PRINTF_LIB = $(PRINTF_LIB_FLOAT)


# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min

# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt

# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)


MATH_LIB = -lm


Соответственно если я хочу, чтобы у меня работал код типа такого

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

float pi=3.1416;
printf("pi=%f",pi);

или такого

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

double pi=3.1416;
char buffer[10];
dtostrf(pi,4,4,buffer);
lcd_puts(buffer);

То мне надо раскомментировать строку:
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
при этом в исходный HEX сразу добавляется примерно 6k кода, что не может не раздрожать )))
winavr достаточно сообразительный, и он сам добавляет это, если ты начинаешь использовать printf...

Но к сожалению в моем ( а может и не только в моем ) WinAvr'e работает только dtosre и printf("pi=%e",pi);
то есть он мне выводит в экспоненциальном виде "[-]d.ddde±dd" , а мне нужно чтоб он выводил в таком "[-]ddd.ddd"
а все для экономии места на lcd дисплее и лучшей восприимчивости написанного на нем :))
Вот я и интересуюсь только ли у меня не работает это??? если да то я буду искать ошибки у себя... если нет, то это уже другой разговор :)))
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

у меня вроде printf("%7.5f", pi) работает нормально, если подключена "полная" версия библиотеки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

Сообщение vitmeat »

ладно всем спасибо :))
будем искать таки в чем дело :)))
я думаю что в версии, или в том что как-нить криво встал winavr...
надо будет переставить на более раннюю версию...
попробовать... :)
Аватара пользователя
dt_andrew
Мявтор!
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

честно скажу я знал как это делалось на WinAVR
но не могу вспомнить - вопрос вот в чем

существуют типы (которые больше 1 байта)
short, long, int и т.п.

как обратиться к отдельным байтам в таких типах
Аватара пользователя
Spider
Опытный кот
Сообщения: 732
Зарегистрирован: Чт дек 29, 2005 07:29:25
Откуда: Омск
Контактная информация:

Сообщение Spider »

существуют типы (которые больше 1 байта)
short, long, int и т.п.

как обратиться к отдельным байтам в таких типах

Если это вопрос то:

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

uint32_t long0 = 0x44332211;

uint8_t byte1 = (long0 & 0xFF);  // 0x11
uint8_t byte2 = ((long0 >> 8) & 0xFF); //0x22
uint8_t byte3 = ((long0 >> 16) & 0xFF); //0x33
uint8_t byte4 = ((long0 >> 24) & 0xFF); //0x44

по сути даже "& 0xFF" не нужен, но так, чтобы "как положено".

обратно немного сложнее:

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

long0 = (long0 & 0xFFFFFF00) | byte1);
long0 = (long0 & 0xFFFF00FF) | (byte2 << 8));
long0 = (long0 & 0xFF00FFFF) | (byte3 << 16));
long0 = (long0 & 0x00FFFFFF) | (byte4 << 24));

или всё сразу

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

 long0 = (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | byte1;
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

dt_andrew писал(а):существуют типы (которые больше 1 байта)
short, long, int и т.п.

как обратиться к отдельным байтам в таких типах

лично я предпочитаю для этой цели использовать union и, при необходимости, переопределение типов.

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

typedef union{
   unsigned long L;
   unsigned int words[2];
   unsigned char bytes[4];
} extra_long;

// наша переменная типа long
extra_long var;

// обращение ко все переменной (инкремент)
   var.L++;
// обращение к старшему слову переменной (инкремент)
   var.words[1]++;
// обращение к старшему байту переменной (инкремент)
   var.bytes[3]++;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
dt_andrew
Мявтор!
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

Огромное спасибо!
я правда делал как то по другому, но не помню
хотя мне все пойдет главное чтоб работало
Спасибо - пока вопрос снят - буду пробовать
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

Сообщение vitmeat »

единственное, я бы наверно посоветовал бы еще делать явное преобразование типов...
а не доверять все это компилятору...
разные компиляторы могут выполнять преобразование типов и битовые операции с разными приоритетами, что может привести к ошибкам...
просто совет, всегда следить за типами, и явно их преобразовывать :))
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

А можно просто обратиться к нужному адресу в памяти:

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

 var=*( (char*)&byte +n); //n - сдвижка относительно начального адреса

В отличии от

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

var =(char) (byte>>n);

это позволит работать со всеми типами данных, но правда при этом проигрывает в быстродействии.
vitmeat
Родился
Сообщения: 6
Зарегистрирован: Чт дек 11, 2008 00:26:13

Сообщение vitmeat »

можно еще воспользоваться битовыми полями...
вот тут про это немного написано:
http://www.opennet.ru/docs/RUS/bogatyrev/gl_5_1.html
но машинный код тоже медленнее и длиннее зато компактнее сами данные, например для передачи, или хранения... :)
TechMike
Прорезались зубы
Сообщения: 247
Зарегистрирован: Сб дек 15, 2007 23:00:54
Откуда: Moscow
Контактная информация:

Сообщение TechMike »

Использую WinAVR 20050214 всем доволен, но понадобилось работать с tiny45, а ее в 2005 версии еще нет. Что посоветуете из стабильных версий WinAVR с как минимум поддержкой tiny45/25.
Шью МК с помощью avrdude, отлаживаю в AVR Studio 4.15.
Ответить

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