Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Всем спасибо!!! Но проблему я решил.
Просто надо было расставить заданной величины задержки в нужных местах и вуаля!!!)))
Отправлено: 25.06.2012 9:50
|
|
Главный Технолог
Зарегистрирован:
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); //принимает не все нужные байты и виснет в цикле Вероятность неправильного заполнеия исключена поотому, что у меня тогда загорелась бы ошибка. А он висит где-то!!! Посмотрите, пожалуйста, код может там ошибка? Или в схеме подключения, которую я описал? Очень надеюсь на Вашу помощь!!!
Отправлено: 21.06.2012 8:47
|
|
Главный Технолог
Зарегистрирован:
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 Ом между собой
Отправлено: 20.06.2012 23:24
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
По умолчанию устанавл. откалибр. 8 МГц.
А если мне надо 4 или 2 МГц, то я просто коэффициетом деления частоты уст. мне нужную(коэффициенты: F/2, F/4...) в регистре CLKPR?
Отправлено: 02.03.2012 7:03
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Ну так что?
Отправлено: 24.02.2012 20:37
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Файлы брелка:
Прикреплённый файл: DSC00146.JPG (611.15 KB) DSC00148.JPG (646.79 KB)
Отправлено: 24.02.2012 15:25
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
evildesign.
Ситуация следующая: Заново собрал модули:блок управления и брелок. Уже со всеми как положено элементами. Изменил только толщину дорожек. Получилось так, что брелок работает, а блок управления нет!!! На нем не заводился кварц, отсутствовало напряжение на 4,5 и 6 ножек и поэтому на выходе сигнала с чипа был только один высокий уровень. Напряжение питания брелка - 3.3В, а блока управления - 5.05В. Все менял и кварц и элементы и чипы. Все равно в блоке управления не работало, а в брелке работало. Решил поменять их местами. Рабочий с брелка перестал работать на плате блока управления, и не рабочий как им был, так и остался. Так все чипы перестали работать. Заказываю еще!!! Прилагаю фотографии монтажа блока управления и брелка. Посмотрите, пожалуйста, монтаж платы! По-моему проблема там!!! Выпаивал чип при помощи вольфрамовой нити(продевал ее под ноги чипа, нагревал и дергал ее снимая с ножек олово), поскольку феном нельзя пользоваться и нет инфракрасной печи!!! Первоначальный вариант был с тонкими дорожками 0.30-0.40, а новый везде 0.40-0.55!!! Файлы блока управления(картинки): Прикреплённый файл: DSC00151.JPG (543.79 KB) DSC00153.JPG (563.88 KB)
Отправлено: 24.02.2012 15:23
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Ладно если что будит не так, то Напишу!!!
Отправлено: 11.02.2012 21:02
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Я же еще у Вас спрашивал по поводу в общем применении его при 1 МГц и вообще его оптимальности?!
Отправлено: 11.02.2012 20:23
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Так Вы посмотрите? Поправите или норм? В чем дело?
Отправлено: 11.02.2012 20:18
|
|