Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобратся с ICC AVR 7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Pyku_He_oTTyda
Осваиваю Си по примерам с [banned], пока работал на шестой версии ICC, все было хорошо.
Вчера поставил седьмую версию, и она стала ругатся на этот фрагмент:

putchar('R');
putchar('x');

говорит: !ERROR file 'work03.0':undefined symbol '_putchar'

как эта процедура прописывается в седьмой версии? Тыкните носом!

На всякий случай прикладываю текст программы
haker_fox
Цитата(Pyku_He_oTTyda @ Dec 22 2005, 13:51) *
Осваиваю Си по примерам с [banned], пока работал на шестой версии ICC, все было хорошо.
Вчера поставил седьмую версию, и она стала ругатся на этот фрагмент:

putchar('R');
putchar('x');

говорит: !ERROR file 'work03.0':undefined symbol '_putchar'

как эта процедура прописывается в седьмой версии? Тыкните носом!

На всякий случай прикладываю текст программы


Гм... если мне не изменяет память, то функция putchar() должна быть определена либо в stdio.h, либо в conio.h. По крайней мере в досовском компиляторе я один из этих модулей подключал.

Попробуйте написать так:
#include <stdio.h>
в начале файла, рядом с подключениями других хедеров...
Serega Doc
Простите за offtop

Но если это ваши первые пробы програмирования для атмел то рекомендовал бы вам сразу разбиратся с IAR
Он более функционален.
Сам проходил через ICC.
Программа компилировавшаяся на ICC в 80% кристала в IAR занимает 60 % без оптимизации а возможностей у IAR намного больше. Правда нет мастера настроек так ничто не мешает настройки в ICC а программу в IAR
Pyku_He_oTTyda
Serega Doc , я вас поддерживаю, но к сожалению 100 мегов выкачать я не могуsad.gif, так что начал с доступного
Pyku_He_oTTyda
Цитата
Попробуйте написать так:
#include <stdio.h>

не помогло
Serega Doc
А радио базара у вас в городе что нет? Болванка гривен 15 - 20 может стоить зато руки просто развязаны
Pyku_He_oTTyda
К сожалению... Возят в основном софт - системы, драйвера и т.д., ну и игры
_artem_
vot zdes tvoja problema :

http://www.dragonsgate.net/FAQ/cache/199.html
IgorKossak
Надо определить низкоуровневую функцию вывода _putchar() в конкретный поток\устройство.
С параметрами и возвращаемым значением не подскажу, надо уточнить в документации.
Pyku_He_oTTyda
Спасибо! буду разбиратся
defunct
Цитата(Pyku_He_oTTyda @ Dec 22 2005, 07:51) *
putchar('R');
putchar('x');

как эта процедура прописывается в седьмой версии? Тыкните носом!



что ее там прописывать-то?

void putchar(char ch)
{
UDR = ch;
}
defunct
Цитата(Serega Doc @ Dec 22 2005, 10:27) *
Простите за offtop

Но если это ваши первые пробы програмирования для атмел то рекомендовал бы вам сразу разбиратся с IAR
Он более функционален.
Сам проходил через ICC.
Программа компилировавшаяся на ICC в 80% кристала в IAR занимает 60 % без оптимизации а возможностей у IAR намного больше. Правда нет мастера настроек так ничто не мешает настройки в ICC а программу в IAR


imho спорный вопрос. Если уж начинать, то я бы выбрал ICC из-за наличия в нем такого незаменимого и удобного для новичков инструмента, как Application builder. По качеству кода конечно, ICC сравним разве что с E-LAB Pascal... IAR гораздо лучше, но все равно код сильно избыточен. Для чипов до 16k памяти программ, и если не требуется использование 32х битной математики и математики с плавающей точкой, то я бы рекомендовал использовать исключительно asm.

К примеру прошивка-драйвер сетевой карты NE2000 с реализацией TCP стека для AVR занимает на асме всего 1.8k. Аналог на C около 20k.
Old1
Цитата(defunct @ Dec 23 2005, 16:38) *
...imho спорный вопрос. Если уж начинать, то я бы выбрал ICC из-за наличия в нем такого незаменимого и удобного для новичков инструмента, как Application builder...

Вопрос действительно спорный, для новичка ИМХО все полезнее делать руками: "мат часть" при этом изучается более тщательно, опять же усваиваемость лучше, когда datasheet на девайс детально изучишь (и не один раз) и встроенную периферию сам сконфигурируешь, а не апликешн билдером на скорую руку сляпаешь. Время при этом конечно тратится много, но на собственное обучение его не стоит жалеть... Зато когда начнет как от зубов отскакивать, ради бога, но тогда, думаю в штуках типа Apl.Build. необходимость тем более отпадет... (excuse me за offtop).
_artem_
V tom linke kotorij priveden mnoju naverxu napisano (FAQ dlja ICC v& compilers):

How to use putchar() -- [AVR7]
This is currently applicable to ICC7 for AVR, but will eventually apply to all of our V7 compilers.

