WinAvr в вопросах и ответах
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Наверно в виде структуры - примеры есть в FAQ по микроконтроллерам - у меня на домашней страничке.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
пример нашел. Он под IAR. Кажется это немного не то:
мне же нужно присвоить переменной 0 или 1 и использовать ее в другой процедуре как флаг.
Код: Выделить всё
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 и использовать ее в другой процедуре как флаг.
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
chief писал(а):пример нашел. Он под IAR. Кажется это немного не то
Для флага БИТа достаточно ! А вы нашли структуру БАЙТОВ !
Смотрите в FAQ - там есть структура из БИТ. Там же примеры как написать макросы через #define
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
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
- Откуда: Новочеркасск
- Контактная информация:
можно еще использовать расширение Си (из С++) - структуру типа битовое поле (bitfields)... но во-первых, это будет явно несовместимо с другими компиляторами Си, а во-вторых, эти битовые поля не всегда дают компактный код...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
используйте правльную функцию _delay_us(480) - зачем применять _delay_loop_2()?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
пардон
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Lepehin Evgeniy
- Открыл глаза
- Сообщения: 72
- Зарегистрирован: Вс сен 07, 2008 13:17:31
- Откуда: Город Невест
используйте правльную функцию _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
- Откуда: Город Невест
Нашел-это тест для индикатора. Человек просил написать для данной схемы. Там был МТ-10-Т7, а он хотел приспособить LCD на HD44780.
_delay_us там тоже ограничивается. Прилагается комплект для протеуса.
_delay_us там тоже ограничивается. Прилагается комплект для протеуса.
- Вложения
-
- Prot_test595.rar
- Proteus&WinAVR test project для HD44780
- (45.45 КБ) 346 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
что там в 83 году было - я не в курсе, но сейчас все прилично.
правда, дело вот как обстоит: если указать в качестве параметра значение задержки БОЛЬШЕ, чем данная функция поддерживает - происходит автоматическое ухудшение ТОЧНОСТИ, но задержка отрабатывается.
например, для _delay_us определена максимально допустимая задержка в 768/F_CPU микросекунд (где F_CPU - частота в мегагерцах). если передать ей в качестве параметра БОЛЬШЕЕ число - функция автоматом превратится в вызов _delay_ms, и соответственно не сможет отработать "хвостик" в микросекундах. об этом действительно никаких сообщений не выдается - но ведь вы и сами должны понимать, что нельзя требовать и больших задержек и при этом с точностью до микросекунды от одной функции... для этого иные методы есть (хотя само требование таких задержек сомнительно)
аналогично происходит и при обращении к _delay_ms - по мере увеличения значения параметра плавно понижается точность выдержки...
правда, дело вот как обстоит: если указать в качестве параметра значение задержки БОЛЬШЕ, чем данная функция поддерживает - происходит автоматическое ухудшение ТОЧНОСТИ, но задержка отрабатывается.
например, для _delay_us определена максимально допустимая задержка в 768/F_CPU микросекунд (где F_CPU - частота в мегагерцах). если передать ей в качестве параметра БОЛЬШЕЕ число - функция автоматом превратится в вызов _delay_ms, и соответственно не сможет отработать "хвостик" в микросекундах. об этом действительно никаких сообщений не выдается - но ведь вы и сами должны понимать, что нельзя требовать и больших задержек и при этом с точностью до микросекунды от одной функции... для этого иные методы есть (хотя само требование таких задержек сомнительно)
аналогично происходит и при обращении к _delay_ms - по мере увеличения значения параметра плавно понижается точность выдержки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Lepehin Evgeniy
- Открыл глаза
- Сообщения: 72
- Зарегистрирован: Вс сен 07, 2008 13:17:31
- Откуда: Город Невест
В 83г фирма BOSCH выпустила чпу CC300. И здесь
Из вашего ответа напрашивается вопрос-а что будет если превысить _delay_ms ? Она во что превратится ? И если существует(простите за темноту) _delay_s во что она превратится и т.д. ?
Для самообразования да и людям тоже интересно будет.
С уважением.
я с вами не согласен, так как это уродство "и сейчас живее всех живых".но сейчас все прилично
Из вашего ответа напрашивается вопрос-а что будет если превысить _delay_ms ? Она во что превратится ? И если существует(простите за темноту) _delay_s во что она превратится и т.д. ?
Для самообразования да и людям тоже интересно будет.
С уважением.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
я имел ввиду "прилично" - это действия WinAVR :) и ничего более.
_delay_ms() может обеспечивать задержки до 65535 секунд. не забывайте, что и _delay_us() и _delay_ms() в качестве параметра получают дробное число (double).
как именно изменяется точность выдержек - я не могу сказать, но вплоть до единиц секунд погрешность меньше 1%. на малых задержках погрешность может быть больше, т.к. задержка в принципе кратна 3-ем машинным тактам (для _delay_us)
_delay_ms() может обеспечивать задержки до 65535 секунд. не забывайте, что и _delay_us() и _delay_ms() в качестве параметра получают дробное число (double).
как именно изменяется точность выдержек - я не могу сказать, но вплоть до единиц секунд погрешность меньше 1%. на малых задержках погрешность может быть больше, т.к. задержка в принципе кратна 3-ем машинным тактам (для _delay_us)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Lepehin Evgeniy
- Открыл глаза
- Сообщения: 72
- Зарегистрирован: Вс сен 07, 2008 13:17:31
- Откуда: Город Невест
Засомневался я совсем и решил порыть немного.
Увы, никто ни в кого не превращается, а ограничивается- 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МГц.
Та же ерунда с миллисекундами. А написал я все это, так как наступил на эти грабли-задал больше чем нужно, естественно не заработало, ограничившись макс. задержкой, которой мне не хватило, а уведомления об этом безобразии я не получил.
Если я все правильно понимаю, то никак. Она либо есть со своим допуском, либо кончается совсем, когда хочешь слишком многого и сразу в одной строке.
С уважением.
например, для _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
- Откуда: Новочеркасск
- Контактная информация:
без лишних слов привожу цитату из документации avr-libc версии 1.6.0 для WinAVR:
скажите мне, разве здесь не написано то, что я писал ранее?
привожу так же код функции _delay_us()
я так понимаю, ваша проблема в устаревшей версии 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
- Откуда: Город Невест
я так понимаю, ваша проблема в устаревшей версии WinAVR
Скорее всего, хотя новое-часто хорошо забытое старое. Или вот-мне нравится: Выпущена новая версия программы-убраны старые ошибки и добавлены новые(а ведь старый глюк лучше новых двух). Что и подтверждает оставшийся
У меня версия 2006 года. С новыми версиями в протеусе перестали видеться переменые, я тогда занят был более приятным делом, чем в данный момент и решил остановиться на том, что без "конфигурирования" работает. Подведем итог-ваша версия правоты свежее.The user will not be informed about this case.
С уважением.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не думаю, что это глюк - предупрежден, значит вооружен
а в протеусе переменные не видятся, если их оптимизатор почикал - они и в AVR Studio не видятся тогда... не знаю, как новый, а мой протеус вообще многофайловые проекты не понимает из-под WinAVR - вообще исходники не показывает
а в протеусе переменные не видятся, если их оптимизатор почикал - они и в AVR Studio не видятся тогда... не знаю, как новый, а мой протеус вообще многофайловые проекты не понимает из-под WinAVR - вообще исходники не показывает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
ARV писал(а): мой протеус из-под WinAVR - вообще исходники не показывает
PROTEUS 7.2 sp2 sp6 и 7.4 показывает исходники и из под WinAVR - скриншоты и проект у меня на стр. 4 в домашней. использую .elf
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru