|
Как правильно настроить UART 2313 + 2.4576МГЦ? |
|
|
|
Apr 12 2007, 09:08
|

Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277

|
Цитата(The Fresh @ Apr 12 2007, 05:19)  Что за бит, в таблице служебных регистров из даташита микрухи никакого упоминания. Может в проге косяк, я ее немного правил т.к. под старый компилятор были заточены некоторые функции. $0C ($2C) UDR UART I/O Data Register 40 $0B ($2B) USR RXC TXC UDRE FE OR - - - 40 $0A ($2A) UCR RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 41 $09 ($29) UBRR UART Baud Rate Register 43 $08 ($28) ACSR ACD - ACO ACI ACIE ACIC ACIS1 ACIS0 44
const char szATZ[] PROGMEM = "bla bla bla";
void UART_Init(void) /* initialize uart */ { /* enable RxD/TxD and ints */ UCR =(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); /* set baud rate */ UBRR = (unsigned char)UART_BAUD_SELECT; //=7 }
void UART_outstr(char* psz) { unsigned char i = 0; while(1) { char c = psz[i]; if(!c) break; UDR=c; loop_until_bit_is_set(USR, UDRE); i++; } } А почему вы думаете, что за концом psz будут нули. вот например код отправки блока typedef usigned char BYTE; typedef unsigned int WORD; void UART0_txdata(const void *buf, const WORD n) { WORD i; for(i=0;i<n;i++) { while(!(UCSR0A &(1<<UDRE))); UDR0 = (BYTE) (( (BYTE *) buf)[i]); } }
|
|
|
|
|
Apr 12 2007, 10:06
|
Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289

|
Цитата(The Fresh @ Apr 11 2007, 22:00)  Какие факторы могут влиять, кроме программных? Шнурок вроде рабочий потому как использовал его с уартом блютус чипа там таких косяков не было. 1. Проверте, та ли частота генерится на чипе. 2. Поподробнее, что за USB-шный шнурок используете? Я сталкивался с тем что на некоторых преобразователях USB-RS232 реальная скорость передачи отличалась от устанавливаемой.
|
|
|
|
|
Apr 12 2007, 11:05
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
Сорри, что всех так озадачил, не разобрался доконца в коде. Сейчас повырезал некоторые части и оставил только отправку и все работает. Буду смотреть алгоритм где косяк. Насчет микрухи AT90S2313, частоту указал в вопросе, шнурок на чипе PL2303, значит он рабтает нормально. Всем спасибо. Насчет шнурка я как-то хотел его настроить на нестандартную скорость 10400 не пошел, хотя есть умельцы которые настраивают реестр так, что у них все работает на этом чипе. Пробовал настраивать по ихнему солюшену ничего не вышло. Еще небольшой вопрос объем памяти 2K, мой HEX файл 5K, как приблизительно соотнести их, когда край.
Сообщение отредактировал The Fresh - Apr 12 2007, 11:21
|
|
|
|
|
Apr 12 2007, 12:11
|

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

|
Цитата(The Fresh @ Apr 12 2007, 10:05)  Насчет микрухи AT90S2313, частоту указал в вопросе Извиняюсь, не заметил  Цитата(The Fresh @ Apr 12 2007, 10:05)  Еще небольшой вопрос объем памяти 2K, мой HEX файл 5K, как приблизительно соотнести их, когда край. В общем случае без специальных утилит лучше и не пытаться. Надо просто попросить линкер генерить .map -файл и в нем должно быть указано сколько памяти занято, с точностью до байта.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 12 2007, 17:17
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(The Fresh @ Apr 12 2007, 11:05)  Еще небольшой вопрос объем памяти 2K, мой HEX файл 5K, как приблизительно соотнести их, когда край. В формате hex строка выглядит так: Код :1000A000FFCFFFCFFFCFFFCFFFCFFFCFFFCFFFCFE0 где первые две цифры - длина, следом четыре - адрес, следующие две - команда (должно быть в Вашем случае 00). Возьмите последнюю строку с такой командой и посмотрите адрес - влезает или нет. Цитата(Сергей Борщ @ Apr 12 2007, 12:11)  Надо просто попросить линкер генерить .map -файл и в нем должно быть указано сколько памяти занято, с точностью до байта. По идее если не влезает, то будет ошибка линкования и hex файл получен не будет.
|
|
|
|
|
Apr 12 2007, 17:43
|

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

|
Цитата(IgorKossak @ Apr 12 2007, 16:17)  Возьмите последнюю строку с такой командой и посмотрите адрес - влезает или нет. Ничего не мешает разместить кусок кода в конце памяти и последняя строка будет указывать что памяти не осталось. Цитата(IgorKossak @ Apr 12 2007, 16:17)  По идее если не влезает, то будет ошибка линкования и hex файл получен не будет. Это когда она кончилась - тогда да. А пока не кончилась бывает полезно посмотреть сколько осталось перед очередным обсуждением улучшения пользовательских свойств программы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 12 2007, 19:30
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
Добился я того что, могу отправить данные из МК, но в МК не хочет. Исходный код касаемый приема МК вот такой.
#define SIZERX 32 char arRx[SIZERX]; unsigned char posRx = 0;
// прерывание происходит по приходу байта SIGNAL(SIG_UART_RECV) { arRx[posRx] = inp(UDR); //вот это не компилилось на новом компиляторе WINAVR posRx++; if(posRx >= SIZERX) posRx--; }
#define SIZERX 32 char arRx[SIZERX]; unsigned char posRx = 0;
SIGNAL(SIG_UART_RECV) { arRx[posRx] = UDR; //поменял вот так, правильно ли? posRx++; if(posRx >= SIZERX) posRx--; }
char* UART_Recv(char* pnRecv) { *pnRecv = posRx; return arRx; }
инициализация UART void UART_Init(void) /* initialize uart */ { /* enable RxD/TxD and ints */ UCR =(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); /* set baud rate */ UBRR = (unsigned char)UART_BAUD_SELECT; }
char Send_Receive(PGM_P pSend, int nBytes) { char timer = 0;
UART_ClearRxBuf();
UART_outstr_P(pSend); //вот здесь я получаю от МК данные, используя спец утилиту на PC через 50 мс отправляю ответ "OK"+0x0D
for(timer = 0; timer < 10; timer++) { char n = 0; wait_1ms(150);
char* pBuf = UART_Recv(&n); UART_outstr_P(pBuf);//здесь по идее мое "OK\r" должно эхом вернуться, а вместо него приходит 10002100200423043404300440043D044B04390020043404300442002E
if(strchr(pBuf, 0x0d)) // { if(strstr(pBuf, "OK"))-сюда уже не попадаю ессно!!! return 0; if(strstr(pBuf, "ERROR")) return 1; return 3; // } }
return 2; // timeout }
|
|
|
|
|
Apr 13 2007, 03:21
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
Эта функция работает нормально с МК данные приходят валидные. Проблема в использовании преррывания на приходящие байты данных в МК! Я так понимаю мне надо углубиться в чтение книжек  . Примера нет никакого? void UART_outstr_P(PGM_P str) { unsigned char i = 0; while(1) { char c = pgm_read_byte(&str[i]); if(!c) break; UDR=c; loop_until_bit_is_set(USR, UDRE); i++; } }
|
|
|
|
|
Apr 13 2007, 09:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(The Fresh @ Apr 13 2007, 03:21)  Эта функция работает нормально с МК данные приходят валидные. Проблема в использовании преррывания на приходящие байты данных в МК! Я так понимаю мне надо углубиться в чтение книжек  . Примера нет никакого? void UART_outstr_P(PGM_P str) { unsigned char i = 0; while(1) { char c = pgm_read_byte(&str[i]); if(!c) break; UDR=c; loop_until_bit_is_set(USR, UDRE); i++; } } Эта функция работает нормально, но вы ее используете не правильно. Входной параметр у нее указатель на строку во Flash, а вы ей передаете указатель на RAM: char* pBuf = UART_Recv(&n); UART_outstr_P(pBuf);//здесь по идее мое "OK\r" должно эхом вернуться, а вместо .... Анатолий.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|