|
|
  |
Использование библиотеки freemodbus, Как скомпилировать cof-файл для библиотеки freemodbus |
|
|
|
Jun 24 2009, 12:13
|
Группа: Участник
Сообщений: 3
Регистрация: 28-06-08
Из: СПб
Пользователь №: 38 613

|
Доброго времени суток!!! Есть мультиплатформенная библиотека freemodbus (http://freemodbus.berlios.de/), которая позволяет реализовать протокол Modbus(slave). Очень хочется ее использовать. Я только начинаю работать с WinAVR, поэтому испытываю трудности при работе с make-файлами. В данной ситуации у меня не получается скомпилировать cof-файл для demo.c . Какие изменения необходимо внести в make-файл, чтобы получить cof-файл?
Makefile.rar ( 1.18 килобайт )
Кол-во скачиваний: 147Подскажите, как скомпилировать и запустить на моделирование demo в AVRStudio без внешнего make-файла? Спасибо за помощь!!! Примечание: Спасибо ARV за помощь с hex!
|
|
|
|
|
Jun 24 2009, 12:28
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Код ##Link $(TARGET).elf: $(OBJECTS) $(MBOBJECTS) $(MBPORTOBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(MBPORTOBJECTS) $(MBOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET).elf
%.hex: $(TARGET).elf ##$(OBJCOPY) -O ihex $(HEX_FLASH_FLAGS) $< $@ avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@
%.cof: $(TARGET).elf В этом участке кода попробуйте заменить Код %.cof: $(TARGET).elf на Код %.cof: $(TARGET).cof А вообще в пакете WinAVR есть утилита MFile. Попробуйте использовать ее. А еще лучше поставьте AVR_Studio и работайте через нее. К ней можно прицепить WinAVR. И она makefile сама создает.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jun 25 2009, 20:21
|
Группа: Участник
Сообщений: 3
Регистрация: 28-06-08
Из: СПб
Пользователь №: 38 613

|
Доброго времени суток!Цитата(dimka76 @ Jun 24 2009, 16:28)  В этом участке кода попробуйте заменить Код %.cof: $(TARGET).elf на Код %.cof: $(TARGET).cof Спасибо за ответ, но замена %.cof: $(TARGET).elf на %.cof: $(TARGET).cof не помогла при компилировании cof-файла. Цитата(dimka76 @ Jun 24 2009, 16:28)  А вообще в пакете WinAVR есть утилита MFile. Попробуйте использовать ее. А еще лучше поставьте AVR_Studio и работайте через нее. К ней можно прицепить WinAVR. И она makefile сама создает. Да я пользуюсь этой утилитой для создания make-файлов в WinAVR, но в данном случае в этой библиотеке очень много внутренних ссылок, и я не знаю как их подключить через эту утилиту. AVR-Studio я использую ,а именно после того как в ней появилась поддержка GCC, я перешел на нее и не жалею. При запуске demo-проекта для AVR от freemodbus с приложенным make-файлом, я могу пошагово отлаживаться только по ассемблерному коду (с ассемблером только начинаю "водить дружбу"), поэтому хотел получить cof-файл, чтобы отлаживаться на Си. Запустить demo-проект, когда AVR-Studio сама создает make-файла, у меня не получается, постоянно выскакивают ошибки, предполагаю, что нужно делать хитрые настройки в "Configuration options". К примеру, ниже приведенный код содержится в make-файле, приложенном к demo-проекту, я так понимаю, что при компиляции к проекту подключаются библиотеки, которые содержаться в папках "Port", "rtu", "ascii" и "include". Код CFLAGS = $(COMMON) \ -Iport -I. \ -I../../modbus/rtu -I../../modbus/ascii -I../../modbus/include Данные папки я подключил к AVR-Studio в "Configuration options"->"Include directories" - не помогло. Заинтересовался другим участком кода: Код OBJECTS = demo.o MBPORTOBJECTS = port/portserial.o \ port/portevent.o \ port/porttimer.o \ port/mbcrc.o MBOBJECTS = ../../modbus/mb.o \ ../../modbus/rtu/mbrtu.o \ ../../modbus/ascii/mbascii.o \ ../../modbus/functions/mbfunccoils.o \ ../../modbus/functions/mbfuncdiag.o \ ../../modbus/functions/mbfuncholding.o \ ../../modbus/functions/mbfuncinput.o \ ../../modbus/functions/mbfuncother.o \ ../../modbus/functions/mbfuncdisc.o \ ../../modbus/functions/mbutils.o (Если кто-то объяснит зачем этот участок кода в make-файле буду очень благодарен.) Попытался что-то подобное сделать в AVR-Studio в "Configuration options"->"Libraries", а именно, в окне "Library search path" указал пути, после чего в окне "Available link objects" появились portserial.o...mbutils.o, после этого с помощью кнопки "Add Libraries" данные объектные файлы я добавил в окно "Link with these objects". При компиляции в ошибках вывел имя каждого добавленного объектного файла и "No such file or directory". Подскажите, в каком направлении идти дальше? "Configuration options"
|
|
|
|
|
Jun 26 2009, 04:17
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(AlexKas @ Jun 26 2009, 00:21)  К примеру, ниже приведенный код содержится в make-файле, приложенном к demo-проекту, я так понимаю, что при компиляции к проекту подключаются библиотеки, которые содержаться в папках "Port", "rtu", "ascii" и "include". Неправильная формулировка. Это не библиотеки, а самые что ни на есть исходники. Причём в include - вообще набор хедеров. rtu, ascii - реализация соответствующего режима, port - привязка к платформе. И дался вам этот cof... Попробуйте для начала просто автоматический мэйк сделать. Для этого включите всю папку modbus со всем содержимым в проект. Цитата all: $(TARGET).elf $(TARGET).cof $(TARGET).hex $(TARGET).eep
%.cof: $(TARGET).elf $(OBJCOPY) --debugging \ --change-section-address .data-0x800000 \ --change-section-address .bss-0x800000 \ --change-section-address .noinit-0x800000 \ --change-section-address .eeprom-0x810000 -O coff-avr $< $@ Ну вот же, всё есть. Посмотрите, какой командой билд делается. Должно быть make all
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 19 2010, 10:32
|
Группа: Участник
Сообщений: 8
Регистрация: 7-07-09
Пользователь №: 51 013

|
Цитата(AlexKas @ Jun 26 2009, 00:21)  Заинтересовался другим участком кода: Код OBJECTS = demo.o MBPORTOBJECTS = port/portserial.o \ port/portevent.o \ port/porttimer.o \ port/mbcrc.o MBOBJECTS = ../../modbus/mb.o \ ../../modbus/rtu/mbrtu.o \ ../../modbus/ascii/mbascii.o \ ../../modbus/functions/mbfunccoils.o \ ../../modbus/functions/mbfuncdiag.o \ ../../modbus/functions/mbfuncholding.o \ ../../modbus/functions/mbfuncinput.o \ ../../modbus/functions/mbfuncother.o \ ../../modbus/functions/mbfuncdisc.o \ ../../modbus/functions/mbutils.o сейчас тоже пытаюсь скомпилировать freemodbus из под студии без внешнего мейкфайла. Как в студии подключить данные object файлы? Подскажите пожалуйста
|
|
|
|
|
Jun 22 2010, 09:43
|
Группа: Участник
Сообщений: 8
Регистрация: 7-07-09
Пользователь №: 51 013

|
Доброго времени суток. Разбираюсь с библиотекой freemodbus. Демо написано для мега168. Как я понял, для меги16 достаточно в мейкфайле поменять тип mcu и выставить нужную частоту кварца (F_CPU). Прошил в контроллер - не отвечает. То есть вижу по сведодиодам, что со стороны компьютера идет передача, а со стороны меги - ничего. Проверял программой Modbus_Poll, пишет ошибка таймаута. Поскажите пожалуйста, как данную библиотеку адаптировать к atmega16?
|
|
|
|
|
Jun 22 2010, 10:41
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(andre_74 @ Jun 22 2010, 13:43)  вижу по сведодиодам, что со стороны компьютера идет передача, а со стороны меги - ничего. Проверял программой Modbus_Poll, пишет ошибка таймаута. Поскажите пожалуйста, как данную библиотеку адаптировать к atmega16? Код eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN ); Настройки соответствуют? Скорость, чётность, адрес?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 27 2010, 12:26
|
Группа: Участник
Сообщений: 8
Регистрация: 7-07-09
Пользователь №: 51 013

