Перейти к содержанию
    

ATmega128

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

 

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

 

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

 

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

 

 

1. Каким образом переопределить printf для работы с UART1

2. Будет ли printf работать с UART0

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

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая странная проблема. Особенно, когда совершенно неизвестен компилятор, ее породивший :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я включал между выходом max3232 и входом RXD ATMega128L резистор на 1 килоом - и никаких проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая странная проблема. Особенно, когда совершенно неизвестен компилятор, ее породивший :lol:

 

CVAVR

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

 

 

Я включал между выходом max3232 и входом RXD ATMega128L резистор на 1 килоом - и никаких проблем.

Не могли ли Вы немного пояснить.

1. Между выходом max232 и входом RXD0 или RXD1.

2. 1кОм с какой целью? Как ограничивающий? Через что Вы шили, через ISP, т.е. PDI = RXD0 = PE0; (для ATmega128)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CVAVR

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

Функция-то она портабельная, а вот каким образом переопределить поток вывода, какую функцию put_char() и в каком формате надо написать, и надо ли писать ее вообще - зависит от конкретного компилятора. К сожалению, с CV не работаю и помочь Вам не могу. Но даже мне понятно, что требуется нечто большее, чем расставление галочек в визарде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть тогда кто-нибудь подскажет каким образом данная проблема может быть решена в другом компиляторе?

Я предполагаю, что в любом компиляторе printf использует putchar, который Вы написали. Если putchar работает с UART1 при самостоятельном вызове, и не работает при вызове printf, то возможны варианты

1) printf использует какой-то другой putchar, мертвый (уж не знаю как, сами думайте, возможно ли это)

2) putchar написан так, что при отправке больше одного символа не работает(например, нет проверки готовности передатчика).

Если Вы озабочены совмещением функций выводов, то появляется сомнение в том, что Ваш putchar вообще корректно работает.

Отправьте с помощью Вашего putchar строку и убедитесь, что он работает, а потом уже решайте проблему printf.

Успехов ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CVAVR

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

printf - фунция стандартной библиотеки языка С и зависит от её (библиотеки) реализации.

Переходите на avr-gcc + sprintf/fprintf/vfprintf и получите возможность работать из *printf одновемённо на два UART-а и ещё куда-нибудь.

http://electronix.ru/forum/index.php?showt...mp;#entry714984

и ещё где-то было, темы прикручивания printf регулярно возникают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:smile3046:

#define _ALTERNATE_PUTCHAR_

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

 

Я все делал именно так, но у меня не было

#define _ALTERNATE_PUTCHAR_

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

 

 

Спасибчик!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я предполагаю, что в любом компиляторе printf использует putchar, который Вы написали.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...