Вот тут большой простор для творчества : сделать незаметную кнопочку, чтобы взвесили одно, а напечатали чуть-чуть другоеILYAUL писал(а): Весы предавали данные в своём протоколе и со своей скоростью , данные на принтер шли уже в ASCII протоколе
Как запараллелить USART в Mega162.
- Реклама
- Сообщения: 1817
- Зарегистрирован: Пн ноя 29, 2010 15:58:43
Евгений33, если так строить программу, то можете легко пропустить принимаемые даннные из нулевого каналов, пока ожидаете готовность первого и наоборот
Jack_A, а насчет убэп, то вряди им это интересно будет - весы не являются фискальным устройством
Jack_A, а насчет убэп, то вряди им это интересно будет - весы не являются фискальным устройством
igor-x писал(а):да вроде прошло время сессий... чо ему шифроваться.
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс
Я могу угадать. Точнее мне тоже такой надо. Есть МК, на одном уапп висит бутлоадер, по второму управляет девайсом. Задача - на компе запускаем вместо бута программу, которая через МК напрямую управляет деваайсом.
И это, не сильно теорией размахивайтесь, т.к. я пробывал и программно с udr1 на udr0 и аппаратно пинами дергать. Не получилось. В протеусе всё ок.
кварц 16 мгц. скорость 14400 для начала.
- Сообщения: 1817
- Зарегистрирован: Пн ноя 29, 2010 15:58:43
Alexander, вы часто собираетесь менять программу МК? 2 уарт вам не надо
- Реклама
Много перемычек. Если бы просто соединить... так надо от ног мк отсоединить )ploop писал(а):Перемычка - уже не модно?
Да. В том то и соль, что программа будет часто меняться в зависимости от условий. Т.е. бут там должен быть 100%. И два уарта тоже, т.к. второй преобразовуется в другой интерфейс и для прошивки бутом не подходит.igor-x писал(а):Alexander, вы часто собираетесь менять программу МК? 2 уарт вам не надо
Промоделировал в Proteus. На одном терминале данные приходят но только несколько посылок и стопарится, переключаемся на другой и там аналогичная ситуация. Далее переключаемся на первый терминал и опять пара посылок и стопор. 
.....
Или вы не читаете ответы?Евгений33, если так строить программу, то можете легко пропустить принимаемые даннные из нулевого каналов, пока ожидаете готовность первого и наоборот
Добрый вечер.При отладке в Proteus на скорости 9600 бод пользовался стандартными скоростями терминалов. При отладке на 400000 бод, ставлю default и получаю в основном ошибки.
.....
Ну вот вроде бы доделал, только не понятен один момент, при отладке в 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;
}
};
}
#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;
}
};
}
.....
Уважаемые, не подскажите ли пожалуйста почему при проверке каждого из регистров UCSR0A и UCSR1A в выше приведенном коде, происходит выполнение условий в каждом операторе if, как будто оба флага RXC в UCSRA дают готовность, всю голову себе сломал. 
.....
Условия выписаны неправильно.
Сколько раз можно отвечать на одни и те же вопросы...
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)
Сколько раз можно отвечать на одни и те же вопросы...
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)
Дорого времени суток уважаемые! Последнее что удалось сделать по данной теме: данные идут в обеих направлениях. При скорости 115200 посылка размером 28 байт идет без потерь, при скорости 460800 теряется два байта, они просто не доходят, при скорости 921600 практически у всех байтов наблюдается несоответствие изначальной информации. Ни как ни могу уйти от ошибок! 
- Вложения
-
- 1.txt
- (1.97 КБ) 212 скачиваний
.....
B1 и D2 сигналы управления драйверами RS485 max1487, 0 принимаем, 1 передаем. Есть линия длиной 0,6 км по которой надо передавать данные по RS-485, провод-не витая пара, по этому нужно промежуточное устройство которое бы скажем так "усиливало" бы цифровой сигнал после 0,3 км и передавало данные в обеих направлениях.
.....


