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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как правильно настроить UART 2313 + 2.4576МГЦ?
The Fresh
сообщение Apr 11 2007, 21:00
Сообщение #1


Частый гость
**

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



Зашил программу в микруху, которая должна выдавать данные через UART + кабель USB шный от телефона для согласования уровней. Запустил терминал на скорость 19200, а там данные приходят, но не те которые отсылаются, они повторяются т.е не хаотичные. В регистр для скорости занес UBRR = 7 (для скорости 19200) расчитывал по формуле F_CPU/(UART_BAUD_RATE*16l)-1. Какие факторы могут влиять, кроме программных? Шнурок вроде рабочий потому как использовал его с уартом блютус чипа там таких косяков не было.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 12 2007, 00:40
Сообщение #2


Ambidexter
*****

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



Цитата(The Fresh @ Apr 11 2007, 18:00) *
Зашил программу в микруху, которая должна выдавать данные через UART + кабель USB шный от телефона для согласования уровней. Запустил терминал на скорость 19200, а там данные приходят, но не те которые отсылаются, они повторяются т.е не хаотичные. В регистр для скорости занес UBRR = 7 (для скорости 19200) расчитывал по формуле F_CPU/(UART_BAUD_RATE*16l)-1. Какие факторы могут влиять, кроме программных? Шнурок вроде рабочий потому как использовал его с уартом блютус чипа там таких косяков не было.

Что с битом U2X?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 12 2007, 04:19
Сообщение #3


Частый гость
**

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



Что за бит, в таблице служебных регистров из даташита микрухи никакого упоминания. Может в проге косяк, я ее немного правил т.к. под старый компилятор были заточены некоторые функции.


$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++;
}
}
Go to the top of the page
 
+Quote Post
nss
сообщение Apr 12 2007, 09:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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]);
}
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 12 2007, 09:46
Сообщение #5


Гуру
******

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



Цитата(The Fresh @ Apr 11 2007, 20:00) *
Какие факторы могут влиять, кроме программных?
Вы не указали частоту кварца, поэтому трудно проверить значение 7. Кроме того, вы не указали полное название контроллера - AT90S2313 или ATtiny2313 (у последней бит U2X есть).


--------------------
На любой вопрос даю любой ответ
"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
aesok
сообщение Apr 12 2007, 09:57
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



То The Fresh:

Покажите больше кода. А просто передать символ, строку у вас получаеться?

Анатолий.

Сообщение отредактировал aesok - Apr 12 2007, 09:58
Go to the top of the page
 
+Quote Post
ZAO
сообщение Apr 12 2007, 10:06
Сообщение #7





Группа: Новичок
Сообщений: 8
Регистрация: 17-01-06
Пользователь №: 13 289



Цитата(The Fresh @ Apr 11 2007, 22:00) *
Какие факторы могут влиять, кроме программных? Шнурок вроде рабочий потому как использовал его с уартом блютус чипа там таких косяков не было.

1. Проверте, та ли частота генерится на чипе.
2. Поподробнее, что за USB-шный шнурок используете? Я сталкивался с тем что на некоторых преобразователях USB-RS232 реальная скорость передачи отличалась от устанавливаемой.
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 12 2007, 11:05
Сообщение #8


Частый гость
**

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



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

Сообщение отредактировал The Fresh - Apr 12 2007, 11:21
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 12 2007, 12:11
Сообщение #9


Гуру
******

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



Цитата(The Fresh @ Apr 12 2007, 10:05) *
Насчет микрухи AT90S2313, частоту указал в вопросе
Извиняюсь, не заметил sad.gif
Цитата(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)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 12 2007, 17:17
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 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 файл получен не будет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 12 2007, 17:43
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 12 2007, 19:30
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 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
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 12 2007, 22:17
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Прочтите в avr-libc-user-manual FAQ #1 !!!!!!

Приведите код фунуции: UART_outstr_P(pBuf);

Анатолий.
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 13 2007, 03:21
Сообщение #14


Частый гость
**

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



Эта функция работает нормально с МК данные приходят валидные. Проблема в использовании преррывания на приходящие байты данных в МК! Я так понимаю мне надо углубиться в чтение книжек smile.gif. Примера нет никакого?
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++;
}
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 13 2007, 09:39
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(The Fresh @ Apr 13 2007, 03:21) *
Эта функция работает нормально с МК данные приходят валидные. Проблема в использовании преррывания на приходящие байты данных в МК! Я так понимаю мне надо углубиться в чтение книжек smile.gif. Примера нет никакого?
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" должно эхом вернуться, а вместо ....


Анатолий.
Go to the top of the page
 
+Quote Post

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

 


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


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