Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
А не отговаривать меня от данной задачи, например 1-WIRE.
Отправлено: 28.06.2012 10:24
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Да сделал бы с удовольствием. Если бы я имел программу от этих долбанных китайских игрушках!!! И Вы знаете у них все работает. Но только пульт у них за отдельную цену и по цене практически самого изделия. Вот и встал вопрос самим делать и продавать по цене изделия, но с пультом!!!
Протокол это их. Изврат полный!!! Можно было бы простыми командами обойтись!!! Вот и мучаюсь. Не только из-за того, что надо и для опыта, но из-за того, что за державу обидно, что смеются они над нами!!! У них все получается делать в сегменте LOW-COST, а у нас нет!!! Поэтому если есть у кого желание, то прошу, пожалуйста, помочь победить долбанных китайцев!
Отправлено: 28.06.2012 10:22
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Имеется ввиду объединять RX и TX?
Если да, то из-за сложности конструкции готового изделия - придется паять тогда провода на каждую ножку(к управляемому изделию) с пульта управления. А так просто сверху наложил на 2 ножки и все. А их много и переделывать фирма ничего не будит. Поэтому и приходится так мудрить!
Отправлено: 27.06.2012 20:52
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Ну тогда подскажи, пожалуйста, как это правильно решить, но только без преобр. ур. от TI(74LVCxx)?
кстати опять интересный момент, увеличил задержки и вроде пока все работает, но только пока ПК, дальше буду испытывать на самомо устройстве. Но вопрос по поводу схемы все равно открыт? Может и правда лучше преобр. ур. от TI? И вообще как лучше сделать эту схему?
Отправлено: 27.06.2012 17:16
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Так на схеме же показано. Сразу после SLAVE. Напряжение на линии преобр в 3.3В, потом подтяжка, а потом уже 300 Ом.
Получается, что из-за подтяжки в момент передачи может быть КЗ?
Отправлено: 27.06.2012 12:05
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Я вот думаю может только подтяжка лишняя и в коде проблема. Вот и обратился.
Что может я что-то не сбрасываю или дамми байт где-то не отправил.
Отправлено: 27.06.2012 11:18
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
так а резисторы для чего???
Делитель напряжения из 2 резисторов. Там и там напряжение постоянное(5 и 3.3в)!!! Поэтому имею полное право обойтись делителем вместо 74LVC(преобр. ур. от TI). Далее после делителя следует подтяжка к 3.3В через (не 20к, а 10кОм) - потому что неактивная ножка(RX или TX) в Z состоянии и правильно задать MARK и SPACE в протоколе USART. Резистор 300 ОМ - токоограничивающий для RX Ну и геде косяк??????????????????????? Еще замечания будут???????????????????
Отправлено: 27.06.2012 11:16
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
А что в железе то не так?
Отправлено: 27.06.2012 11:05
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
А как правильно тогда? Подскажите, пожалуйста.
Да кстати в код добавил щас перед отправкой данных еще 3 дамми байта. И изменил обработку приема. Пока еще не тестировал. А так еще есть идеи по поводу кода? Вот код: void send_USART (unsigned char data) { unsigned char cs=0; UCSR0B &= ~(1<<4); //RX DDRD &=~(1<<0); PORTD &=~(1<<0); UCSR0B |= (1<<3); //TX //_delay_ms(5); pos=1; if (data == economS) data=0x00; do //for(pos=1;pos<6;pos++) { while (!(UCSR0A & (1 << UDRE0))); // Transmit data if (pos == 1) UDR0=0xAA; if (pos == 2) UDR0=0xAA; if (pos == 3) UDR0=0xAA; if (pos == 4) {UDR0 = 0x0F;cs^=0x0F;} if (pos == 5) {UDR0 = data&0x1F; cs^=(data&0x1F);} if (pos == 6) {UDR0 = ((~data)&0x1F); cs^=((~data)&0x1F);} if (pos == 7) {UDR0 = 0x15;cs^=0x15;} if (pos == 8) UDR0=cs; while (!(UCSR0A & (1 << TXC0))); pos++; }while (pos<9); } unsigned char receive_USART (void) { unsigned char cs=0; UCSR0B &= ~(1<<3); //TX DDRD &=~(1<<1); PORTD &=~(1<<1); UCSR0B |= (1<<4); //RX //_delay_ms(5); pos=1; do //for(pos=1;pos<6;pos++) { USART_RX_buf[pos] = receive_BYTE(); USART_RX_buf[pos]&=0x1F; if (pos != 5)cs^=USART_RX_buf[pos]; if (USART_RX_buf[1]==0x06) pos++; else {cs=0x00; pos=1;} if (pos == 2) pos++; if (USART_RX_buf[3] == ((~(USART_RX_buf[2]))&0x1F)) pos++; else {cs=0x00;break;} if (USART_RX_buf[4]==0x12) pos++; else {cs=0x00;break;} if (cs == USART_RX_buf[5]) {pos++; return USART_RX_buf[2];} // pos++; } while (pos<6); return 0xFF; }
Отправлено: 27.06.2012 10:43
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
зарабатоло, но почему-то только один раз попробовал перепрошить и опять перестало. По компьютеру смотрел - отправляет правильно и правильно принимает(смотрел на дисплее), одновременно не получится посмотреть, потому что HYPER TERMINAL и компьютер порт не смогут обработать объединенные 2 линии(RX&TX) в одну.
Обрабаатываю не по прерыванию. Скорость 4800, 5 бит, 1 стоп, без контроля четности. Среда разработки AVR STUDIO 4. Сначала отправляю данные потом жду подтверждения. Оно приходит(вижу на дисплее).И почему то он снова возвращается в начало(снова отправляет) - хотя цикла нет. И вот пример: if (programming_mode) { send_USART(sportS); //sport _delay_ms(5); temp=receive_USART(); USART_RX_buf[2]=0x00; _delay_ms(5); if (temp == sportS) // if sport { _delay_ms(5); prepare_send(sport_send); } } Последней команды: prepare_send(sport_send); - не происходит, почему то после правильного принятия данных(receive_USART) обратно возвращается в начало условия(if programming). Функции такие же как описаны выше, только задержки Вот схема: посмотрите, пожалуйста, может дело как я думаю в коде или оптимизации. Надеюсь на Вашу помощь! Прикреплённый файл: 1.JPG (240.63 KB)
Отправлено: 27.06.2012 8:25
|
|