Форум

Радиолюбительский форум.

Если у Вас возникли вопросы, задавайте их на форуме.

В сети

Пользователей: 154
Из них просматривают:
Аналоги: 61. Видео: 1. Даташиты: 61. Инструкции: 1. Магазин: 1. Новости: 7. Остальное: 2. Программы: 1. Производители: 1. Профиль пользователя: 5. Форум: 13.
Участников: 2
Гостей: 152

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

1 ... 6 7 8 9 10 11 12 ... 31


Re: atmega(USART)
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Всем спасибо!!! Но проблему я решил.
Просто надо было расставить заданной величины задержки в нужных местах и вуаля!!!)))



Re: atmega(USART)
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Дело в том, что данные передает в сторону СЛЭЙВА и он даже все понимает. Но вот приема нету.
Как будто Он,либо в этом цикле:
while (!(UCSR0A & (1 << RXC0)));
// нету приема из-за косяка в подключении(описано выше) и он виснет в нем
либо в этом:
do
{
USART_RX_buf[pos] = receive_BYTE();
USART_RX_buf[pos]&=0x1F;
if (pos != 5)cs^=USART_RX_buf[pos];
pos++;
} while (pos<6);
//принимает не все нужные байты и виснет в цикле
Вероятность неправильного заполнеия исключена поотому, что у меня тогда загорелась бы ошибка. А он висит где-то!!!

Посмотрите, пожалуйста, код может там ошибка?
Или в схеме подключения, которую я описал?
Очень надеюсь на Вашу помощь!!!



atmega(USART)
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Здравствуйте.
Использую USART для общения 2 мег. Нужно объеденить RX и TX в одну линию.

Задача следующая:
Передача данных по USART. RX и TX объединены в одну
Есть устройство(именуемое SLAVE), которое всегда находится в режиме приема, как только данные приходят оно отправляет ответ.
Есть второе устройство(именуемое MASTER), которое всегда находится в режиме передачи, как только данные отправлены оно ожидает ответ, в качестве подтверждения.
Есть специальный протокол обмена между ними:
Из MASTER в SLAVE:

Формат пакета:

[Const1] [Data] [-Data] [Const2] [CS]

где
Const1 = 0x0F
Const2 = 0x15

Data - один байт пересылаемых данных.
-Data - инвертированный предыдущий байт.
CS - контрольная сумма, вычисляемая как сумма четырех
предыдущих байт по "исключающему ИЛИ". При всех операциях
старшие биты 5,6,7 не учитываются (обнуляются).

Команда 00, 01, 02, 03 - номер включаемого режима.
(максимально до 07, но реально будет использоваться 3 или 4).

Команда 08 - запрос текущего режима.

Ответ SLAVE:
Формат пакета

[Const3] [Data] [-Data] [Const4] [CS]

где
Const3 = 0x06
Const4 = 0x12

Data = 00, 01, 02, 03 ... 07 - текущий режим.


Примеры обменов.

MAS -> SLA SLA -> MAS
-------------- --------------
0F 00 1F 15 05 - 06 00 1F 12 0B включить! режим 0 - включен режим 0
0F 01 1E 15 05 - 06 01 1E 12 0B ... 1
0F 02 1D 15 05 - 06 02 1D 12 0B ... 2
0F 03 1C 15 05 - 06 03 1C 12 0B ... 3

0F 08 17 15 05 - 06 01 1E 12 0B какой режим включен? - включен режим 1

MASTER работает 100%. Уже было проверено с другими.

Код реализации MASTER:
// Сначала инициализация

// USART initialization
UCSR0A=0x00;
UCSR0B=0b00001000; // transmitter enable
UCSR0C=0b00000000; // 5 bit data transmit, no parity, 1 stop
UBRR0H = (unsigned char)(MYUBRR>>8);
UBRR0L = (unsigned char)MYUBRR;

//Функции обработки данных

unsigned char receive_BYTE (void)
{
// Wait until a byte has been received
while (!(UCSR0A & (1 << RXC0)));

return UDR0;
}

unsigned char receive_USART (void)
{
unsigned char cs=0;
pos=1;
do
{
USART_RX_buf[pos] = receive_BYTE();
USART_RX_buf[pos]&=0x1F;
if (pos != 5)cs^=USART_RX_buf[pos];
pos++;
} while (pos<6);
if ((USART_RX_buf[1]==0x06)&&(USART_RX_buf[4]==0x12))
{
if (cs == USART_RX_buf[5])
{
if (USART_RX_buf[3] == ((~(USART_RX_buf[2]))&0x1F))
{
UCSR0B &= ~(1<<4); //RX
DDRD &=~(1<<0);
PORTD &=~(1<<0);
UCSR0B |= (1<<3); //TX
return USART_RX_buf[2];
}
}
}
UCSR0B &= ~(1<<4); //RX
DDRD &=~(1<<0);
PORTD &=~(1<<0);
UCSR0B |= (1<<3); //TX
return 0;
}

