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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Наверно в виде структуры - примеры есть в FAQ по микроконтроллерам - у меня на домашней страничке.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

пример нашел. Он под IAR. Кажется это немного не то:

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

volatile struct strFlags
{
BYTE Flag1: 1;
BYTE Flag2: 1;
BYTE Flag3: 1;
} Flags;

void main(void)
{
while(1)
{
if(Flags.Flag1) DoTask1();
if(Flags.Flag2) DoTask2();
if(Flags.Flag3) DoTask3();
}
}

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

Сообщение ARV »

ну, можно использовать макросы _BV(), bit_is_set() и т.п.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

chief писал(а):пример нашел. Он под IAR. Кажется это немного не то

Для флага БИТа достаточно ! А вы нашли структуру БАЙТОВ !

Смотрите в FAQ - там есть структура из БИТ. Там же примеры как написать макросы через #define
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
chief
Потрогал лапой паяльник
Сообщения: 397
Зарегистрирован: Ср сен 19, 2007 09:21:04

Сообщение chief »

ARV писал(а):ну, можно использовать макросы _BV(), bit_is_set() и т.п.

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

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

unsigned char FLAGS;
#define FLAG1   3

int main()
{
FLAGS |= _BV(FLAG1);
//FLAGS &= (unsigned char)~(_BV(FLAG1));
if bit_is_clear (FLAGS,FLAG1) FLAGS = 0x50;
   else FLAGS = 0x80;   

   while (1);
}

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

Сообщение ARV »

можно еще использовать расширение Си (из С++) - структуру типа битовое поле (bitfields)... но во-первых, это будет явно несовместимо с другими компиляторами Си, а во-вторых, эти битовые поля не всегда дают компактный код...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
MAPT
Родился
Сообщения: 12
Зарегистрирован: Вт июн 03, 2008 17:41:23

Сообщение MAPT »

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

Сообщение ARV »

используйте правльную функцию _delay_us(480) - зачем применять _delay_loop_2()?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
MAPT
Родился
Сообщения: 12
Зарегистрирован: Вт июн 03, 2008 17:41:23

Сообщение MAPT »

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

Сообщение ARV »

пардон
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Lepehin Evgeniy
Открыл глаза
Сообщения: 72
Зарегистрирован: Вс сен 07, 2008 13:17:31
Откуда: Город Невест

Сообщение Lepehin Evgeniy »

используйте правльную функцию _delay_us(480)

И это правилно, но, если я ни с чем не путаю, где-то в документации или delay.h я вычитал про ограничение задержки в этой функции в зависимости от частоты кристалла. Причем там написано, что сообщение об ошибке не выдается, а задержка то-ли вообще отсутствует, то ли еще что. Сейчас я погряз в одном старом 83г выпуска уродстве и голова забита. Но вот кусок из моей проги(обмен с дисплеем)-не зря же я так написал. А может перепутал что-уже и самому интересно(склероз не вылечить, но можно о нем забыть):

//при 16МГц макс 16mS в этой функции,по этому 4 раза по 10
_delay_ms (10);
_delay_ms (10);
_delay_ms (10);
_delay_ms (10);

про _delay_us, если я прав, можно тоже сказать. Но я могу и путать, не ругайтесь!
Lepehin Evgeniy
Открыл глаза
Сообщения: 72
Зарегистрирован: Вс сен 07, 2008 13:17:31
Откуда: Город Невест

Сообщение Lepehin Evgeniy »

Нашел-это тест для индикатора. Человек просил написать для данной схемы. Там был МТ-10-Т7, а он хотел приспособить LCD на HD44780.
_delay_us там тоже ограничивается. Прилагается комплект для протеуса.
Вложения
Prot_test595.rar
Proteus&WinAVR test project для HD44780
(45.45 КБ) 346 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

что там в 83 году было - я не в курсе, но сейчас все прилично.

правда, дело вот как обстоит: если указать в качестве параметра значение задержки БОЛЬШЕ, чем данная функция поддерживает - происходит автоматическое ухудшение ТОЧНОСТИ, но задержка отрабатывается.

например, для _delay_us определена максимально допустимая задержка в 768/F_CPU микросекунд (где F_CPU - частота в мегагерцах). если передать ей в качестве параметра БОЛЬШЕЕ число - функция автоматом превратится в вызов _delay_ms, и соответственно не сможет отработать "хвостик" в микросекундах. об этом действительно никаких сообщений не выдается - но ведь вы и сами должны понимать, что нельзя требовать и больших задержек и при этом с точностью до микросекунды от одной функции... для этого иные методы есть (хотя само требование таких задержек сомнительно)
аналогично происходит и при обращении к _delay_ms - по мере увеличения значения параметра плавно понижается точность выдержки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Lepehin Evgeniy
Открыл глаза
Сообщения: 72
Зарегистрирован: Вс сен 07, 2008 13:17:31
Откуда: Город Невест

