реклама на сайте
подробности

 
 
> Работа printf(), Помогите кто чем сможет
fmdost
сообщение Sep 21 2007, 21:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток Уважаемые.
Подскажите как настроить printf() IAR в меге64? Не понял как задавать номер порта, и надо ли разрешать TXCIEx UDRIE?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Sep 21 2007, 22:02
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Достаточно написать свой putchar() совместимый с прототипом:
int putchar(int ch)
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 21 2007, 23:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Sep 22 2007, 02:02) *
Достаточно написать свой putchar() совместимый с прототипом:
int putchar(int ch)

То-же самое написано в мануале. В С Я новичок. Обьясните пожалуйста чайнику про этот прототип?
Почему есть возвращаемое значение? И почему putchar(int ?) а не char?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 21 2007, 23:19
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Т.Достоевский @ Sep 22 2007, 02:01) *
а не char?

Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h, его вызывает функция printf при печати символов. (по крайней мере в IAR'е так).
Цитата
Почему есть возвращаемое значение?

чтобы возвращать код ошибки. putchar предназначен для вывода символов в любое последовательное устройсво вывода, например в файл. Как пример кода ошибки может быть - нет доступа/устройство не готово и т.п., но этим можно пренебречь.

простейший вариант putchar для отправки символов по UART'у может быть таким:

Код
int putchar(int ch)
{
    while( !(UCSRA & (1 << UDRE) ) );
    UDR = ch;
    return 0;
}
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 21 2007, 23:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(defunct @ Sep 22 2007, 03:19) *
Для AVR было бы лучше char, но низя, т.к. по стандарту int, и прототип этот уже объявлен в stdio.h,

int для совместимости, понял. Функцию так и сделал.
Вопрос по С. Можно ли реализовать:
Код
putchar(char) //типа собирает ф буффер а потом передаёт через прерывание UDRE
{
if (a<large_buffer)
  {
    buffer[a++]=char;
    if ( ! (USCRB & UDRIE0))
    {
       USCRB |= UDRIE0;//разрешить прерывание
       b=0;//для работы как указатель в прерывании по UDRE (если сравняется с а то ждать окончания по TXC
     }
    return 0;

  }
else
return -1;
}

чтоб максимально быстро собрал, и уже потом аппаратно передавал. Или есть более правильное решение?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 22 2007, 00:04
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Т.Достоевский @ Sep 22 2007, 02:47) *
чтоб максимально быстро собрал, и уже потом аппаратно передавал.

Конечно, так и надо делать.

Цитата
Или есть более правильное решение?

разве что с технической стороны организации буфера - есть кольцевой буфер, и он больше подходит для этой задачи. А идеологически - вполне нормальное решение у вас.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 06:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016