Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Правильное подключение библиотек IAR для AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Dele
Добрый день!
Не могу подключить нормально библиотеку для работы с LCD, библиотеку нашел тут http://life.netimperia.com/2010/08/08/hd44780-avr/
Создал в протеусе проект с дисплеем и atmega16 но до заливки прошивки дело так и не дошло...
Сам я только познаю азы программирования под МК. Воспользовался IAR, мне он показался удобным...
Так вот, файлы с архива засунул в C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\inc конкретно hd44780.c, hd44780.h Но не запускается ничего, выдает ошибки, что ему еще надо?

#include <ioavr.h>
#include <hd44780.h>
#include <intrinsics.h>
#include <delay.h>
#include <stdlib.h>
#include <iom16.h>

void lcd_puts(const char *s)
{
register char c;

while ( (c = *s++) )
{
HD44780_SEND_CHAR©;
}

}

int main(void)
{

hd44780_init();


HD44780_SEND_CURSOR_POS(0, 0);


lcd_puts("Counter");


return 0;
}
MrYuran
Цитата(Dele @ Apr 18 2012, 14:14) *
Так вот, файлы с архива засунул в C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\inc конкретно hd44780.c, hd44780.h Но не запускается ничего, выдает ошибки, что ему еще надо?

Надо было засунуть... (гусары, молчать! ©)
hd44780.c и hd44780.h надо просто включить в проект. И никуда не засовывать.

И уже учите матчасть, что такое библиотеки и чем они отличаются от исходников.
(то, что у вас - это, строго говоря, никакие не библиотеки)

Алсо, код на форуме принято оформлять в теги code или codebox, иначе читать неудобно.
Dele
Этот заголовочный файл sm.gif включил в проект, правой кнопкой мыши на проекте в дереве файлов ->Add files->hd44780.h
Стало меньше Warning но 2 Error так и остались...
Error[e46]: Undefined external "hd44780_send_command" referred in main
Error[e46]: Undefined external "hd44780_init" referred in main
Почему так?
Сергей Борщ
QUOTE (Dele @ Apr 19 2012, 13:10) *
Стало меньше Warning но 2 Error так и остались...
Потому что в проект надо включать не заголовочный файл *.h, а файлы с исходным кодом *.c
Dele
Включил, все так же. Видимо библиотека не устраивает конктретно этот компилятор.
Сергей Борщ
QUOTE (Dele @ Apr 20 2012, 13:43) *
Включил, все так же. Видимо библиотека не устраивает конктретно этот компилятор.
Это, простите, не в библиотеке дело. Вызов функций, определенных в другой единице компиляции делает любой компилятор языка Си. Прикладывайте архив с вашим проектом или такую же картинку как в начале, с деревом файлов проекта - что-то вы делаете или не делаете не так.
Dele
Так же поменял в заголовочном файле дисплея типы unit8_t на unsignet char, добавил некоторые заголовочные файлы типа delay.h и io.h из CVAVR так как их не хватало в IAR
_Артём_
Цитата(Dele @ Apr 22 2012, 00:45) *
Так же поменял в заголовочном файле дисплея типы unit8_t на unsignet char, добавил некоторые заголовочные файлы типа delay.h и io.h из CVAVR так как их не хватало в IAR


1.У вас в проекте пути никак на прописаны (типа так:$PROJ_DIR$\hd44780\). Либо можно все расположить в одной директории.
Функции init и send возможно не определены.
2. Надо не
Код
include <hd44780.h>

а так:
Код
include "hd44780.h"

3. H-файлы в проект включать не нужно.
ReAl
Цитата(_Артём_ @ Apr 22 2012, 02:59) *
2. Надо не
Код
include <hd44780.h>
а так:
Код
include "hd44780.h"
Должно быть в некотором смысле всё равно.
Файлы в угловых скобках компилятор начинает искать в «системных» каталогах (что с собой несёт), потом переходит к «пользовательским», указанным в командной строке/опциях среды. А в кавычках — наоборот, начинает искать в пользовательских, потом ищет в «системных». Поэтому если указывать "ioavr.h" и <my_super_lib.h>, то это должно привести только к увеличению времени поиска файла и всё.
Указывать файлы внешних по отношению к проекту библиотек (даже если они свои собственные) в угловых скобках смысл есть — так виднее, что они не часть этого проекта, а взяты извне.
Сергей Борщ
Посмотрел на ваш архив. Причина в том, что кто-то закомментировал все содержимое hd44780.c:
CODE
/*    <-------
#include "hd44780.h"

  ......
    // Входим в режим работы и устанавливем направление курсора и сдвиг экрана.
    HD44780_SEND_ENTRY_MODE(HD44780_CONFIG_CURSOR_DIRECTION, HD44780_CONFIG_CURSOR_LCD_SHIFT);

}

*/   <-------------

