Страница 26 из 111
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 14, 2010 11:14:41
AI_Disable
Подскажите, как правильно реализовать ассемблерную вставку с использованием РОН-ов, чтоб не запороть оптимизацию. Предвижу вопрос "зачем это нужно?": Когда я пишу, например,
компилятор из этого делает
На выполнение этой инструкции уходит целых 2 такта, а мне нужно выводить значение в регистр за 1 такт:
Но боюсь, что моё использование РОН-ов не очень понравится компилятору...
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 14, 2010 15:49:14
avreal
AI_Disable писал(а):Предвижу вопрос "зачем это нужно?"
Правильно предвидите.
Зачем два такта двумя командами вместо двух тактов одной командой? Время одинаковое, только объём кода разный.
Впрочем, логика работы тоже разная, напишите
вместо |= и получите своё
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 14, 2010 17:48:27
AI_Disable
Ага, всего лишь стоило убрать или...

Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 14, 2010 22:37:36
ARV
гениально! одна команда за 2 такта не устраивает, а две команды по 1 такту - уже нормально

ржунимагу
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 14, 2010 23:04:08
AI_Disable
Да нет же, вы оба не так всё поняли

И я бы на вашем мете также воспринял, т.к. я умолчал о важной детали. Но всё уже работает

ЗЫ: А кто сказал, что я буду использовать РОН с константой только один раз?

Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 21, 2010 14:19:27
DimAlt
Есть проект в winavr, в программе через define можно выбирать индикаторы с общим анодом/катодом и пару настроек и того 8 вариантов файлов. Руками переименовывать запарился. Можно это сделать через makefile?
Или хотя бы покажите, как запустить свою программу с параметрами из makefile. Читать про make пробовал, но пока не смог разобраться.
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 21, 2010 17:37:40
smac
DimAlt писал(а):Есть проект в winavr, в...
Да можно наверняка и без залезания в мейкфал - просто напишите нужно количество заголовочных (*.h) файлов и включайте нужный в исходник.
Re: WinAvr в вопросах и ответах
Добавлено: Вс мар 21, 2010 23:33:28
DimAlt
У меня сейчас так
#define KATOD
#define NAGREV
и т. д.
Комментирую эти строки получаю на выходе разные прошивки. Написал маленькую прогу на делфи, которая переименовывает *.hex анализируя заголовочный файл. Мне б хотя бы запускать ее из makefile автоматом. Понимаю, что все это можно сделать из makefile, вот только разбираться нужно время, ну и сложно, как то, показалось..
Re: WinAvr в вопросах и ответах
Добавлено: Пн мар 22, 2010 10:05:36
ARV
вы вообще что хотите? автоматически получить одним прогоном makefile сразу 5-6 вариантов прошивок? или просто иметь возможность выборочно компилировать варианты? советую сделать вот так:
Код: Выделить всё
#if VARIANT == 1
// тут определяете комбинации дефайнов для сборки первого варианта
#elif VARIANT == 2
// тут определяете комбинации дефайнов для второго варианта
#elif VARIANT == 3
// и так далее для всех вариантов
#else
#error Надо задавать макрос VARIANT, отличный от 0!!!!
#endif
после чего при компиляции в командной строке запуска
avr-gcc просто добавляете опцию
-DVARIANT=2 - и у вас собирается вариант 2. если надо собрать сразу кучу вариантов - дело хуже, т.к. каждый вариант надо либо в свою папочку поместить, либо в разные файлы - это уже надо править
makefile, создавая правила для разных целей...
если вы собираете в AVR Studio, то там есть возможность задать несколько "конфигураций" проекта, задав для каждой свое значение опции
-DVARIANT=xx, и затем собирать их выборочно (это то же самое, что создание разных целей в
makefile). результат компиляции каждой конфигурации сохраняется в отдельной папочке, потому путаницы не будет.
Re: WinAvr в вопросах и ответах
Добавлено: Пн мар 22, 2010 18:16:33
DimAlt
Благодарю за ответ.
Хотелось этого
в разные файлы - это уже надо править makefile
Фактически, сейчас у меня тоже самое, только вместо
#define VARIANT 1
задания номера варианта, комментирую или наоборот нужные define.
Свою проблему решил, хоть и через одно место, запускаю программу, которая мониторит изменение выходного файла *.hex и переименовывает его анализируя дефине в *.h
Re: WinAvr в вопросах и ответах
Добавлено: Пн мар 22, 2010 18:46:00
ARV
единожды создав несколько конфигураций для AVR Studio вы сможете получиь в разных папках версии разных прошивок, хотя сами файлы будут называться одинаково

Re: WinAvr в вопросах и ответах
Добавлено: Ср мар 24, 2010 15:47:52
otmyavrozok
Подскажите,а можно прочитать бит состояния выхода компаратора напрямую,например,if(bit_is_set(ACSR,ACO)){},у меня получаеся,что там всегда 0,хотя прерывания от компаратора работают беспроблемно.
Re: WinAvr в вопросах и ответах
Добавлено: Ср мар 24, 2010 22:56:06
avreal
DimAlt писал(а):Хотелось этого
в разные файлы - это уже надо править makefile
...
Свою проблему решил, хоть и через одно место, запускаю программу, которая мониторит изменение выходного файла *.hex и переименовывает его анализируя дефине в *.h
Действительно, через

