Страница 1 из 1
Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Чт фев 28, 2013 11:48:44
akimov1987
На первом мк стоят включатели на порту B и переключаем в разное состояние все 8 вывод. А на втором мк на том же порту B стоят светодиоды и зажигаються согласно включенному перключателю. Соединение по усарту. внешний кварц, низкая скорость. Среда CVAVR.
нодки порта я настроил на вход для считывания логических ноликов. а как вот их состояние записать и передать не знаю. подтолкните пожалуста.
заготовка кода для передатчика
#include <mega16.h>
#include <stdio.h> // библиотека ввода/вывода //
void main(void)
{
PORTB=0xFF; // подтягивающие резисторы //
DDRB=0x00; // порт B как вход
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1)
{
}
}
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Чт фев 28, 2013 12:55:24
Engineer_Keen
UDR=PINB; вот только вопрос, когда это делать? Если постоянно, по поставить проверку бита UDRE регистра UCSRA.
Если через RS485, то перед этим переключить направление передачи.
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Чт фев 28, 2013 13:23:42
akimov1987
Проверку постояно. и отсылать так же. а если порт А добавить тогда как запись сделать?
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Чт фев 28, 2013 14:52:29
Engineer_Keen
проверить UDRE, записать в UDR PINB, проверить UDRE, записать в UDR PINA и далее по кругу...
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пт мар 01, 2013 08:30:16
akimov1987
Не пойму как записать в коде. я не очень силён так сказать , не которые основы понятно.
while (1) // условие истина
{
UDR = PINB; // а тут получается что в порту B, то записать в UDR
}
}
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пт мар 01, 2013 10:05:09
Engineer_Keen
Я в Сях не силен, но в даташите есть пример, думаю если таких два подряд в основной while вставить, то как раз то что надо и получится.
Код: Выделить всё
while(1);
{
while (!(UCSRA&(1<<UDRE)));
UDR=PINB;
while (!(UCSRA&(1<<UDRE)));
UDR=PINA;
}
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пт мар 01, 2013 11:19:27
akimov1987
добился я отправки зацепил все три порта A B C 24 бита, UART пока что настроен на 1мгц, частоту планирую от внешнего кварца.
Теперь буду разбираться с приёмником
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 07:25:04
akimov1987
Engineer_Keen спасибо вам большое за помощь, если не сильно вас отвлеку а как же тогда принимать, даташит смотрел. но что то мало понятно . понял что нужно читать в UDR по готовности и делать вывод в порт
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 09:17:49
Engineer_Keen
Тут на самом деле не все так просто. В идеальном случае, контроллеры включаются синхронно, и сразу начинают обмениваться данными, в реальности это вовсе не обязательно. Второй контроллер конечно примет байт, но он не сможет определить какой это из 3 (A, B или С), тут уже нужен протокол. Вариантов куча:
1) первый контроллер шлет пакет из 3х байт только после запроса второго контроллера
2) первый контроллер между пакетами по 3 байта делает промежуток (например размером в 1 кадр), второй считает этот промежуток, если он прошел, счетчик байт сбрасывается, если не сбросился и дошел до 3х, значит принят весь пакет и байты на своих местах
3) первый контроллер шлет пакет например из 5и байт, первый - спец символ, последний - контрольная сумма, второй проверяет чтобы первый байт обязательно был специальным, иначе сброс счетчика, когда принимается весь пакет, проверяет контрольную сумму, если все совпадает - вывод в порты.
4) и т.д.
Вот после определения протокола уже можно изобретать программу.
Если по простому (т.е. в идеальном случае), то код будет как в передающем контроллере, только проверяется другой бит (RXC), и в строках "UDR=PINA (или B или C)", будет наоборот - PORTA (или B или C)=UDR.
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 10:09:16
akimov1987
А вы бы какой выбор сделали? мне кажется второй
while ( !( UCSRA & (1<<UDRE)) );
UDR = PINA; // порт А
while ( !( UCSRA & (1<<UDRE)) );
UDR = PINB; // порт B
while ( !( UCSRA & (1<<UDRE)) );
UDR = PINC; // порт С
delay_ms(50); // а пустой кадр задержкой можно делать?
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 10:25:00
Engineer_Keen
Да, второй довольно простой и требует минимума доработки программы передающего контроллера, там просто перед первой записью в UDR нужно задержку ввести. В приемном нужно будет запустить таймер и в регистре сравнения записать число, которое соответствует задержке (точнее чуть меньше). В прерывании по совпадению нужно сбрасывать счетчик принятых байт. А в прерывании по приему увеличивать счетчик, класть данные в буфер и проверять, не досчитал ли счетчик до 3. Если досчитал, то данные из буфера можно выводить в порт. Только не просите это написать на Си, это не мой язык

Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 10:47:33
akimov1987
я понимаю, не прошу так как это ваше время , вы напишите а я то не пойму , а цель одна разобраться, мож кто потом куда ни будь прикрутит)))
Отвлёкся
Значит выходит так
1. отсылаем чиисло(задержку) сравнения во второй мк
2. сравниваем число с числом сравнения
3 считываем три байта и записываем в буфер
4 из буфера выводим уже в порты.
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 11:00:46
Engineer_Keen
akimov1987 писал(а):отсылаем чиисло(задержку) сравнения во второй мк
Неее, на передающем:
1) просто ждем например, 520 мкс (19200, 1 старт, 1 стоп, 8 бит это 10 * 52 мкс, но чем больше тем надежнее различить пакеты, лучше сделать размером в 2 кадра, т.е. около 1 мс)
2) отправляем 3 байта
3) все сначала
на принимающем:
1) принимаем байт, сбрасываем таймер
2) проверяем, если приняли 3 байта, то сбрасываем счетчик и выводим в порты
3) все сначала
4) параллельно таймер считает например до 500 мкс (это явно задержка между пакетами, а не пауза между байтами в пакете), как досчитал - сброс счетчика.
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Пн мар 04, 2013 12:14:19
akimov1987
я пока в ступуре , надо с таймерами разобраться , не думал что тяжелее будет для меня для "Принимающего" написать код.
Re: Atmega16 >UART>RS485>UART>Atmega16
Добавлено: Ср мар 06, 2013 19:09:11
akimov1987
Engineer_Keen ни чего не выходит((( ни как не пойму куда тыкать
В общем пробовал делать так , считывал порта передал во второй мк , и вывел в порта а светодиодами, но почему то в протеусе так, на первом мк частота 1Мгц а на втором 4Мгц тогда работает , а вот в железе не пашет.((( ступор полный