Страница 8 из 111
Добавлено: Пт сен 26, 2008 22:09:59
tych
Наверно в виде структуры - примеры есть в FAQ по микроконтроллерам - у меня на домашней страничке.
Добавлено: Пт сен 26, 2008 22:38:49
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 и использовать ее в другой процедуре как флаг.
Добавлено: Пт сен 26, 2008 23:37:45
ARV
ну, можно использовать макросы _BV(), bit_is_set() и т.п.
Добавлено: Сб сен 27, 2008 08:25:33
tych
chief писал(а):пример нашел. Он под IAR. Кажется это немного не то
Для флага БИТа достаточно ! А вы нашли структуру БАЙТОВ !
Смотрите в FAQ - там есть структура из БИТ. Там же примеры как написать макросы через
#define
Добавлено: Вс сен 28, 2008 16:01:15
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);
}
вот то чего добивался.

Добавлено: Вс сен 28, 2008 16:11:56
ARV
можно еще использовать расширение Си (из С++) - структуру типа битовое поле (bitfields)... но во-первых, это будет явно несовместимо с другими компиляторами Си, а во-вторых, эти битовые поля не всегда дают компактный код...
Добавлено: Вт сен 30, 2008 17:27:12
MAPT
Всем привет. Можете помочь разобраться с функцией _delay_loop_2 Мне надо сделать задержку 480мкс, использую кварц на 8МГц. Какое число я должен передать этой функции в качестве аргумента, и как оно вообще рассчитывается?
Добавлено: Вт сен 30, 2008 17:45:20
ARV
используйте правльную функцию _delay_us(480) - зачем применять _delay_loop_2()?!
Добавлено: Вт сен 30, 2008 18:02:46
MAPT
Спасибо! Просто я сидел и ковырялся в чужих исходниках, а там везде эта функция использовалась
Добавлено: Чт окт 09, 2008 17:49:09
ARV
пардон
Добавлено: Чт окт 09, 2008 18:09:19
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, если я прав, можно тоже сказать. Но я могу и путать, не ругайтесь!
Добавлено: Чт окт 09, 2008 18:18:16
Lepehin Evgeniy
Нашел-это тест для индикатора. Человек просил написать для данной схемы. Там был МТ-10-Т7, а он хотел приспособить LCD на HD44780.
_delay_us там тоже ограничивается. Прилагается комплект для протеуса.
Добавлено: Чт окт 09, 2008 18:25:41
ARV
что там в 83 году было - я не в курсе, но сейчас все прилично.
правда, дело вот как обстоит: если указать в качестве параметра значение задержки БОЛЬШЕ, чем данная функция поддерживает - происходит автоматическое ухудшение ТОЧНОСТИ, но задержка отрабатывается.
например, для _delay_us определена максимально допустимая задержка в 768/F_CPU микросекунд (где F_CPU - частота в мегагерцах). если передать ей в качестве параметра БОЛЬШЕЕ число - функция автоматом превратится в вызов _delay_ms, и соответственно не сможет отработать "хвостик" в микросекундах. об этом действительно никаких сообщений не выдается - но ведь вы и сами должны понимать, что нельзя требовать и больших задержек и при этом с точностью до микросекунды от одной функции... для этого иные методы есть (хотя само требование таких задержек сомнительно)
аналогично происходит и при обращении к _delay_ms - по мере увеличения значения параметра плавно понижается точность выдержки...
Добавлено: Чт окт 09, 2008 18:46:57
Lepehin Evgeniy
В 83г фирма BOSCH выпустила чпу CC300. И здесь
но сейчас все прилично
я с вами не согласен, так как это уродство "и сейчас живее всех живых".
Из вашего ответа напрашивается вопрос-а что будет если превысить _delay_ms ? Она во что превратится ? И если существует(простите за темноту) _delay_s во что она превратится и т.д. ?
Для самообразования да и людям тоже интересно будет.
С уважением.
Добавлено: Чт окт 09, 2008 19:04:52
ARV
я имел ввиду "прилично" - это действия
WinAVR 
и ничего более.
_delay_ms() может обеспечивать задержки до
65535 секунд. не забывайте, что и
_delay_us() и
_delay_ms() в качестве параметра получают дробное число (
double).
как именно изменяется точность выдержек - я не могу сказать, но вплоть до единиц секунд погрешность меньше 1%. на малых задержках погрешность может быть больше, т.к. задержка в принципе кратна 3-ем машинным тактам (для
_delay_us)
Добавлено: Чт окт 09, 2008 20:59:14
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МГц.
Та же ерунда с миллисекундами. А написал я все это, так как наступил на эти грабли-задал больше чем нужно, естественно не заработало, ограничившись макс. задержкой, которой мне не хватило, а уведомления об этом безобразии я не получил.
как именно изменяется точность выдержек - я не могу сказать
Если я все правильно понимаю, то никак. Она либо есть со своим допуском, либо кончается совсем, когда хочешь слишком многого и сразу в одной строке.
С уважением.
Добавлено: Чт окт 09, 2008 21:12:27
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...
Добавлено: Чт окт 09, 2008 22:53:15
Lepehin Evgeniy
я так понимаю, ваша проблема в устаревшей версии WinAVR
Скорее всего, хотя новое-часто хорошо забытое старое. Или вот-мне нравится: Выпущена новая версия программы-убраны старые ошибки и добавлены новые(а ведь старый глюк лучше новых двух). Что и подтверждает оставшийся
The user will not be informed about this case.
У меня версия 2006 года. С новыми версиями в протеусе перестали видеться переменые, я тогда занят был более приятным делом, чем в данный момент и решил остановиться на том, что без "конфигурирования" работает. Подведем итог-ваша версия правоты свежее.
С уважением.
Добавлено: Чт окт 09, 2008 23:18:04
ARV
не думаю, что это глюк - предупрежден, значит вооружен
а в протеусе переменные не видятся, если их оптимизатор почикал - они и в AVR Studio не видятся тогда... не знаю, как новый, а мой протеус вообще многофайловые проекты не понимает из-под WinAVR - вообще исходники не показывает

Добавлено: Пт окт 10, 2008 06:22:24
tych
ARV писал(а): мой протеус из-под WinAVR - вообще исходники не показывает

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