|
Цитата(MrYuran @ Jun 22 2010, 14:41)  Код eStatus = eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN ); Настройки соответствуют? Скорость, чётность, адрес? Да, настройки соответствуют. Так и не разобрался в чем дело. Нашел в интернете исходники на С для modbus, адаптировал их под свою задачу, все прекрасно работает!
|
|
|
|
|
Jan 24 2011, 23:50
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Пытаюсь запустить freeModBus для AVR. Переделал код под IAR. Код #define REG_INPUT_START 1000 #define REG_INPUT_NREGS 4
/* ----------------------- Static variables ---------------------------------*/ static USHORT usRegInputStart = REG_INPUT_START; static USHORT usRegInputBuf[REG_INPUT_NREGS];
/* ----------------------- Start implementation -----------------------------*/ int main( void ) { eMBErrorCode eStatus;
eStatus = eMBInit( MB_RTU, 0x01, 0, 9600, MB_PAR_NONE ); __enable_interrupt();
/* Enable the Modbus Protocol Stack. */ eStatus = eMBEnable( );
for(;; ) { ( void )eMBPoll( );
/* Here we simply count the number of poll cycles. */ usRegInputBuf[0]++; } } От Мастера даю запрос на чтение одного регистра: Код mb.ReadOutputRegisters(0x01, 1000, 1, wTempData); упорно отвечает ошибкой: Код 01 83 02 C0 Контроллер Mega128, F_CPU 11059200, MB_TIMER_PRESCALER 1024 Другая реализация протокола ModBus для Mega128 на этот запрос отвечает нормально. Наблюдаю в PortMonitor. А c FreeModBus - ошибка. Уже не знаю что и думать... Куда копать?
|
|
|
|
|
Jan 25 2011, 06:26
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(alux @ Jan 25 2011, 02:50)  От Мастера даю запрос на чтение одного регистра: Код mb.ReadOutputRegisters(0x01, 1000, 1, wTempData); упорно отвечает ошибкой: Код 01 83 02 C0 Контроллер Mega128, F_CPU 11059200, MB_TIMER_PRESCALER 1024 Другая реализация протокола ModBus для Mega128 на этот запрос отвечает нормально. Наблюдаю в PortMonitor. А c FreeModBus - ошибка. Уже не знаю что и думать... Куда копать? Посмотрите диапазон адресов по умолчанию. Скорее всего он начинается не с 1000, а с 0х1000. Ну и код ошибки. Скорее всего, это оно и есть.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jan 25 2011, 18:38
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(MrYuran @ Jan 25 2011, 09:26)  Скорее всего он начинается не с 1000, а с 0х1000. Код In this example we map four 16bit input registers at the register address 1000.
#define REG_INPUT_START 1000 #define REG_INPUT_NREGS 4 С какой это радости число 1000 из примера вдруг должно быть 0x1000 = 4096 ? Сейчас нет платы, не могу проверить. Но вопрос остается открытым.
|
|
|
|
|
Feb 1 2011, 16:02
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
To MrYuranТак все-таки, в чем может быть проблема? Выкладываю проект в IAR. Посмотрите, пожалуйста, исходники.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|