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

 
 
 
Reply to this topicStart new topic
> ATmega128, printf()
mjpronin
сообщение Feb 13 2010, 14:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



Всем доброе время суток.

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

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

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


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

Спасибо.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 13 2010, 15:24
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Какая странная проблема. Особенно, когда совершенно неизвестен компилятор, ее породивший lol.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Feb 13 2010, 19:15
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я включал между выходом max3232 и входом RXD ATMega128L резистор на 1 килоом - и никаких проблем.
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Feb 14 2010, 04:36
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



Цитата(_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)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 14 2010, 06:20
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(mjpronin @ Feb 14 2010, 08:36) *
CVAVR
printf - функция ясыка С, мне думается, что в независимости от компилятора printf это printf.

Функция-то она портабельная, а вот каким образом переопределить поток вывода, какую функцию put_char() и в каком формате надо написать, и надо ли писать ее вообще - зависит от конкретного компилятора. К сожалению, с CV не работаю и помочь Вам не могу. Но даже мне понятно, что требуется нечто большее, чем расставление галочек в визарде.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 14 2010, 06:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Никогда не работал с CV, но другой причины, кроме невключенность stdio.h, в голову не приходит.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Feb 14 2010, 06:48
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?
Разумеется Stdio.h подключен (иначе была бы ошибка и проет бы не компелился), я подозреваю, что все дело только в том, что printf определен только для работы с UART0.


3. Не приведет ли использование UART0 на ATmega128 к проблемам, т.к. эти ноги у ATmega128 совпадают с ногами последовательного программирования. PDI PDO
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 14 2010, 09:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(mjpronin @ Feb 14 2010, 09:48) *
Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?

Я предполагаю, что в любом компиляторе printf использует putchar, который Вы написали. Если putchar работает с UART1 при самостоятельном вызове, и не работает при вызове printf, то возможны варианты
1) printf использует какой-то другой putchar, мертвый (уж не знаю как, сами думайте, возможно ли это)
2) putchar написан так, что при отправке больше одного символа не работает(например, нет проверки готовности передатчика).
Если Вы озабочены совмещением функций выводов, то появляется сомнение в том, что Ваш putchar вообще корректно работает.
Отправьте с помощью Вашего putchar строку и убедитесь, что он работает, а потом уже решайте проблему printf.
Успехов wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 14 2010, 09:45
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 регулярно возникают.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Savrik
сообщение Feb 14 2010, 11:30
Сообщение #10


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Вот цитата их хелпа 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.

Сообщение отредактировал Savrik - Feb 14 2010, 11:36
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Feb 14 2010, 12:14
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



smile3046.gif
Код
#define _ALTERNATE_PUTCHAR_

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

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


Спасибчик!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 14 2010, 12:22
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


printf - это невстроенная конструкция компилятора, а обычная С функция. Посему и предполагать тут нечего. Как говорил один майор на военной кафедре "Надо не думать, а знать!"
Go to the top of the page
 
+Quote Post

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

 


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


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