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

 
 
> AT90CAN128, Проблема с USART
--Ivan--
сообщение Sep 1 2007, 21:43
Сообщение #1





Группа: Новичок
Сообщений: 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 ). В чем же дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=GM=
сообщение Sep 2 2007, 16:03
Сообщение #2


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). Поменяйте файл с определениями регистров и будет вам щастье.

И ещё, при инициализации лучше сначала инициализировать регистры порта, потом разрешать приёмник и передатчик, а не наоборот.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
--Ivan--
сообщение Sep 3 2007, 09:51
Сообщение #3





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



Файл "iocan128.h", в котором определяются регистры, на первый взгляд без ошибок. Адреса связанных с компортом регистров специально сверил с документацией и не нашел отличий.

Цитата(=GM= @ Sep 2 2007, 20:03) *
И ещё, при инициализации лучше сначала инициализировать регистры порта, потом разрешать приёмник и передатчик, а не наоборот.


Пробовал и так, и этак - никакой разницы.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 3 2007, 11:59
Сообщение #4


Ambidexter
*****

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



Цитата(--Ivan-- @ Sep 3 2007, 08:51) *
Файл "iocan128.h", в котором определяются регистры, на первый взгляд без ошибок. Адреса связанных с компортом регистров специально сверил с документацией и не нашел отличий.
Пробовал и так, и этак - никакой разницы.

Попробуйте в режиме теста вывести данные не по прерыванию, а по ожиданию готовности TXC.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
--Ivan--
сообщение Sep 3 2007, 16:26
Сообщение #5





Группа: Новичок
Сообщений: 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' и сравнить листинги? Чудес ведь не бывает.

Программка у меня примерно того же уровня сложности smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 3 2007, 20:50
Сообщение #6


Ambidexter
*****

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



Цитата(--Ivan-- @ Sep 3 2007, 16:26) *
Судя по тому, что остальной код выполняется правильно, зацикливание из-за TXC1 не происходит. Вообще 90кан128 - довольно большой мк, может есть какие-нибудь хитрости именно с инициализацией

Ну, чудес не бывает, давайте посмотрим, что там яровский компилер натворил в асмовом коде.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
--Ivan--
сообщение Sep 4 2007, 18:55
Сообщение #7





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



Цитата(=GM= @ Sep 4 2007, 00:50) *
Ну, чудес не бывает, давайте посмотрим, что там яровский компилер натворил в асмовом коде.

Знать бы ещё как этот код достать... unsure.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- --Ivan--   AT90CAN128   Sep 1 2007, 21:43
- - =GM=   Цитата(--Ivan-- @ Sep 1 2...   Sep 2 2007, 16:03
|- - =GM=   Цитата(--Ivan-- @ Sep 3 2...   Sep 3 2007, 11:59
|- - =GM=   Цитата(--Ivan-- @ Sep 3 2...   Sep 3 2007, 20:50
|- - Сергей Борщ   Цитата(--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


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

 


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


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