Во-первых, включить в свою программу отдельную функцию putchar:
int putchar(int c)
{
while ((USR & (1 << UDRE)) == 0);
UDR = c;
return c;
}
Стандартный putchar в библиотеке скомпилирован под несуществующий 8414.
Для доступа к именованным названиям битов регистров следует взять правильный .h-файл из io_def.zip.
Эту функцию следует включать только при компиляции под target=release, иначе под отладчиком может отказаться работать окно Terminal I/O.
Во-вторых, следует проверить процедуру установки скорости обмена последовательного порта.
В-третьих, надо правильно выбрать вариант функции printf. Подробности - смотри AT90S C Compiler Programming Help, Configuration, Input and output.
Стандартная функция printf требует для своей работы минимум 134 байта ОЗУ в стеке. Это страшное расточительство, поэтому есть сокращенные версии printf, которые обладают значительно меньшими возможностями форматирования (в частности, не поддерживают задание поля ширины вывода), но зато не требуют для работы так много ОЗУ. Я бы порекомендовал использовать C:IAREW22DEMOA90ETCintwri.c с небольшими исправлениями - заменить
static const char hex[] = "0123456789ABCDEF";
на
static flash char hex[] = "0123456789ABCDEF";
и перейти от printf к printf_P заменой:
int printf (const char *format, ...)
на
int printf_P (const char flash *format, ...)
Кроме того, я бы рекомендовал вообще отказаться от printf и перейти к printf_P.