|
AT90CAN128, Проблема с USART |
|
|
|
Sep 1 2007, 21:43
|
Группа: Новичок
Сообщений: 8
Регистрация: 1-09-07
Пользователь №: 30 221

|
Есть AT90CAN128, у которого используется USART1. При написании программы в CV AVR всё отлично пашет. Контроллер посылает данные в порт, гипертерминал их получает и выводит на экран. Т.е. железо в порядке. Но когда я попытался написать аналогичную программу в IAR, ком-порт работать перестал. При этом остальное не пострадало. Ниже приведены функции настройки и передачи данных. Код // Инициализация USART void USART_Init( void ) { // Включить приемник и передатчик UCSR1B = ( 1 << RXEN1 ) | ( 1 << TXEN1 ); // 8 data, no parity, 1 stop UCSR1C = ( 1 << UCSZ11 ) | ( 1 << UCSZ10 ); // 9600 bps при 16 MHz UBRR1 = 103; }
// Передача данных по USART void USART1_Transmit( unsigned char data ) { // Запись в буфер UDR1 = data; // Ожидание завершения передачи while ( ! ( UCSR1A & ( 1 << TXC1 ) ) ); } На ATmega8 данные функции работают после незначительной переделки ( только один USART, против двух у at90can128 ). В чем же дело?
|
|
|
|
|
 |
Ответов
|
Sep 2 2007, 16:03
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(--Ivan-- @ Sep 1 2007, 21:43)  Есть AT90CAN128, у которого используется USART1. При написании программы в CV AVR всё отлично пашет. Контроллер посылает данные в порт, гипертерминал их получает и выводит на экран. Т.е. железо в порядке. Но когда я попытался написать аналогичную программу в IAR, ком-порт работать перестал. При этом остальное не пострадало. Ниже приведены функции настройки и передачи данных.
На ATmega8 данные функции работают после незначительной переделки ( только один USART, против двух у at90can128 ). В чем же дело? Дело в том, что для AT90CAN128 адреса регистров компорта находятся в расширенной зоне адресов ввода-вывода (выше 0х60), а для ATmega8 - в обычной (ниже 0х60). Поменяйте файл с определениями регистров и будет вам щастье. И ещё, при инициализации лучше сначала инициализировать регистры порта, потом разрешать приёмник и передатчик, а не наоборот.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 3 2007, 09:51
|
Группа: Новичок
Сообщений: 8
Регистрация: 1-09-07
Пользователь №: 30 221

|
Файл "iocan128.h", в котором определяются регистры, на первый взгляд без ошибок. Адреса связанных с компортом регистров специально сверил с документацией и не нашел отличий. Цитата(=GM= @ Sep 2 2007, 20:03)  И ещё, при инициализации лучше сначала инициализировать регистры порта, потом разрешать приёмник и передатчик, а не наоборот. Пробовал и так, и этак - никакой разницы.
|
|
|
|
|
Sep 3 2007, 16:26
|
Группа: Новичок
Сообщений: 8
Регистрация: 1-09-07
Пользователь №: 30 221

|
Цитата(=GM= @ Sep 3 2007, 15:59)  Попробуйте в режиме теста вывести данные не по прерыванию, а по ожиданию готовности TXC. Прерывания я не использовал. Код // Передача данных по USART void USART1_Transmit( unsigned char data ) { // Запись в буфер UDR1 = data; // Ожидание завершения передачи while ( ! ( UCSR1A & ( 1 << TXC1 ) ) ); } В основной программе просто циклично вызывается данная функция. Код void main( void ) { asm("cli"); PWM_Init(); USART_Init(); asm("sei");
int i=0, c=1; DDRC = 0xFF; PORTC = 0xFF; while (1) { USART1_Transmit( 'b' ); i += c; if ( i > 165 ) c = -1; if ( i < -165 ) c = 1; PWM_Set( i, i ); } } Судя по тому, что остальной код выполняется правильно, зацикливание из-за TXC1 не происходит. Вообще 90кан128 - довольно большой мк, может есть какие-нибудь хитрости именно с инициализацией. Цитата Так что вам мешает написать простенькую тестовую программу вывода в цикле буквы 'A' и сравнить листинги? Чудес ведь не бывает. Программка у меня примерно того же уровня сложности
|
|
|
|
|
Sep 3 2007, 20:50
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(--Ivan-- @ Sep 3 2007, 16:26)  Судя по тому, что остальной код выполняется правильно, зацикливание из-за TXC1 не происходит. Вообще 90кан128 - довольно большой мк, может есть какие-нибудь хитрости именно с инициализацией Ну, чудес не бывает, давайте посмотрим, что там яровский компилер натворил в асмовом коде.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 4 2007, 18:55
|
Группа: Новичок
Сообщений: 8
Регистрация: 1-09-07
Пользователь №: 30 221

|
Цитата(=GM= @ Sep 4 2007, 00:50)  Ну, чудес не бывает, давайте посмотрим, что там яровский компилер натворил в асмовом коде. Знать бы ещё как этот код достать...
|
|
|
|
Сообщений в этой теме
--Ivan-- AT90CAN128 Sep 1 2007, 21:43      Сергей Борщ Цитата(--Ivan-- @ Sep 4 2... Sep 5 2007, 11:52       --Ivan-- Код \ In segment CODE, align 2, ke... Sep 5 2007, 17:32        =GM= Цитата(--Ivan-- @ Sep 5 2... Sep 5 2007, 22:21        Сергей Борщ Цитата(--Ivan-- @ Sep 5 2... Sep 6 2007, 04:33         --Ivan-- Из-за кодвизарда в коде много лишнего. Выкладываю ... Sep 6 2007, 16:01          Сергей Борщ Цитата(--Ivan-- @ Sep 6 2... Sep 6 2007, 16:14           =GM= Цитата(Сергей Борщ @ Sep 6 2007, 15:14) Н... Sep 6 2007, 16:39            --Ivan-- Цитата(=GM= @ Sep 6 2007, 20:39) То --Iva... Sep 7 2007, 16:18             =GM= Цитата(--Ivan-- @ Sep 7 2... Sep 7 2007, 21:51              --Ivan-- Как раз в случае 0х55 и возникает та самая буква ... Sep 8 2007, 14:47               =GM= Цитата(--Ivan-- @ Sep 8 2... Sep 10 2007, 10:47 Сергей Борщ Цитата(--Ivan-- @ Sep 2 2... Sep 3 2007, 13:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|