void send_USART (unsigned char data)
{
unsigned char cs=0;
pos=1;
if (data == economS) data=0x00;
do
{
while (!(UCSR0A & (1 << UDRE0)));
// Transmit data

if (pos == 1) {UDR0 = 0x0F;cs^=0x0F;}
if (pos == 2) {UDR0 = data&0x1F; cs^=(data&0x1F);}
if (pos == 3) {UDR0 = ((~data)&0x1F); cs^=((~data)&0x1F);}
if (pos == 4) {UDR0 = 0x15;cs^=0x15;}
if (pos == 5) UDR0=cs;
while (!(UCSR0A & (1 << TXC0)));
pos++;
}while (pos<6);
UCSR0B &= ~(1<<3); //TX
DDRD &=~(1<<1);
PORTD &=~(1<<1);
UCSR0B |= (1<<4); //RX
}

Далее просто:
send_USART(mode); // отправляет команду
u_dat=receive_USART(); // приходит подтверждение

Дальше идет событие.
Сейчас проверял. Получается так как будто он зависает в режиме приема. Потому что если приходит подтверждение, то должен гореть светодиод

Заранее благодарен.
Очень надеюсь на Вашу помощь.

Соединяю MASTER со SLAVE следующим образом:
питание SLAVE- 5В
питание MASTER - 3.3В.
На линии (RX и TX) ставлю преобразователь уровня на 3.3В(резистивный делитель напряжения), подтягиваю эту линию через 11кОм к 3.3В. RX и TX у мастера соединяю через 300 Ом между собой



atmega88pa(внутренне тактирование)
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
По умолчанию устанавл. откалибр. 8 МГц.
А если мне надо 4 или 2 МГц, то я просто коэффициетом деления частоты уст. мне нужную(коэффициенты: F/2, F/4...) в регистре CLKPR?



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Ну так что?



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Файлы брелка:

Прикреплённый файл:



jpg  DSC00146.JPG (611.15 KB)
6164_4f4773847dc9e.jpg 2592X1944 px

jpg  DSC00148.JPG (646.79 KB)
6164_4f4773aaca26a.jpg 2592X1944 px



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
evildesign.
Ситуация следующая:
Заново собрал модули:блок управления и брелок. Уже со всеми как положено элементами. Изменил только толщину дорожек. Получилось так, что брелок работает, а блок управления нет!!! На нем не заводился кварц, отсутствовало напряжение на 4,5 и 6 ножек и поэтому на выходе сигнала с чипа был только один высокий уровень. Напряжение питания брелка - 3.3В, а блока управления - 5.05В. Все менял и кварц и элементы и чипы. Все равно в блоке управления не работало, а в брелке работало. Решил поменять их местами. Рабочий с брелка перестал работать на плате блока управления, и не рабочий как им был, так и остался. Так все чипы перестали работать. Заказываю еще!!! Прилагаю фотографии монтажа блока управления и брелка. Посмотрите, пожалуйста, монтаж платы! По-моему проблема там!!! Выпаивал чип при помощи вольфрамовой нити(продевал ее под ноги чипа, нагревал и дергал ее снимая с ножек олово), поскольку феном нельзя пользоваться и нет инфракрасной печи!!! Первоначальный вариант был с тонкими дорожками 0.30-0.40, а новый везде 0.40-0.55!!!
Файлы блока управления(картинки):

Прикреплённый файл:



jpg  DSC00151.JPG (543.79 KB)
6164_4f4772d0bba0b.jpg 2592X1944 px

jpg  DSC00153.JPG (563.88 KB)
6164_4f4772ff043b5.jpg 2592X1944 px



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Ладно если что будит не так, то Напишу!!!



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Я же еще у Вас спрашивал по поводу в общем применении его при 1 МГц и вообще его оптимальности?!



Re: радиочастотные устройства
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Так Вы посмотрите? Поправите или норм? В чем дело?




1 ... 6 7 8 9 10 11 12 ... 31




Разное

Интересно

Не давайте детям играть с ПДУ при работающем телевизоре.
Так как, нажимая беспорядочно кнопки, можно перевести телевизор в сервисный режим и распрограммировать его микроконтроллер с ППЗУ.