richard@imagecraft.com
Q: When I call printf, I get the following message:
!ERROR Function 'putchar' not defined.

A: This is a function that references the device's IO register locations and must be compiled specifically for the target device. You may find examples of this function for different devices under the <install root>\examples.AVR directory.


Q: But even when I write my own putchar and add it to my project file list, I still get the same error. Why?

A: Some device specific functions must be provided by users at project build time and cannot be put in the default libraries that we provide. putchar is one such function. From V7.03B onward, we have added a capability in the compiler/linker that if you decorate a function with the pragma

#pragma device_specific_function <function_name> ...

and if the function is needed but undefined, the linker will emit an error message of the above form. For putchar/getchar, this pragma is in the provided stdio.h file, and hence if you are writing your own putchar, you must have:

"#include <stdio.h>"

in your putchar source file.


Етот товариш хочет сказать что если вы написали свой вариант putchar() то в том файле где он ( putchar() )
содержится (исходник putchar() ) вам надо добавить #include <stdio.h> .
Laksus
_______________________________
defunct Дата Dec 23 2005, 14:13 Отправлено #12
...
что ее там прописывать-то?

void putchar(char ch)
{
UDR = ch;
}
_______________________________
Ну, может в "...\iccv7avr\examples.avr\putchar_basic.c" и чересчур наворочено
_____
int putchar(char c)
{
if (_textmode && c == '\n')
putchar('\r');
while ((USR & 0x20) == 0) // UDRE, data register empty
;
UDR = c;
return c;
}
_____
Но, по моему, проверить готовность регистра данных все таки необходимо.
То есть минимальный вариант наверное такой:
_______
void putchar(char c)
{
while ((USR & 0x20) == 0); // UDRE, data register empty
UDR = c;
}
_______
2005 12 25
Александр
Pyku_He_oTTyda
Что то у меня ничего не получаетсяsad.gif, а никто не помощет исправить исходник, который в первом сообщении лежит?
defunct
Цитата(Pyku_He_oTTyda @ Dec 26 2005, 07:44) *
Что то у меня ничего не получаетсяsad.gif, а никто не помощет исправить исходник, который в первом сообщении лежит?


начните с эхотерминала... в обработчике Rx прерывания, отправляем принятый байт обратно:

Код
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0,0%)
void uart0_init(void)
{
UCR  = 0x00; //disable while setting baud rate
UBRR = 0x17; //set baud rate
UCR  = 0x90; //enable
}

void putchar(char c)
{
  UDR = c;
}

#pragma interrupt_handler uart0_rx_isr:8
void uart0_rx_isr(void)
{
//uart has received a character in UDR
  putchar( UDR );
}
Laksus
_______________
Цитата
Что то у меня ничего не получаетсяsad.gif, а никто не помощет исправить исходник, который в первом сообщении лежит?
Laksus Дата Dec 25 2005, 21:26

_______________
Во первых вот Нажмите для просмотра прикрепленного файла проверенный, т.е. работающий, (AT90S2313, 4.0MHz) исходник,
с оставленными правками.

Во вторых:
Мой предыдущий совет был непроверен. Основывался на примерах ICC.
Но, когда попробовал на макетке, обнаружилось следующее:
-Когда отправлял 2 символа, то проблем нет как с вариантом
{
UDR=c;
}
так и с вариантом
{
while((USR&0x20)==0);
UDR=c;

}

Но, когда вместо двух символов захотел отправить серию из 12 символов:

putchar('R');
putchar('x');
putchar('0');

putchar('1');
putchar('2');
putchar('3');

putchar('4');
putchar('5');
putchar('6');

putchar('7');
putchar('8');
putchar('9');
то в терминале (http://bray.velenje.cx/avr/terminal,9600 baud)
принималось: ...R9R9R9R9R9... . Причем как без while(), так и с while().


Наверное компилятор оптимизировал функцию и while выбросил,
так как она пустая .
Как правильно решить это я не знаю, но по "колхозному" сделал так:

volatile unsigned char temp1;
void putchar(char c)
{
while ((USR & 0x20) == 0)
{
temp1++;
}
; // UDRE, data register empty
UDR = c;
}

После этого в терминале появилось: ...Rx0123456789Rx...,
что и хотелось.
2005 12 27
Александр

PS После того, как написал это, еще немного поигрался со схемкой.
И обнаружил, что в опциях компилятора стояло
"Не использовать регистры R20...R23".
После того, как убрал галочку, получилось нормально и без volatile...temp1.
Хотя это не должно бы влиять.
Но после обратной установки галочки компилирует все равно правильно без
volatile...temp1. В чем была проблема я так и не понял, какие то глюки.
А без
while((USR&0x20)==0);
в терминале, по прежнему, принимаю только первый и последний символы группы.
Pyku_He_oTTyda
Спасибо! Вечером буду пробовать разбиратся.
Pyku_He_oTTyda
Спасибо Laksus, ваш пример заработал у меня.
Теперь на основании его буду разбиратся со своим, как говорится, где собака порылась.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.