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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Подскажите, как правильно реализовать ассемблерную вставку с использованием РОН-ов, чтоб не запороть оптимизацию. Предвижу вопрос "зачем это нужно?": Когда я пишу, например,

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

PORTB|=(1<<0);

компилятор из этого делает

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

sbi               0x18, 0

На выполнение этой инструкции уходит целых 2 такта, а мне нужно выводить значение в регистр за 1 такт:

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

ldi               r16,0x01
out               0x18,r16

Но боюсь, что моё использование РОН-ов не очень понравится компилятору...
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

AI_Disable писал(а):Предвижу вопрос "зачем это нужно?"
Правильно предвидите.
Зачем два такта двумя командами вместо двух тактов одной командой? Время одинаковое, только объём кода разный.
Впрочем, логика работы тоже разная, напишите

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

PORTB = (1<<0);
вместо |= и получите своё

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

ldi               r16,0x01
out               0x18,r16
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

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

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

Сообщение ARV »

гениально! одна команда за 2 такта не устраивает, а две команды по 1 такту - уже нормально :))) ржунимагу
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Да нет же, вы оба не так всё поняли :)) И я бы на вашем мете также воспринял, т.к. я умолчал о важной детали. Но всё уже работает :)
ЗЫ: А кто сказал, что я буду использовать РОН с константой только один раз? :wink:
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

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

Сообщение DimAlt »

Есть проект в winavr, в программе через define можно выбирать индикаторы с общим анодом/катодом и пару настроек и того 8 вариантов файлов. Руками переименовывать запарился. Можно это сделать через makefile?

Или хотя бы покажите, как запустить свою программу с параметрами из makefile. Читать про make пробовал, но пока не смог разобраться.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

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

Сообщение smac »

DimAlt писал(а):Есть проект в winavr, в...

Да можно наверняка и без залезания в мейкфал - просто напишите нужно количество заголовочных (*.h) файлов и включайте нужный в исходник.
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

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

Сообщение DimAlt »

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

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

Сообщение 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). результат компиляции каждой конфигурации сохраняется в отдельной папочке, потому путаницы не будет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

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

Сообщение DimAlt »

Благодарю за ответ.
Хотелось этого
в разные файлы - это уже надо править makefile

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

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

Сообщение ARV »

единожды создав несколько конфигураций для AVR Studio вы сможете получиь в разных папках версии разных прошивок, хотя сами файлы будут называться одинаково :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
otmyavrozok
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

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

Сообщение otmyavrozok »

Подскажите,а можно прочитать бит состояния выхода компаратора напрямую,например,if(bit_is_set(ACSR,ACO)){},у меня получаеся,что там всегда 0,хотя прерывания от компаратора работают беспроблемно.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

DimAlt писал(а):Хотелось этого
в разные файлы - это уже надо править makefile
...
Свою проблему решил, хоть и через одно место, запускаю программу, которая мониторит изменение выходного файла *.hex и переименовывает его анализируя дефине в *.h
Действительно, через :-)
Т.е. в каждый конкретный запуск make собирается один вариант. Это заменяется на такое:
Проще, если в исходниках всё через VARIANT, как указал выше ARV. Только опредлять его в Makefile

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

VARIANT = 2
TARGET := tst-$(VARIANT)
 # ну или как там имя проекта у Вас задаётся

OBJDIR := ./obj-$(VARIANT)

CFLAGS += -DVARIANT=$(VARIANT)
И для смены варинта прошивки меняем VARIANT в Makefile
Поскольку каталог для объектных файлов тоже зависит от этой пременной, объектники не перепутаются. Но я всё равно всегда ставлю зависимость объектников от Makefile, чтобы при смене опций окмпиляции автоматически перекомпилировалоьс всё

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

$(OBJS) : 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

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

all :  $(TARGET)
а уже она автоматически по TARGET будет собирать нужный вариант.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

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

Сообщение DimAlt »

Огромное спасибо! :beer: Буду пробовать.
Аватара пользователя
nsl2004
Мучитель микросхем
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

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

Сообщение 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%, у меня не работает. Ситуация повторяется. Может что подскажет сообщество?
Аватара пользователя
nsl2004
Мучитель микросхем
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

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

Сообщение nsl2004 »

Всем счастливым обладателям Vista 64. Если у Вас возникла с WinAvr проблема как у меня. См.пост выше. То помогает замена входящей в дистрибутив dll-ки msys-1.0.dll. Взять правильную можно вот на этой странице http://www.madwizard.org/electronics/articles/winavrvista. Удачи
Аватара пользователя
chem_kot
Родился
Сообщения: 12
Зарегистрирован: Пт мар 26, 2010 15:19:19
Откуда: Москва

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

Сообщение 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);
 

 
}
}
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Подскажите, в чём заключается опасность юзания goto и можно ли его применить разик для выхода из цикла или это недопустимо ни в коем случаи?

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

int main()
{
...
all:
...
while(1)
   {
   ...
   if(...)
      {
      ...
      if(...)
         {
         ...
         if(...)
            {
            ...
            goto all;
            }   
         }
      }
   }
}

Да, можно обойтись без goto. Но при этом вес кода значительно увеличится, чего я никак не могу себе позволить.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Надо - пользуйся. В данном случае я не вижу разумной альтернативы. Введение какого-то внешнего относительно всех циклов флага (бывает и цикл-то не один, вложено несколько), проверка его в каждом условии и фиговый листок break - только затрудняет чтение таких мест.
Грубо - один goto на тыщёнку строк кода это нормально, на мой взгляд, есть места, где без него только хуже.
"тыщёнка" - это условное понятие, зависящее от характера программы и темперамента программиста, меняться должна в пределах, скажем, 500-5000.

Естественно, это моё сугубо личное мнение, кто-то может счесть, что я "учу людей плохому". Спорить не буду, каждый может высказать свои аргументы, после чего каждый - сделать свои выводы.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

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

Сообщение smac »

AI_Disable писал(а):Подскажите, в чём заключается опасность юзания goto и можно ли его применить разик для выхода из цикла или это недопустимо ни в коем случаи?

Согласен с предыдущим оратором. Один маленький совет: желательно чтобы goto и метка были видны одновременно при редактировании и просмотре кода.
Ответить

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