Т.е. в каждый конкретный запуск make собирается один вариант. Это заменяется на такое:
Проще, если в исходниках всё через VARIANT, как указал выше ARV. Только опредлять его в Makefile
Код: Выделить всё
VARIANT = 2
TARGET := tst-$(VARIANT)
# ну или как там имя проекта у Вас задаётся
OBJDIR := ./obj-$(VARIANT)
CFLAGS += -DVARIANT=$(VARIANT)
И для смены варинта прошивки меняем VARIANT в Makefile
Поскольку каталог для объектных файлов тоже зависит от этой пременной, объектники не перепутаются. Но я всё равно всегда ставлю зависимость объектников от Makefile, чтобы при смене опций окмпиляции автоматически перекомпилировалоьс всё
Для того, чтобы собрать одним махом все версии, можно сделать командный файл
build_all.bat
Код: Выделить всё
make VARIANT=1
make VARIANT=2
make VARIANT=3
make VARIANT=4
определение переменной в командной строке перекроет то, что в файле. При этом даже если была пропиана зависимость объектников от Makefile, полной перекомпиляции не будет, так как сам Makefile не меняется. Можно в батнике ещё и чистку заказать.
rebuild_all.bat
Код: Выделить всё
make VARIANT=1 clean all
make VARIANT=2 clean all
make VARIANT=3 clean all
make VARIANT=4 clean all
Само собой, в Makefile должна быть прописана традиционная цель по умолчанию all
а уже она автоматически по TARGET будет собирать нужный вариант.
Re: WinAvr в вопросах и ответах
Добавлено: Ср мар 24, 2010 23:02:44
DimAlt
Огромное спасибо!

Буду пробовать.
Re: WinAvr в вопросах и ответах
Добавлено: Чт мар 25, 2010 12:57:12
nsl2004
У меня такая вот проблема
../test.c:29: fatal error: opening dependency file dep/test.o.d: No such file or directory
Все советы которые я нашел, это сделать путь покороче и без кирилицы. Сделано. Но не работает.
Причем, если я папку .dep создам вручную, в нее положу пустой файл temp.o.d ( соответственно названию файла) все начинает работать. Если запустить Make Clean ? то все ранее созданные файлы удаляются, и при MakeAll ничего не создается и выпадает запись которую я привел выше. Пробовал чужой Makefile ? который работакет 100%, у меня не работает. Ситуация повторяется. Может что подскажет сообщество?
Re: WinAvr в вопросах и ответах
Добавлено: Пт мар 26, 2010 14:45:03
nsl2004
Всем счастливым обладателям Vista 64. Если у Вас возникла с WinAvr проблема как у меня. См.пост выше. То помогает замена входящей в дистрибутив dll-ки msys-1.0.dll. Взять правильную можно вот на этой странице
http://www.madwizard.org/electronics/ar ... inavrvista. Удачи
Re: WinAvr в вопросах и ответах
Добавлено: Пт мар 26, 2010 15:26:18
chem_kot
Здравствуйте.
Напишите, пожалуйста, код для управления 3-мя каналами аппаратного ШИМа Atmega8 в WinAVR. Пробовал переносить работающий код из кодевижн, но в винавр он не работает(на соответствующих выводах МК ничего не изменяется при изменении регистров управления ШИМом)
ВОт кстати не работающий код:
Код: Выделить всё
int main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTD=0x00;
DDRD=0xFF;
PORTC=0x00;
DDRC=0x00;
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=250;
OCR1BH=0x00;
OCR1BL=250;
ASSR=0x00;
TCCR2=0x69;
TCNT2=0x00;
OCR2=250;
OCR1AL=255;
OCR1BL = 255;
OCR2 = 255;
sei();
while (1)
{
OCR1AL--;
OCR1BL--;
OCR2--;
_delay_us(25);
}
}
Re: WinAvr в вопросах и ответах
Добавлено: Сб апр 03, 2010 17:03:19
AI_Disable
Подскажите, в чём заключается опасность юзания goto и можно ли его применить разик для выхода из цикла или это недопустимо ни в коем случаи?
Код: Выделить всё
int main()
{
...
all:
...
while(1)
{
...
if(...)
{
...
if(...)
{
...
if(...)
{
...
goto all;
}
}
}
}
}
Да, можно обойтись без goto. Но при этом вес кода значительно увеличится, чего я никак не могу себе позволить.
Re: WinAvr в вопросах и ответах
Добавлено: Сб апр 03, 2010 19:21:29
avreal
Надо - пользуйся. В данном случае я не вижу разумной альтернативы. Введение какого-то внешнего относительно всех циклов флага (бывает и цикл-то не один, вложено несколько), проверка его в каждом условии и фиговый листок break - только затрудняет чтение таких мест.
Грубо - один goto на тыщёнку строк кода это нормально, на мой взгляд, есть места, где без него только хуже.
"тыщёнка" - это условное понятие, зависящее от характера программы и темперамента программиста, меняться должна в пределах, скажем, 500-5000.
Естественно, это моё сугубо личное мнение, кто-то может счесть, что я "учу людей плохому". Спорить не буду, каждый может высказать свои аргументы, после чего каждый - сделать свои выводы.
Re: WinAvr в вопросах и ответах
Добавлено: Сб апр 03, 2010 22:38:01
smac
AI_Disable писал(а):Подскажите, в чём заключается опасность юзания goto и можно ли его применить разик для выхода из цикла или это недопустимо ни в коем случаи?
Согласен с предыдущим оратором. Один маленький совет: желательно чтобы goto и метка были видны одновременно при редактировании и просмотре кода.