|
|
  |
mega128 инициализация UART0, UART01 |
|
|
|
Sep 3 2008, 17:05
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Даже и незнаю на что грешит. Инит юартов. Использую прерывания RX Код /*********************************************************************** Function : uart0_init Parameters : nil Date : Desc : int disabled //UART0 initialize // desired baud rate: 57600 // actual: baud rate:57600 (0,0%) // char size: 8 bit // parity: Disabled //ICC-AVR application builder : 04.06.2008 15:23:56 // Target : M128 // Crystal: 7.3728Mhz ***********************************************************************/
void uart0_init(void) { #ifndef UartOVF UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x07; //set baud rate lo UBRR0H = 0x00; //set baud rate hi UCSR0B = 0x18; #else UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x07; //set baud rate lo UBRR0H = 0x00; //set baud rate hi //UCSR0B = 0xB8; UCSR0B = 0x98; //without UDR is now empty int #endif }
/*********************************************************************** Function : uart1_init Parameters : nil Date : Desc : int disabled //UART1 initialize // desired baud rate:57600 // actual baud rate:57600 (0,0%) // char size: 8 bit // parity: Disabled //ICC-AVR application builder : 04.06.2008 15:23:56 // Target : M128 // Crystal: 7.3728Mhz ***********************************************************************/
void uart1_init(void) { #ifndef UartOVF UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x07; //set baud rate lo UBRR1H = 0x00; //set baud rate hi UCSR1B = 0x18;
#else UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x07; //set baud rate lo UBRR1H = 0x00; //set baud rate hi //UCSR1B = 0xB8; UCSR1B = 0x98; //without UDR is now empty int #endif } вызовы Код /*********************************************************************** Function : putchar Parameters : Date : Desc : ***********************************************************************/ void putchar(unsigned char tx_char, unsigned char CASE_UART) { switch(CASE_UART) { case UART_1:{ //printing to UART PHONE while( !(UCSR0A & (1 << UDRE0) ) ); // ?????????????????????????????????? UDR0 = tx_char; break;}
case UART_2:{ //printing to UART TUNER while( !(UCSR1A & (1 << UDRE1) ) ); //??????????????????????????????????? UDR1 = tx_char; break;}
case UART_3:{ //printing to UART_3 (SOFT DEBUG UART) sUARTtx(tx_char); break;} }
} при этом первый юарт работает нормально как только вызываю второй программа вешается, как я понял на строке while( !(UCSR1A & (1 << UDRE1) ) ); и всё вечное ожидание.
|
|
|
|
|
Sep 3 2008, 17:35
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(west329_ @ Sep 3 2008, 21:05)  Даже и незнаю на что грешит. Начните с проверки состояния фьюза M103C....
|
|
|
|
|
Sep 3 2008, 17:50
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Qwertty @ Sep 3 2008, 20:35)  Начните с проверки состояния фьюза M103C.... Проверяю в понипрог нам стоит птичка как я понял для фьюза это 0. Перед тем как заливать код в железо предварительно код отладил в протеусе, там всё работает как часы, хотя этот симулятор не показатель.
|
|
|
|
|
Sep 3 2008, 18:17
|
Местный
  
Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294

|
Цитата(west329_ @ Sep 3 2008, 20:50)  Проверяю в понипрог нам стоит птичка как я понял для фьюза это 0.
Перед тем как заливать код в железо предварительно код отладил в протеусе, там всё работает как часы, хотя этот симулятор не показатель. Еще раз подумай про бит и понипрог
|
|
|
|
|
Sep 3 2008, 18:54
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Flasher @ Sep 3 2008, 21:17)  Еще раз подумай про бит и понипрог Ув. Flasher все заработало, разясните мне начинаещему, как та может быть. В меге из фузов было переключено всего 2. CKSEL3 и CKSEL2, в пони вначале в них стояли птички, что соотвецтвовало по даташиту внутреннему генератору, я убираю птички фактически устанавливаю биты в 1, по документации перешожу на тактирование от внешнего кварца. Всё работает нормально. Теперь эта ситуация, сначало в пони в значении бита M103C стоит птичка, значит unprogramed тоесть значение бита 0. Открываю даташит (Default Value - M103C(1) 1 ATmega103 compatibility mode 0 (programmed) ) получается что мега128 сначала включена в режит меги103 где логика ? разъясните ?
|
|
|
|
|
Sep 3 2008, 19:04
|
Местный
  
Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294

|
Цитата(west329_ @ Sep 3 2008, 21:54)  Ув. Flasher все заработало, разясните мне начинаещему, как та может быть. В меге из фузов было переключено всего 2. CKSEL3 и CKSEL2, в пони вначале в них стояли птички, что соотвецтвовало по даташиту внутреннему генератору, я убираю птички фактически устанавливаю биты в 1, по документации перешожу на тактирование от внешнего кварца. Всё работает нормально.
Теперь эта ситуация, сначало в пони в значении бита M103C стоит птичка, значит unprogramed тоесть значение бита 0. Открываю даташит (Default Value - M103C(1) 1 ATmega103 compatibility mode 0 (programmed) ) получается что мега128 сначала включена в режит меги103 где логика ? разъясните ? Она изначально в режиме совместимости, так как раньше она предназначалась для замены 103 в изделиях
|
|
|
|
|
Sep 4 2008, 20:21
|
Местный
  
Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294

|
Цитата(west329_ @ Sep 4 2008, 23:09)  Как можно притупить чувствительность порта USART. Один USART подключается на макс3232 и как я понял за щёт высоких уровней и преобразователя он находяс в воздухе не сбоит , а другой USART без формирователя а планируется просто для связи с другим конроллером напрямую без максов, когда по нему передаю байт тут же срабатывает прерывание, линия RX висит в воздуже и идёт рядом с ТХ. если закорачиваю RX на землю прерывание не проходит, чем лучше задавить шум резистором или конденсатором чтоб потом не повлиять на поток 115200??? RX на 5 вольт подтяни резистором 4,7ком
|
|
|
|
|
Sep 4 2008, 21:18
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Так писать нехорошо. Лучше как-нибудь так: Код UCSR0B = (0<<RXIE)|(0<<TXIE)|(0<<UDRIE)| //rx,tx interrupts disable (0<<TXEN)|(0<<RXEN)|(dmsb<<UCZ2); //TX disble, RX disable;
--------------------
ASB
|
|
|
|
|
Sep 5 2008, 03:02
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999

|
Цитата(Aleksandr Baranov @ Sep 5 2008, 00:18)  Так писать нехорошо. Лучше как-нибудь так: Ваше выражение эквивалентно полному занулению регистра. Гасить биты надо так: Код UCSR0B &= 0xFF^((1<<RXIE)|(1<<TXIE)|(1<<UDRIE)| //rx,tx interrupts disable (1<<TXEN)|(1<<RXEN)|(dmsb<<UCZ2)); //TX disble, RX disable;
|
|
|
|
|
Sep 5 2008, 05:44
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
void stopUART( void ) { UCSR1B &= ~0x80; //RXCIEn -- RX int UART1 off }
Сообщение отредактировал west329_ - Sep 5 2008, 05:45
|
|
|
|
|
Sep 5 2008, 14:45
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(Syberian @ Sep 4 2008, 23:02)  Ваше выражение эквивалентно полному занулению регистра. Гасить биты надо так: Код UCSR0B &= 0xFF^((1<<RXIE)|(1<<TXIE)|(1<<UDRIE)| //rx,tx interrupts disable (1<<TXEN)|(1<<RXEN)|(dmsb<<UCZ2)); //TX disble, RX disable; Я всего лишь имел в виду, что не стоит записывать в регистр число, чтобы потом на бумажке расписывать его биты
--------------------
ASB
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|