Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega128
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
mjpronin
Всем доброе время суток.

Работаю с Atmega128 использую UART1 (т.е. второй из двух) использую putchar() & getchar() для UART1 (т.е. работаю с UDR1) без проблем.

Подскажите как работать с printf() через UART1, так как с UART1 эта функция не работает, а она очень удобна.

На других Atmega** с одним UART printf() работает.


1. Каким образом переопределить printf для работы с UART1
2. Будет ли printf работать с UART0
3. Не приведет ли использование UART0 на ATmega128 к проблемам, т.к. эти ноги у ATmega128 совпадают с ногами последовательного программирования. PDI PDO

Спасибо.
_Pasha
Какая странная проблема. Особенно, когда совершенно неизвестен компилятор, ее породивший lol.gif
Genadi Zawidowski
Я включал между выходом max3232 и входом RXD ATMega128L резистор на 1 килоом - и никаких проблем.
mjpronin
Цитата(_Pasha @ Feb 13 2010, 18:24) *
Какая странная проблема. Особенно, когда совершенно неизвестен компилятор, ее породивший lol.gif


CVAVR
printf - функция ясыка С, мне думается, что в независимости от компилятора printf это printf.


Цитата(Genadi Zawidowski @ Feb 13 2010, 22:15) *
Я включал между выходом max3232 и входом RXD ATMega128L резистор на 1 килоом - и никаких проблем.

Не могли ли Вы немного пояснить.
1. Между выходом max232 и входом RXD0 или RXD1.
2. 1кОм с какой целью? Как ограничивающий? Через что Вы шили, через ISP, т.е. PDI = RXD0 = PE0; (для ATmega128)
_Pasha
Цитата(mjpronin @ Feb 14 2010, 08:36) *
CVAVR
printf - функция ясыка С, мне думается, что в независимости от компилятора printf это printf.

Функция-то она портабельная, а вот каким образом переопределить поток вывода, какую функцию put_char() и в каком формате надо написать, и надо ли писать ее вообще - зависит от конкретного компилятора. К сожалению, с CV не работаю и помочь Вам не могу. Но даже мне понятно, что требуется нечто большее, чем расставление галочек в визарде.
Dog Pawlowa
Никогда не работал с CV, но другой причины, кроме невключенность stdio.h, в голову не приходит.
mjpronin
Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?
Разумеется Stdio.h подключен (иначе была бы ошибка и проет бы не компелился), я подозреваю, что все дело только в том, что printf определен только для работы с UART0.


3. Не приведет ли использование UART0 на ATmega128 к проблемам, т.к. эти ноги у ATmega128 совпадают с ногами последовательного программирования. PDI PDO
Dog Pawlowa
Цитата(mjpronin @ Feb 14 2010, 09:48) *
Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?

Я предполагаю, что в любом компиляторе printf использует putchar, который Вы написали. Если putchar работает с UART1 при самостоятельном вызове, и не работает при вызове printf, то возможны варианты
1) printf использует какой-то другой putchar, мертвый (уж не знаю как, сами думайте, возможно ли это)
2) putchar написан так, что при отправке больше одного символа не работает(например, нет проверки готовности передатчика).
Если Вы озабочены совмещением функций выводов, то появляется сомнение в том, что Ваш putchar вообще корректно работает.
Отправьте с помощью Вашего putchar строку и убедитесь, что он работает, а потом уже решайте проблему printf.
Успехов wink.gif
ReAl
Цитата(mjpronin @ Feb 14 2010, 06:36) *
CVAVR
printf - функция ясыка С, мне думается, что в независимости от компилятора printf это printf.
printf - фунция стандартной библиотеки языка С и зависит от её (библиотеки) реализации.
Переходите на avr-gcc + sprintf/fprintf/vfprintf и получите возможность работать из *printf одновемённо на два UART-а и ещё куда-нибудь.
http://electronix.ru/forum/index.php?showt...mp;#entry714984
и ещё где-то было, темы прикручивания printf регулярно возникают.
Savrik
Вот цитата их хелпа CAVR:
Цитата
For devices with 2 UARTs, respectively 2 USARTs, there will be two tabs present: UART0 and UART1, respectively USART0 and USART1.
The functions of configuration check and list boxes will be the same as described above.


The UART0 (USART0) will use the normal putchar and getchar functions.
In case of interrupt driven buffered communication, UART0 (USART0) will use the following variables:
rx_buffer0, rx_wr_index0, rx_rd_index0, rx_counter0, rx_buffer_overflow0,
tx_buffer0, tx_wr_index0, tx_rd_index0, tx_counter0.


The UART1 (USART1) will use the putchar1 and getchar1 functions.
In case of interrupt driven buffered communication, UART1 (USART1) will use the following variables:
rx_buffer1, rx_wr_index1, rx_rd_index1, rx_counter1, rx_buffer_overflow1,
tx_buffer1, tx_wr_index1, tx_rd_index1, tx_counter1.

Цитата
If you intend to use other peripherals for Input/Output, you must modify accordingly the getchar and putchar functions like in the example below:
/* inform the compiler that an alternate version
of the putchar function will be used */
#define _ALTERNATE_PUTCHAR_


/* now define the new putchar function */
void putchar(char c) {
/* write your code here */

}

Цитата
For the ATxmega chips the getchar and putchar functions use by default the USARTC0.
If you wish to use another USART, you must define the _ATXMEGA_USART_ preprocessor macro prior to #include the stdio.h header file, like in the example below:


/* use the ATxmega128A1 USARTD0 for getchar and putchar functions */
#define _ATXMEGA_USART_ USARTD0


/* use the Standard C I/O functions */
#include <stdio.h>


The _ATXMEGA_USART_ macro needs to be defined only once in the whole program, as the compiler will treat it like it is globally defined

Цитата
void printf(char flash *fmtstr [ , arg1, arg2, ...])


outputs formatted text, using putchar, according to the format specifiers in the fmtstr string.


Дальше либо шаманство с перегрузкой, либо просто добавить в своей putchar() проверку, куда отправляются данные, и вызывать соответствующую функция. Сделать можно, к примеру, установкой глобальной переменной uart_number.
mjpronin
smile3046.gif
Код
#define _ALTERNATE_PUTCHAR_

Вот за эту строчку респект и уважуха.

Я все делал именно так, но у меня не было
Код
#define _ALTERNATE_PUTCHAR_
из за этого компилатор ругался на редифинишн, я начинал изменять имя функции из-за этого и printf и не работал.


Спасибчик!
sergeeff
Цитата(Dog Pawlowa @ Feb 14 2010, 13:06) *
Я предполагаю, что в любом компиляторе printf использует putchar, который Вы написали.


printf - это невстроенная конструкция компилятора, а обычная С функция. Посему и предполагать тут нечего. Как говорил один майор на военной кафедре "Надо не думать, а знать!"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.