Написал программу, спаял в железе: 2 атмеги8 общаются по UART по проводам, на одной атмеге матричная клавиатура, на второй жк 2х16, нажимаем кнопку на клаве- на жк выводится цифра соответствующей клавиши. по проводам всё работает, припаяли RF модули 423, или 433 мГц не помню, (плата щас не у меня), (RF купили в промэлектронике). Пока клавишу не нажимаем, всё тихо, когда нажимаем клавишу, прилетает всякий мусор из набора случайных чисел. В чём может быть дело, помогите пожалуйста кто знает чего нибудь по этому поводу.
Просто уартом модулировать радиомодули не проканает. Нужно что-то типа манчестера. Постоянная составляющая выходного сигнала портит всю картину. Хотя возможны некоторые ситуации, при которых передача пройдет почти правильно, если не забыли про инверсию/неинверсию сигналов при прохождении через сами модули. Но закладываться на это не стоит. Нужно менять модуляцию.
Ну что такое манчестерский код немного посмотрел, понял, что нужно разбивать каждый передаваемый бит на 2 части, программно реализовать можно, вот только ресурсов у мк хватит лишь на то, чтобы выполнять только ранее перечисленные действия, а это лишь эксперимент на пути создания системы в которой центральный прибор (например на атмеге 16, 32...) будет по УАРТ-Радиоканалу опрашивать периферийные(на атмеге8, а лучше на еще более дешёвом), которые по 1-wire, или с помощью АЦП получают информацию от датчиков (температура, задымлённость, влажность и т.д.) и по этому же каналу центральный прибор управляет исполнительными блоками (реле). Делаем систему "Умный дом". Может есть дешёвые средства аппаратной реализации этого дела (манчестерский код). Дело в том, что сам я закончил электрофак и мк знаю всего полтора года в программировании самоучка, в целом представляю, в тонкости не вдаюсь, программы писать научился в CVAVR поэтому объясните попроще пожалуйста.
Я конечно извиняюсь, но похоже Вы заблуждаетесь. Нету там поддержки RS-232. http://www.promelec.ru/UPLOAD/xml/pdfba ... A_SAW(full).pdf Поскольку отсутствует кодер-декодер оного. Об кодировании-декодировании, боюсь придется заботиться самому. Если используете предложенный производителем метод кодирования, скорость будет не выше 2400.
Дык, ведь там же чистейшим аглицким языком да черным по белому написано:
For intermittent signals consisting of single words or short strings of words with a relatively long no-signal time, this method of generating a digital output is entirely adequate. However, it can cause problems when the long-term mark/space ratio of the received signal moves too far away from unity. When faced with long strings of non-encoded RS-232 words containing only 0s or 1s as data bits, the mean detector output voltage stored on C will change, as the RC time-constant of around 10ms is not infinite. If the string is long enough, detection errors will eventually occur. This problem can occur whenever AC amplification is used when processing non encoded RS-232 data. There is a way around this problem using Manchester encoding, which will be described later.
Об чем я и раньше говорил. Могут быть ситуации, когда оно передастся почти без ошибок. но закладываться на это не стоит. И ситуации эти будут тем чаще, чем передаваемый сигнал ближе к 0x55 или 0xAA. Чем больше данные будут отличаться от указанных - тем выше вероятность ошибок! Я уже не говорю об 0x00 и 0xFF. Раньше нужно было знакомиться с покупкой. Теперь придется ломать голову над методами кодирования.
а то на форумах и хорошее и плохое пишут, сам баги паял на 90-108 МГц , настраивал с помощью осциллографа (благо был таковой под руками, FLUK вроде), а это чудо 400 с лишним, а осциллографа под руками нет вобще никакого не то чтобы на 400-500, вот и сомневаюсь в надежности, простоте настройки и пр. о чём там написано.
а что думаете вот об этой штуке пойдёт для вышеперечисленных целей или нет
Но это же стандартный радиомодуль скопированный из даташита и сделанный на рассыпухе во времена их дефицита. Сейчас то зачем этим заниматься? Да и не так просто их сделать, как кажется. Вот в этой теме бились над неизвестным модулем, т.к. не нашли даташита который в конце концов оказался как раз такой, что Вы на рассыпухе собрались делать.
в общем хрен с ними с купленными радиомодулями может ктонибудь посоветовать уже проверенные радиомодули работающие c UART на скоростях 1200-9600 без всяких манчестерских кодов, или такого в природе нет?
в общем хрен с ними с купленными радиомодулями может ктонибудь посоветовать уже проверенные радиомодули работающие c UART на скоростях 1200-9600 без всяких манчестерских кодов, или такого в природе нет?
Такие есть, но стоит соответственно (один модуль от 29Евро со скоростью до 11500). Про манчетерский код не знаю, но использую кодировку хемминга. Ничего сложного в нем нет. правда передача и прием всех данных проводится дважды. Если интресно, могу поделиться кусками кода.
Из-за громоздкости этих модулей (да и стоимости тоже), использую модули fm12. Это аналоги SI4420. Кода на них в сети море, но правда есть еще и, уже известные, заморочки. Стоимость в России от 7 дол. Правда обмен ведется по SPI. Эти модули уже протестировал, передают стабильно.
Эти два массива служат для кодирования и декодирования данных. Какой из них для каких целей - догадайтесь сами. Лучше, конечно их разместить во флэше, но тут что то много любителей CV, а там вроде другая система декларирования.
Функция отправки.
Код:
void rf12_txdata(unsigned char * data, unsigned char number) { unsigned char i, checksum; LED_TX=1; rf12_trans(0x8238); // TX on rf12_ready(); rf12_trans(0xB8AA); //5 байт синхронизации. АА - за счет чередования нулей и единиц помогает приемнику "тактироваться" в переданном пакете rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0xB82D); rf12_ready(); rf12_trans(0xB8D4); rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[number/16]))); // передается размер буфера данных rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[number&15]))); if (number<=_MAX_BUF) // если это подтверждение получения, то данных отправлять не нужно { checksum=id; rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[id/16]))); // Paket ID rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[id&15]))); for (i=0; i<number; i++) { rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[*data/16]))); //каждый байт кодируется и посылается 2 раза. один так rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[*data&15]))); //второй раз так checksum+=*data; data++; } } else { checksum=number; } checksum=256-checksum; rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[checksum/16]))); // Контрольная сумма для проверки rf12_ready(); rf12_trans(0xB800|(pgm_read_byte(&hamminge[checksum&15]))); rf12_ready(); rf12_trans(0xB800); // dummy data rf12_ready(); rf12_trans(0x8208); // TX off LED_TX=0; }
теперь прием:
Код:
unsigned char rf12_rxdata(unsigned char *data, unsigned char *id) { unsigned char i, number,checksum; LED_RX=1; rf12_ready(); number =(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])*16); // Размер переданного буфера rf12_ready(); number|=(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])); if (number>_MAX_BUF) // Если это не подтверждение, то { rf12_ready(); *data[b] =[/b](pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])*16); //прием первого байта rf12_ready(); *data[b]|=[/b](pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])); //прием второго байта rf12_trans(0xCA81); // restart syncword detection: rf12_trans(0xCA83); // enable FIFO LED_RX=0; return number; } rf12_ready(); *id =(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])*16); // Paket ID rf12_ready(); *id|=(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])); checksum=*id; for (i=0; i<number; i++) { rf12_ready(); *data =(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])*16); rf12_ready(); *data|=(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])); checksum+=*data; data++; } rf12_ready(); i=(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])*16); // Контрольная сумма rf12_ready(); i|=(pgm_read_byte(&hammingd[rf12_trans(0xB000)&255])); checksum+=i; rf12_trans(0xCA81); // restart syncword detection: rf12_trans(0xCA83); // enable FIFO LED_RX=0; if (checksum) return 255; // checksum error else return number; // data ok }
хардварные функции rf12_xxxx могут быть различной реализации. Поэтому смысла не вижу их приводить. В rfmXX работа ведется по SPI, поэтому первым байтом в слове идет команда, вторым данные. Естественно, кто будет это применять к UART, должны это учитывать и просто выкинуть байт команды.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения