Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение частоты в AVR Studio 5
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DVF
Прошу помочь отцедить проблему с определением частоты МК в проекте в AVR Studio 5. После добавления в свойствах проекта "AVR/GNU C Compiler" -> "Symbols" -> "Defined symbols" параметра "F_CPU=12000000UL", получаю в All options следующее:
-funsigned-char -funsigned-bitfields -DF_CPU=12000000UL -Os -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -mmcu=atmega8
В проекте проводится предварительная проверка перед сборкой на предмет допустимой устанавливаемой частоты.

Собственно сам проект. В файле usbconfig.h первое определение, использующее F_CPU:
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
а в файле usbdrvasm.S проверка наличия объявления этого определения и по условию подключение соответствующего include:
# if USB_CFG_CLOCK_KHZ == 12000
# include "usbdrvasm12.inc"
Нажмите для просмотра прикрепленного файла
demiurg_spb
ИМХО, Си-define's не спускаются на уровень ассемблера...
DVF
А в AVR Studio 4 спускались? Из под нее все работает.
-DF_CPU=12000000UL это пишется для usbdrvasm.S и даже если отбросить упоминание о #define USB_CFG_CLOCK_KHZ (F_CPU/1000) в usbconfig.h, то в usbdrvasm.S все равно должно все проходить гладко:
Код
;----------------------------------------------------------------------------
; Now include the clock rate specific code
;----------------------------------------------------------------------------

#ifndef USB_CFG_CLOCK_KHZ
#   ifdef F_CPU
#       define USB_CFG_CLOCK_KHZ (F_CPU/1000)
#   else
#       error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!"
#   endif
#endif

#if USB_CFG_CHECK_CRC   /* separate dispatcher for CRC type modules */
#   if USB_CFG_CLOCK_KHZ == 18000
#       include "usbdrvasm18-crc.inc"
#   else
#       error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
#   endif
#else   /* USB_CFG_CHECK_CRC */
#   if USB_CFG_CLOCK_KHZ == 12000
#       include "usbdrvasm12.inc"
#   elif USB_CFG_CLOCK_KHZ == 12800
#       include "usbdrvasm128.inc"
#   elif USB_CFG_CLOCK_KHZ == 15000
#       include "usbdrvasm15.inc"
#   elif USB_CFG_CLOCK_KHZ == 16000
#       include "usbdrvasm16.inc"
#   elif USB_CFG_CLOCK_KHZ == 16500
#       include "usbdrvasm165.inc"
#   elif USB_CFG_CLOCK_KHZ == 20000
#       include "usbdrvasm20.inc"
#   else
#       error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!"
#   endif
#endif /* USB_CFG_CHECK_CRC */
demiurg_spb
Возможно вы и правы, единственное, что я точно знаю, это что из мэйк файла точно можно передать ассемблеру дефайны, через
-Wa,ASFLAGS
DVF
В Studio 5 это звучит как:
Код
# AVR/GNU Assembler

./%.o: .././%.s
    @echo Building file: $<
    @echo Invoking: AVR/GNU Assembler
    $(QUOTE)$(AVR_APP_PATH)avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c  -mmcu=atmega8   -o"$@" "$<"
    @echo Finished building: $<
demiurg_spb
Ну так приведите пример во что это разворачивается на примере ассемблерного файла из вашего проекта.
А ещё бы весь makefile посмотреть не мешало. Может Вы UL к константе зря дописываете, в некоторых вариантах бывает, что нужно определить
F_CPU=16000000
а дальше в makefile такое:
CDEFS = -DF_CPU=$(F_CPU)UL

Вот и Сергей Борщ более точный hint вам даёт...

Обратите внимание на отсутствие UL во второй строчке его примера, когда формируется строка флагов для вызова ассемблера.
Я сам до этого момента не обращал на это внимания.
Сергей Борщ
QUOTE (DVF @ Oct 10 2011, 08:35) *
а в файле usbdrvasm.S проверка наличия объявления этого определения и по условию подключение соответствующего include:
Так а ругается-то на что? С ходу видно, что в ассемблерный файл передается "Сишное" определение частоты, с квалификатором UL, которого ассемблер понимать не должен. Я не пользуюсь студией, но в моих makefile написано примерно следующее:
CODE
CFLAGS += -DF_CPU=$(F_CPU)UL
ASMFLAGS += -DF_CPU=$(F_CPU)


QUOTE (DVF @ Oct 10 2011, 09:39) *
даже если отбросить упоминание о #define USB_CFG_CLOCK_KHZ (F_CPU/1000) в usbconfig.h, то в usbdrvasm.S все равно должно все проходить гладко:
Вообще-то это работать не должно. Препроцессор выполняет текстовые подстановки, а вычисления вроде F_CPU/1000 происходят на этапе компиляции, когда препроцессор уже отработал. Т.е. по логике не должно выполняться ни одно из этих условий. Или я что-то не до конца понимаю в работе препроцессора.
DVF
Я тоже не силен. Проект прикреплял, если надо на makefile взглянуть. Кстати и без UL пробовал с тем же результатом. И опять-таки Вы даете пример как makefile четвертой студии, а в пятой он немного другой.
Забыл. Ругается: error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" - это из предыдущего приведенного кода файла usbdrvasm.S
demiurg_spb
Откажитесь от "менюшого" способа настройки makefile и всё встанет на свои места.
Для сборки проекта студия не требуется вовсе...
DVF
В том то и дело, что я не силен в этих делах.
demiurg_spb
Возьмите за основу пример одного из проектов, идущих с WinAVR.
Там для начала достаточно внятно написано. Будут вопросы - поможем.

Цитата(DVF @ Oct 10 2011, 15:22) *
Забыл. Ругается: error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" - это из предыдущего приведенного кода файла usbdrvasm.S
Правильно ругается.
У вас похоже вообще нет проблем с препроцессорм, мейкфайлом и асмовыми дефайнами.
А что у вас с USB_CFG_CHECK_CRC?
Сергей Борщ
QUOTE (DVF @ Oct 10 2011, 14:22) *
Я тоже не силен. Проект прикреплял, если надо на makefile взглянуть. Кстати и без UL пробовал с тем же результатом. И опять-таки Вы даете пример как makefile четвертой студии, а в пятой он немного другой.
makefile вообще-то для утилиты make. Работает без студии. Студия может его генерировать, но это уже другой вопрос.

QUOTE (DVF @ Oct 10 2011, 14:22) *
Забыл. Ругается: error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!" - это из предыдущего приведенного кода файла usbdrvasm.S
Вот-вот. Не выполнилось ни одно из условий. О чем я и писал. И в четвертой студии должно было быть то же самое. Ну не умеет препроцессор делить.
Но если вы посмотрите в начало отцитированного вами файла, то увидите такие строки:
CODE
#ifndef USB_CFG_CLOCK_KHZ
#   ifdef F_CPU
#       define USB_CFG_CLOCK_KHZ (F_CPU/1000)
т.е. вам нужно определить USB_CFG_CLOCK_KHZ точно таким же образом, как вы определяли F_CPU, и тогда неправильная часть этого файла не будет участвовать в компиляции.

DVF
USB_CFG_CHECK_CRC не определен, так как мне не нужна проверка контрольных сумм. Иначе будет подключен usbdrvasm18-crc.inc, если укажу и буду работать с частотой 18МГц или выведена та же ошибка, если не укажу необходимую частоту.
DVF
Цитата(Сергей Борщ @ Oct 10 2011, 15:43) *
И в четвертой студии должно было быть то же самое. Ну не умеет препроцессор делить.

Но здесь все собирается.
Если я определяю USB_CFG_CLOCK_KHZ в makefile (а в usbconfig.h заредактирую), то ругается и на то, что он не определен и на то, что F_CPU не определен, а дальше и недостойная частота. Если я в usbconfig.h делаю все определения, то ругается на переопределения и неопределение F_CPU для util/delay.h
Походу у меня уже шарики за ролики...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.