Сообщение Lepehin Evgeniy »

В 83г фирма BOSCH выпустила чпу CC300. И здесь
но сейчас все прилично
я с вами не согласен, так как это уродство "и сейчас живее всех живых".
Из вашего ответа напрашивается вопрос-а что будет если превысить _delay_ms ? Она во что превратится ? И если существует(простите за темноту) _delay_s во что она превратится и т.д. ?
Для самообразования да и людям тоже интересно будет.
С уважением.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я имел ввиду "прилично" - это действия WinAVR :) и ничего более.

_delay_ms() может обеспечивать задержки до 65535 секунд. не забывайте, что и _delay_us() и _delay_ms() в качестве параметра получают дробное число (double).
как именно изменяется точность выдержек - я не могу сказать, но вплоть до единиц секунд погрешность меньше 1%. на малых задержках погрешность может быть больше, т.к. задержка в принципе кратна 3-ем машинным тактам (для _delay_us)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Lepehin Evgeniy
Открыл глаза
Сообщения: 72
Зарегистрирован: Вс сен 07, 2008 13:17:31
Откуда: Город Невест

Сообщение Lepehin Evgeniy »

Засомневался я совсем и решил порыть немного.
например, для _delay_us определена максимально допустимая задержка в 768/F_CPU микросекунд (где F_CPU - частота в мегагерцах). если передать ей в качестве параметра БОЛЬШЕЕ число - функция автоматом превратится в вызов _delay_ms

Увы, никто ни в кого не превращается, а ограничивается- FF для delay_us-вот текст её:

The maximal possible delay is 768 us / F_CPU in MHz.
*/
void
_delay_us(double __us)
{
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp <1> 255)
__ticks = 0; /* i.e. 256 */
else
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
}
Что бы мы туда не передали-будет /* i.e. 256 */, если вышли за рамки в большую сторону и 1 если в меньшую.
В _delay_loop_1 это декрементируется без затей, там же можно прочитать про те же 768 us на 1МГц.
Та же ерунда с миллисекундами. А написал я все это, так как наступил на эти грабли-задал больше чем нужно, естественно не заработало, ограничившись макс. задержкой, которой мне не хватило, а уведомления об этом безобразии я не получил.
как именно изменяется точность выдержек - я не могу сказать

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

Сообщение ARV »

без лишних слов привожу цитату из документации avr-libc версии 1.6.0 для WinAVR:
Function Documentation
void _delay_ms ( double __ms )

Perform a delay of __ms milliseconds, using _delay_loop_2().

The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

The maximal possible delay is 262.14 ms / F_CPU in MHz.

When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution.


void _delay_us ( double __us )

Perform a delay of __us microseconds, using _delay_loop_1().

The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

The maximal possible delay is 768 us / F_CPU in MHz.

If the user requests a delay greater than the maximal possible one, _delay_us() will automatically call _delay_ms() instead. The user will not be informed about this case.

скажите мне, разве здесь не написано то, что я писал ранее?

привожу так же код функции _delay_us()

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

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);
}

я так понимаю, ваша проблема в устаревшей версии WinAVR...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Lepehin Evgeniy
Открыл глаза
Сообщения: 72
Зарегистрирован: Вс сен 07, 2008 13:17:31
Откуда: Город Невест

Сообщение Lepehin Evgeniy »

я так понимаю, ваша проблема в устаревшей версии WinAVR

Скорее всего, хотя новое-часто хорошо забытое старое. Или вот-мне нравится: Выпущена новая версия программы-убраны старые ошибки и добавлены новые(а ведь старый глюк лучше новых двух). Что и подтверждает оставшийся
The user will not be informed about this case.
У меня версия 2006 года. С новыми версиями в протеусе перестали видеться переменые, я тогда занят был более приятным делом, чем в данный момент и решил остановиться на том, что без "конфигурирования" работает. Подведем итог-ваша версия правоты свежее.
С уважением.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

не думаю, что это глюк - предупрежден, значит вооружен :)

а в протеусе переменные не видятся, если их оптимизатор почикал - они и в AVR Studio не видятся тогда... не знаю, как новый, а мой протеус вообще многофайловые проекты не понимает из-под WinAVR - вообще исходники не показывает :(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а): мой протеус из-под WinAVR - вообще исходники не показывает :(

PROTEUS 7.2 sp2 sp6 и 7.4 показывает исходники и из под WinAVR - скриншоты и проект у меня на стр. 4 в домашней. использую .elf
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Ответить

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