|
WinAVR2007 & AVR Studio 4.13, возможно глупый вопрос, но очень важный |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 28)
|
Jan 18 2008, 07:47
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704

|
Цитата(smk @ Jan 18 2008, 02:29)  Конечно понимаю, что это элементарно и вообще... но всетаки как прикрепить к проекту внешний файл? имеется ввиду, что если функция описана в одном файле (пусть "dva.с") , а упоминается в основном файле проекта (пусть "odin.c"), то как и что сделать чтоб не было "undefined reference to"??? В С новичок, сильно не бейте, плз. Буду очень признателен за науку!!! Заранее спасибо! 1) Имена функции в вызове и реализации совпадают? Упомянутые файлы в одной директории? 2)По хорошему делать надо так. Реализация функции в файле "dva.с", ее прототип в файле "dva.h", а в файле "odin.c" есть строка: Код #include"dva.h" После всего этого можно вызывать функцию.
|
|
|
|
|
Jan 18 2008, 07:56
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Имена функции в вызове и реализации совпадают? да. Цитата Упомянутые файлы в одной директроии? в разных. продублировал так чтоб были в одной - не помоглло.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 18 2008, 09:10
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 18 2008, 09:56)  продублировал так чтоб были в одной - не помоглло. Не принципиально. Давайте попробуем так: Копируете свой проект в новую папку. Удаляете все исходники кроме main.c, global.h, lcdconf.h, lcd.h, lcd.c. В main оставляете только Код void main() { lcdInit(); } в lcd.c оставляете Код void lcdInit() { } в lcd.h только Код extern void lcdInit(); Компилируете, если снова не собирается - вместе с файлами проекта (.aps, .aws) в .zip и сюда.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 18 2008, 11:56
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Как-то странно. программа еще не написана (всего одна функция) а кода на 4k с ключом оптимизации -Оs. Что делать? Цитата Попробуйте повторить фокус, удаляя лишнее постепенно хм. попробую.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 18 2008, 12:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 18 2008, 13:56)  Как-то странно. программа еще не написана (всего одна функция) а кода на 4k с ключом оптимизации -Оs. Что делать? Паковать в .zip и выкладывать. Весь scmRTOS с примером приложения в варианте от ReAl компилится в 1К кода. А, есть мысль: в ключи компилятора добавьте -ffunction-sections -fdata-sections, а в ключи линкера - -Wl,--gc-sections -Wl,--relax Если поможет, то описание тут.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 18 2008, 20:46
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Теперь осталось в вашем скрипте сделать KEEP() для сегмента, в котором располагаются вектора. почти совсем непонятно. возник другой вопрос. вот код: #include <avr/io.h> int main(void) { lcdInit(); lcdGotoXY(2, 0); lcdPrintData("Hello World!", 12); lcdGotoXY(2, 1); lcdPrintData("Hello World!", 12); } после программирования девайсом от PROTTOSSa сразу начинает работать правильно. стоит выключить и включить питание - пишет только верхнюю строчку. Что за чудеса? причем верхняя строчка к подсвечена как при включении LCD без конроллера, только питание и цепи контрасности.
Сообщение отредактировал smk - Jan 18 2008, 20:49
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 18 2008, 22:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 18 2008, 22:46)  почти совсем непонятно. Это относилось к самописным скриптам. В скриптах из комплекта WinAVR это все уже сделано Цитата(smk @ Jan 18 2008, 22:46)  возник другой вопрос.
вот код: .... Что за чудеса? Это уже, похоже, не имеет отношения к компилятору. У вас не проходит инициализация дисплея. Судя по симптомам, не выдерживаете паузу от подачи питания до первой команды. Вставьте задержку миллисекунд 50-200 перед инициализацией.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 19 2008, 02:26
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Судя по симптомам, не выдерживаете паузу от подачи питания до первой команды. Да. есть такое. А как можно посмотреть какие функции включены в программу? 1,7к многовато (я думаю) )для кода: #include <avr/io.h> #include <util/delay.h> int main(void) { _delay_ms(200); lcdInit(); while(1) { lcdGotoXY(2, 0); lcdPrintData("Hello World!", 12); lcdGotoXY(2, 1); lcdPrintData("Hello World!", 12); } } Или нормально? оптимизация -Os.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 19 2008, 10:07
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 19 2008, 04:26)  А как можно посмотреть какие функции включены в программу? 1,7к многовато (я думаю) )для кода: Ну, приведенного кода тут байтов на 50, а вот внутри этих функций может быть сколько угодно. Посмотреть, какие функции включены, можно, поставив галочки генерации листинга и .map-файла. А потом долго медитировать над этими файлами.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 21 2008, 22:09
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Посмотреть, какие функции включены, можно, поставив галочки генерации листинга и .map-файла. Поставил, посмотрел. Хочу знать мнение того кто смотрит на них не первый раз. Прикрепляю.
default.rar ( 7.21 килобайт )
Кол-во скачиваний: 91Далее. Цитата Судя по симптомам, не выдерживаете паузу от подачи питания до первой команды. Вставьте задержку миллисекунд 50-200 перед инициализацией. Добавил задержку. ничего не изменилось. Менял опции оптимизации - нет результата. Но причина определена верно. Если физически (RESETом) сбросить конроллер при включенном LCD - все становится на свои места, программа нормально отображает обе строки. А по сему, как ввести эту задержку? Что только не делал... от delay_ms до for(i=1600;i>0;i--). Ничего не помогает. Ну точно оптимизиорует, ка как наверняка узнать? И что делать?
Сообщение отредактировал smk - Jan 21 2008, 22:14
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 22 2008, 08:23
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 22 2008, 01:34)  4-х битном. Глянул исходник - там совершенно неправильно сделана инициализация. Ошибок там минимум три - 1) После первых двух команд читать busy flag бессмысленно, надо делать задержки. Если память не изменяет - 200 и 50 мс. 2)LCD_FUNCTION_DEFAULT должен писаться четыре раза. 3)LCD_FUNCTION_DEFAULT первые 3 раза должен писаться в один проход независимо от режима - 8 или 4 битного, а не двумя тетрадами как в вашей реализации. Поищите здесь по форуму, тема обсасывалась множество раз. В обсуждениях выкладывали даташит на контроллер, в котором описан алгоритм инициализации. Несколько исходников было в форуме по AVR в ветке "исходники программ и библиотек". .map гляну чуть позже.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 22 2008, 09:22
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Глянул исходник - там совершенно неправильно сделана инициализация. Ошибок там минимум три - 1) После первых двух команд читать busy flag бессмысленно, надо делать задержки. Если память не изменяет - 200 и 50 мс. 2)LCD_FUNCTION_DEFAULT должен писаться четыре раза. 3)LCD_FUNCTION_DEFAULT первые 3 раза должен писаться в один проход независимо от режима - 8 или 4 битного, а не двумя тетрадами как в вашей реализации. Исправил. Все заработало. Даже не понадобилось делать задержку в начале программы. Огромное спасибо за подсказки и помощь! Теперь, если можно, еще одна проблема у меня появилась. Ставил AVR Studio 4.13 на комп, кге уже установлен WinAVR2007. При инсталляции обнаружилась вот такая ощибка: Error 1723: There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. Система: Win2000 5.00.2195 SP4; 2 x PIII 1266 MHz AT/AT Кто-нибудь знает какие пути устранения проблемы есть? Очень нужно иметь два рабочих места, так чтоб проект, начатый на одном компе можно было продолжать писать и симулировать на другом и т.п. Очень надо! Заранее благодарен!
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 23 2008, 22:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 23 2008, 21:56)  Оч хочется довести до ума ситуацию. Ой. Извиняюсь. Давайте смотреть .map вместе: Код .text 0x00000000 0x6a2 <- Итого во флеш попадает 1698 байт. .vectors 0x00000000 0x26<- Вектора. Ненаказуемо. Заняты все. .progmem.data 0x00000026 0x88 lcd.o <- 136 байт констант. Судя по следующей строке - знакогенератор 0x00000026 LcdCustomChar .text.main 0x000000e6 0x40 123.o <- собственно main(), 64 байта -------- дальше идут функции дисплея, которые вызываются из main или прерываний ------- .text.lcdInitHW 0x00000126 0x1a lcd.o .text.lcdBusyWait 0x00000140 0x5c lcd.o .text.lcdControlWrite 0x0000019c 0x64 lcd.o .text.lcdControlRead 0x00000200 0x4e lcd.o .text.lcdDataWrite 0x0000024e 0x64 lcd.o .text.lcdGotoXY 0x000002b2 0x1a lcd.o .text.lcdLoadCustomChar 0x000002cc 0x52 lcd.o .text.lcdPrintData 0x0000031e 0x2a lcd.o .text.lcdInit 0x00000348 0x6e lcd.o ---------------------- итого 656 байт ----------------- а дальше ваши прерывания для таймера - 5 раз по 0x5A байт (450 байт) .text.__vector_8 0x0000045e 0x5a timer.o .text.__vector_6 0x00000538 0x5a timer.o .text.__vector_7 0x00000592 0x5a timer.o .text.__vector_5 0x000005ec 0x5a timer.o .text.__vector_3 0x00000646 0x5a timer.o и пара по 166 + 128 байт .text.__vector_9 0x000003b8 0xa6 timer.o .text.__vector_4 0x000004b8 0x80 timer.o Мелкие секции я опустил. По имени секции в первой колонке вы можете узнать имя функции, по адресам из второй колонки можно в листинге найти получившийся код. Зря вы решили читать флаг BUSY. Без него код получается значительно меньше.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 23 2008, 22:25
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата По имени секции в первой колонке вы можете узнать имя функции, по адресам из второй колонки можно в листинге найти получившийся код. Спасибо! А вывод всеж какой делаем? Все хорошо или что-то не так? Я вот чуток дописал код. вывожу на LCD немножко текста и цифирки (счетчик цикла) так код стал 5к. Не верю что это нормально. Цитата Зря вы решили читать флаг BUSY. Это не я. Это AVRlib.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 24 2008, 10:27
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 24 2008, 00:25)  Спасибо! А вывод всеж какой делаем? Все хорошо или что-то не так? Ну раз работает - значит хорошо. Вы находитесь на стадии, когда использование чужих библиотек ускоряет процесс разработки. Когда вы упретесь в нехватку памяти или скорости - перейдете на следующий уровень, когда библиотеки пишутся под себя с минимумом универсальности и максимумом эффективности. Цитата(smk @ Jan 24 2008, 00:25)  Я вот чуток дописал код. вывожу на LCD немножко текста и цифирки (счетчик цикла) так код стал 5к. Не верю что это нормально. Ну тогда берите исходник библиотеки и выкидывайте из него все лишнее. Я, например, так и не понял зачем у вас в прерываниях таймера вызов функций по указателю. Вы собираетесь подменять обработчики "на лету"? Все обработчики? Цитата(smk @ Jan 24 2008, 00:25)  Это не я. Это AVRlib. А голова у кого?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 24 2008, 10:46
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата А голова у кого? Согласен. Цитата Вы находитесь на стадии, когда использование чужих библиотек ускоряет процесс разработки. Когда вы упретесь в нехватку памяти или скорости - перейдете на следующий уровень, когда библиотеки пишутся под себя с минимумом универсальности и максимумом эффективности. К этому и стремлюсь. Для этого стараюсь разобраться как пишут другие, научится писать в WinAVR без ошибок в синтаксисе, понять как устроен проект, какие опции существуют... вот где почитать про сообщения об ошибках на русском?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 24 2008, 11:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Jan 24 2008, 12:46)  понять как устроен проект, какие опции существуют... WinAVR\DOC\gcc, WinAVR\DOC\binutils\ld.html\index.html#Top, WinAVR\DOC\avr-libc\avr-libc-user-manual\index.html, WinAVR\DOC\avr-libc\avr-libc-user-manual\FAQ.html Цитата(smk @ Jan 24 2008, 12:46)  вот где почитать про сообщения об ошибках на русском? http://translate.google.com/translate_t?langpair=en|ru?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|