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

 
 
> 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
Сергей Борщ
сообщение Sep 5 2007, 11:52
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(--Ivan-- @ Sep 4 2007, 21:55) *
Знать бы ещё как этот код достать... unsure.gif
Project->options->C/C++ compiler->вкладка List->Output list file, assembler mnemonics. Листинги искать в папке, указанной в Project->options->General Options->Output


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
--Ivan--
сообщение Sep 5 2007, 17:32
Сообщение #9





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



Код
   \                                 In  segment CODE, align 2, keep-with-next
   \   __nearfunc __version_3 void USART_Init()
   \                     USART_Init:
   \   00000000   E108               LDI     R16, 24
   \   00000002   930000C9           STS     201, R16
   \   00000006   E006               LDI     R16, 6
   \   00000008   930000CA           STS     202, R16
   \   0000000C   E607               LDI     R16, 103
   \   0000000E   E010               LDI     R17, 0
   \   00000010   931000CD           STS     205, R17
   \   00000014   930000CC           STS     204, R16
   \   00000018   9508               RET
   \   0000001A                      REQUIRE _A_UBRR1
   \   0000001A                      REQUIRE _A_UCSR1C
   \   0000001A                      REQUIRE _A_UCSR1B

   \                                 In  segment CODE, align 2, keep-with-next
   \   __nearfunc __version_3 void USART1_Transmit(unsigned char)
   \                     USART1_Transmit:
   \   00000000   930000CE           STS     206, R16
   \                     ??USART1_Transmit_0:
   \   00000004   910000C8           LDS     R16, 200
   \   00000008   FF06               SBRS    R16, 6
   \   0000000A   CFFC               RJMP    ??USART1_Transmit_0
   \   0000000C   9508               RET
   \   0000000E                      REQUIRE _A_UDR1
   \   0000000E                      REQUIRE _A_UCSR1A
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
|- - =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 Текстовая версия Сейчас: 1st August 2025 - 23:48
Рейтинг@Mail.ru


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