Atmega16 >UART>RS485>UART>Atmega16

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Ответить
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение 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)
{

}
}
Вложения
123.jpg
схема
(63.29 КБ) 708 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

UDR=PINB; вот только вопрос, когда это делать? Если постоянно, по поставить проверку бита UDRE регистра UCSRA.
Если через RS485, то перед этим переключить направление передачи.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

Проверку постояно. и отсылать так же. а если порт А добавить тогда как запись сделать?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

проверить UDRE, записать в UDR PINB, проверить UDRE, записать в UDR PINA и далее по кругу...
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

Не пойму как записать в коде. я не очень силён так сказать , не которые основы понятно.

while (1) // условие истина
{
UDR = PINB; // а тут получается что в порту B, то записать в UDR
}
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Я в Сях не силен, но в даташите есть пример, думаю если таких два подряд в основной while вставить, то как раз то что надо и получится.

Код: Выделить всё

while(1);
{
while (!(UCSRA&(1<<UDRE)));
UDR=PINB;
while (!(UCSRA&(1<<UDRE)));
UDR=PINA;
}
Реклама
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

добился я отправки зацепил все три порта A B C 24 бита, UART пока что настроен на 1мгц, частоту планирую от внешнего кварца.

Теперь буду разбираться с приёмником
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

Engineer_Keen спасибо вам большое за помощь, если не сильно вас отвлеку а как же тогда принимать, даташит смотрел. но что то мало понятно . понял что нужно читать в UDR по готовности и делать вывод в порт
Вложения
передатчик.rar
проект передатчика CVAVR
(42.94 КБ) 175 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Тут на самом деле не все так просто. В идеальном случае, контроллеры включаются синхронно, и сразу начинают обмениваться данными, в реальности это вовсе не обязательно. Второй контроллер конечно примет байт, но он не сможет определить какой это из 3 (A, B или С), тут уже нужен протокол. Вариантов куча:
1) первый контроллер шлет пакет из 3х байт только после запроса второго контроллера
2) первый контроллер между пакетами по 3 байта делает промежуток (например размером в 1 кадр), второй считает этот промежуток, если он прошел, счетчик байт сбрасывается, если не сбросился и дошел до 3х, значит принят весь пакет и байты на своих местах
3) первый контроллер шлет пакет например из 5и байт, первый - спец символ, последний - контрольная сумма, второй проверяет чтобы первый байт обязательно был специальным, иначе сброс счетчика, когда принимается весь пакет, проверяет контрольную сумму, если все совпадает - вывод в порты.
4) и т.д.
Вот после определения протокола уже можно изобретать программу.
Если по простому (т.е. в идеальном случае), то код будет как в передающем контроллере, только проверяется другой бит (RXC), и в строках "UDR=PINA (или B или C)", будет наоборот - PORTA (или B или C)=UDR.
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

А вы бы какой выбор сделали? мне кажется второй

while ( !( UCSRA & (1<<UDRE)) );

UDR = PINA; // порт А

while ( !( UCSRA & (1<<UDRE)) );

UDR = PINB; // порт B

while ( !( UCSRA & (1<<UDRE)) );

UDR = PINC; // порт С

delay_ms(50); // а пустой кадр задержкой можно делать?
Последний раз редактировалось akimov1987 Пн мар 04, 2013 10:26:29, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Да, второй довольно простой и требует минимума доработки программы передающего контроллера, там просто перед первой записью в UDR нужно задержку ввести. В приемном нужно будет запустить таймер и в регистре сравнения записать число, которое соответствует задержке (точнее чуть меньше). В прерывании по совпадению нужно сбрасывать счетчик принятых байт. А в прерывании по приему увеличивать счетчик, класть данные в буфер и проверять, не досчитал ли счетчик до 3. Если досчитал, то данные из буфера можно выводить в порт. Только не просите это написать на Си, это не мой язык :dont_know:
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

я понимаю, не прошу так как это ваше время , вы напишите а я то не пойму , а цель одна разобраться, мож кто потом куда ни будь прикрутит)))
Отвлёкся
Значит выходит так
1. отсылаем чиисло(задержку) сравнения во второй мк
2. сравниваем число с числом сравнения
3 считываем три байта и записываем в буфер
4 из буфера выводим уже в порты.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

akimov1987 писал(а):отсылаем чиисло(задержку) сравнения во второй мк
Неее, на передающем:
1) просто ждем например, 520 мкс (19200, 1 старт, 1 стоп, 8 бит это 10 * 52 мкс, но чем больше тем надежнее различить пакеты, лучше сделать размером в 2 кадра, т.е. около 1 мс)
2) отправляем 3 байта
3) все сначала
на принимающем:
1) принимаем байт, сбрасываем таймер
2) проверяем, если приняли 3 байта, то сбрасываем счетчик и выводим в порты
3) все сначала
4) параллельно таймер считает например до 500 мкс (это явно задержка между пакетами, а не пауза между байтами в пакете), как досчитал - сброс счетчика.
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

я пока в ступуре , надо с таймерами разобраться , не думал что тяжелее будет для меня для "Принимающего" написать код.
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Вт авг 11, 2009 10:03:00

Сообщение akimov1987 »

Engineer_Keen ни чего не выходит((( ни как не пойму куда тыкать
В общем пробовал делать так , считывал порта передал во второй мк , и вывел в порта а светодиодами, но почему то в протеусе так, на первом мк частота 1Мгц а на втором 4Мгц тогда работает , а вот в железе не пашет.((( ступор полный
Ответить

Вернуться в «Умные мысли»