QUOTE (Dele @ Apr 22 2012, 00:45) *
Так же поменял в заголовочном файле дисплея типы unit8_t на unsignet char,
Глупость. Добавили ненужной писаниниы и ухудшили портируемость.
QUOTE (Dele @ Apr 22 2012, 00:45) *
добавил некоторые заголовочные файлы типа delay.h и io.h из CVAVR так как их не хватало в IAR
Может быть их не зря не хватало? ИАР может не переварить системные заголовочные файлы от CVAVR. Просто потому, что в них могут использоваться какие-то нестандартные расширения компилятора (не говоря уже о том, что CVAVR является компилятором не С, а "языка, похожего на С"). Для задержек в IAR AVR есть встроенная (intrinsic) функция __delay_cycles().
Dele
Так же все, закинул файлы в общую папку, подключил. Раскоментировал hd44780.c вылезло куча ошибок, как то порты видимо не правильно названы...
Dele
Цитата(Сергей Борщ @ Apr 23 2012, 09:12) *
Посмотрел на ваш архив. Причина в том, что кто-то закомментировал все содержимое hd44780.c:
Код
/*    <-------
#include "hd44780.h"

  ......
    // Входим в режим работы и устанавливем направление курсора и сдвиг экрана.
    HD44780_SEND_ENTRY_MODE(HD44780_CONFIG_CURSOR_DIRECTION, HD44780_CONFIG_CURSOR_LCD_SHIFT);

}

*/   <-------------

Глупость. Добавили ненужной писаниниы и ухудшили портируемость.
Может быть их не зря не хватало? ИАР может не переварить системные заголовочные файлы от CVAVR. Просто потому, что в них могут использоваться какие-то нестандартные расширения компилятора (не говоря уже о том, что CVAVR является компилятором не С, а "языка, похожего на С"). Для задержек в IAR AVR есть встроенная (intrinsic) функция __delay_cycles().


unit8_t на unsignet char Поменял потому что IAR вообще не знал что такое unit8_t. Файлы с CVAVR вроде как нормально переварил, не ругался особо, когда закоментировал .с файл, сейчас уже другая проблема, порты как то не так называются судя по всему...
Сергей Борщ
QUOTE (Dele @ Apr 23 2012, 11:44) *
unit8_t на unsignet char Поменял потому что IAR вообще не знал что такое unit8_t.
Знал, как и любой компилятор, поддерживающий стандарт С99. Вероятно автор этих примеров забыл добавить в начало заголовочного файла #include <stdint.h>. Или он добавил, а вы в настройках проекта выбрали использование библиотеки CLIB, а это в IAR такой способ указать поддержку стандарта C89 (в котором такого заголовочного файла еще не было). Чтобы работать в стандарте C99 надо выбрать библиотеку DLIB.
QUOTE (Dele @ Apr 23 2012, 11:44) *
сейчас уже другая проблема, порты как то не так называются судя по всему...
Вероятно в CVAVR есть дополнительные #define для номеров битов, вроде #define PD0 0. Но какой смысл сначала HD44780_CONFIG_D0_PIN превращать из 0 в PD0 при помощи HD44780_PORT_DATA_PIN(HD44780_CONFIG_D0_PIN), а потом обратно в 0 при помощи #define PD0 0? Достаточно было написать
CODE
    /*if(d & (1 << 0)) { c |= (1 << HD44780_PORT_DATA_PIN(HD44780_CONFIG_D0_PIN)); }*/
    if(d & (1 << 0)) { c |= 1 << HD44780_CONFIG_D0_PIN; }

В общем как-то уж очень мутно написана эта библиотека.
Dele
Да, походу библиотека непонятная какая то, я вот сейчас скачал на msp430 и сразу без проблем запустил в IAR, буду на msp430 эксперементировать...
_Артём_
Цитата(ReAl @ Apr 22 2012, 18:13) *
Должно быть в некотором смысле всё равно.
Файлы в угловых скобках компилятор начинает искать в «системных» каталогах (что с собой несёт), потом переходит к «пользовательским», указанным в командной строке/опциях среды. А в кавычках — наоборот, начинает искать в пользовательских, потом ищет в «системных». Поэтому если указывать "ioavr.h" и <my_super_lib.h>, то это должно привести только к увеличению времени поиска файла и всё.

Не только увеличение времени. Нужно ещё дополнительно пути прописывать:
создал проект из файлов main.cpp, func.cpp.
В main вызывается функция func, описанная в func.h (все три файла в одной папке).
Если написано #include "func.h" - компилируется, если #include <func.h>:
Цитата
Fatal Error[Pe1696]: cannot open source file "func.h"
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\inc\"
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\inc\dlib\c\"
searched: "C:\Program Files\IAR Systems\Embedded Workbench 6.0\avr\inc\dlib\ecpp\"


В настройках проекта нужно указывать $PROJ_DIR$\. Ещё одно действие.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.