Страница 2 из 2

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 10:37:21
Jack_A
ILYAUL писал(а): Весы предавали данные в своём протоколе и со своей скоростью , данные на принтер шли уже в ASCII протоколе
Вот тут большой простор для творчества : сделать незаметную кнопочку, чтобы взвесили одно, а напечатали чуть-чуть другое :) Правда, УБЭП не оценит :(

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:09:08
igor-x
Евгений33, если так строить программу, то можете легко пропустить принимаемые даннные из нулевого каналов, пока ожидаете готовность первого и наоборот

Jack_A, а насчет убэп, то вряди им это интересно будет - весы не являются фискальным устройством

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:36:29
__Alexander
igor-x писал(а):да вроде прошло время сессий... чо ему шифроваться.
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс

Я могу угадать. Точнее мне тоже такой надо. Есть МК, на одном уапп висит бутлоадер, по второму управляет девайсом. Задача - на компе запускаем вместо бута программу, которая через МК напрямую управляет деваайсом.

И это, не сильно теорией размахивайтесь, т.к. я пробывал и программно с udr1 на udr0 и аппаратно пинами дергать. Не получилось. В протеусе всё ок.

кварц 16 мгц. скорость 14400 для начала.

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:43:42
ploop
Перемычка - уже не модно?

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:48:42
igor-x
Alexander, вы часто собираетесь менять программу МК? 2 уарт вам не надо

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:50:59
__Alexander
ploop писал(а):Перемычка - уже не модно?
Много перемычек. Если бы просто соединить... так надо от ног мк отсоединить )

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 11:54:09
__Alexander
igor-x писал(а):Alexander, вы часто собираетесь менять программу МК? 2 уарт вам не надо
Да. В том то и соль, что программа будет часто меняться в зависимости от условий. Т.е. бут там должен быть 100%. И два уарта тоже, т.к. второй преобразовуется в другой интерфейс и для прошивки бутом не подходит.

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 12:58:00
Евгений33
Промоделировал в Proteus. На одном терминале данные приходят но только несколько посылок и стопарится, переключаемся на другой и там аналогичная ситуация. Далее переключаемся на первый терминал и опять пара посылок и стопор. :(

Re: Как запараллелить USART в Mega162.

Добавлено: Пт июн 08, 2012 13:02:46
ploop
Евгений33, если так строить программу, то можете легко пропустить принимаемые даннные из нулевого каналов, пока ожидаете готовность первого и наоборот
Или вы не читаете ответы?

Re: Как запараллелить USART в Mega162.

Добавлено: Пн июл 09, 2012 16:08:55
Евгений33
Добрый вечер.При отладке в Proteus на скорости 9600 бод пользовался стандартными скоростями терминалов. При отладке на 400000 бод, ставлю default и получаю в основном ошибки.

Re: Как запараллелить USART в Mega162.

Добавлено: Ср авг 15, 2012 23:20:00
Евгений33
Ну вот вроде бы доделал, только не понятен один момент, при отладке в Proteus при посылки с терминала USART0 данные четко отображаются на обеих терминалах, при посылке с терминала USART1 данные на терминал USART0 приходят нормально, а вот на самом USART1 отображаются с запазданием, то есть при первой посылке с USART1(например число 2), на USART1 ни отображается ничего, а на USART0 - 2, при последующих посылках происходит то же самое запаздывание, шлем число 3, на USART1 отображается старое число (в нашем случае 2), а на USART0 - 3.


#include <mega162.h>
#include <stdio.h>

void main(void)
{

unsigned char data;

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x86;
UBRR0H=0x00;
UBRR0L=0x52;

UCSR1A=0x00;
UCSR1B=0x18;
UCSR1C=0x86;
UBRR1H=0x00;
UBRR1L=0x52;


ACSR=0x80;

while (1)
{
while(((UCSR0A & 10000000)|(UCSR1A & 10000000))==0);

if((UCSR0A & 10000000)==1);
{
data=UDR0;
while ((UCSR1A & 100000)==0);
UDR1=data;
}
if((UCSR1A & 10000000)==1);
{
data=UDR1;
while ((UCSR0A & 100000)==0);
UDR0=data;
}

};
}

Re: Как запараллелить USART в Mega162.

Добавлено: Чт авг 23, 2012 19:54:07
Евгений33
Уважаемые, не подскажите ли пожалуйста почему при проверке каждого из регистров UCSR0A и UCSR1A в выше приведенном коде, происходит выполнение условий в каждом операторе if, как будто оба флага RXC в UCSRA дают готовность, всю голову себе сломал. :dont_know:

Re: Как запараллелить USART в Mega162.

Добавлено: Чт авг 23, 2012 20:40:33
urry
Условия выписаны неправильно.
Сколько раз можно отвечать на одни и те же вопросы...
if((UCSR0A & 10000000)==1)
{
}
Смотрите, даже если написать
if((UCSR0A & 0b10000000)==1)
Условие никогда не выполнится, потому что даже при наличии 1 в старшем разряде
0b10000000 не будет равняться 0b00000001
Условие лучше записывать через true false , где
#define false 0
#define true !false
true будет истинно при любых значениях результата, отличных от 0
if((UCSR0A & 0b10000000)==true)
Уже правильно, хотя записывают проще
if(UCSR0A & 0b10000000)

Re: Как запараллелить USART в Mega162.

Добавлено: Вт фев 26, 2013 16:38:15
Евгений33
Дорого времени суток уважаемые! Последнее что удалось сделать по данной теме: данные идут в обеих направлениях. При скорости 115200 посылка размером 28 байт идет без потерь, при скорости 460800 теряется два байта, они просто не доходят, при скорости 921600 практически у всех байтов наблюдается несоответствие изначальной информации. Ни как ни могу уйти от ошибок! :(

Re: Как запараллелить USART в Mega162.

Добавлено: Вт фев 26, 2013 18:09:48
Евгений33
B1 и D2 сигналы управления драйверами RS485 max1487, 0 принимаем, 1 передаем. Есть линия длиной 0,6 км по которой надо передавать данные по RS-485, провод-не витая пара, по этому нужно промежуточное устройство которое бы скажем так "усиливало" бы цифровой сигнал после 0,3 км и передавало данные в обеих направлениях.