BaN 0 28 августа, 2011 Опубликовано 28 августа, 2011 · Жалоба Взял на пробу пару трансиверов RFM22B. Запустил, нормально работают. Но появился следующий вопрос: Я предполагал, что при передаче одного байта от одного модуля к другому, возникающая задержка будет все время одинакова. Но измерив эту задержку, я увидел, что она колеблется в пределах 30мкс. Измерял таймером на частоте кварца 8МГц. Два модуля соединены между собой проводом и приемник раз в секунду создает перепад на входе передатчика. По этому перепаду на передатчике возникает прерывание и отправляется один байт по радиоканалу. В это время на приемнике измеряется задержка и, по приему байта модулем, таймер останавливается и измеренное значение передается по USB. Приемник и инициатор посылки: #pragma vector = TIMER1_OVF_vect __interrupt void TIMER1_OVF(void) { counter++; if (counter == 122) // Отсчитываем 1 секунду { counter = 0; TCCR1B = 0x00; TCNT1 = 0x0000; PORTC_Bit5 ^= 1; // Создаем перепад на проводе, чтобы передатчик послал байт TCCR1B = 0x01; while (nIRQ); // Ждем, пока приемник не примет байт TCCR1B = 0x00; RFM22B_delay = TCNT1; TCCR1B = 0x01; flag_USB_TX = 1; // Переход в режим приема SPI_WRITE(0x05, 0x02); // interrupt on recieve packet SPI_WRITE(0x07, 01); // SPI_READ(0x03); //read the Interrupt Status1 register SPI_READ(0x04); SPI_WRITE(0x07, 05); while (!nIRQ); } } Передатчик: #pragma vector = PCIN1_vect __interrupt void EXT_PCINT(void) { // Переход в режим передачи SPI_READ(0x03); //read the Interrupt Status1 register SPI_READ(0x04); SPI_WRITE(0x05, 0x04); // interrupt is enable SPI_WRITE(0x7F, 0xAA);//Data_TX_RFM22B); SPI_WRITE(0x07, 9); // go to TX-mode while (!nIRQ); } В передатчике больше никакие прерывания не действуют и прерывания не запрещаются. Настройки модуля: SPI_WRITE(0x06, 0x00); // interrupt all disable SPI_WRITE(0x07, 01); // to ready mode SPI_WRITE(0x09, 0x7f); // cap = 12.5pf SPI_WRITE(0x0a, 0x05); //clk output is 2MHz SPI_WRITE(0x0C, 0x18); // GPIO Configuration 0. SPI_WRITE(0x0B, 0x17); // GPIO Configuration 1. SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output SPI_WRITE(0x0e, 0x00); //GPIO port use default value SPI_WRITE(0x0f, 0x70); // NO ADC used SPI_WRITE(0x10, 0x00); //no adc used SPI_WRITE(0x12, 0x00); // no temperature sensor used SPI_WRITE(0x13, 0x00); // no temperature sensor used SPI_WRITE(0x70, 0x00); // no mancheset code, no data whiting, data rate > 30Kbps SPI_WRITE(0x1c, 0x04); // IF filter bandwidth SPI_WRITE(0x1d, 0x40); // AFC LOOP SPI_WRITE(0x1e, 0x08); //AFC timing SPI_WRITE(0x20, 0x64); //clock recovery SPI_WRITE(0x21, 0x01); //clock recovery SPI_WRITE(0x22, 0x47); //clock recovery SPI_WRITE(0x23, 0xAE); //clock recovery SPI_WRITE(0x24, 0x00); //clock recovery timing SPI_WRITE(0x25, 0x06); //clock recovery timing SPI_WRITE(0x6e, 0x0A); // Tx data rate 1 SPI_WRITE(0x6f, 0x3D); // Tx data rate 0 SPI_WRITE(0x30, 0x8c); // data access control SPI_WRITE(0x32, 0xff); // header control SPI_WRITE(0x33, 0x42);// // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2, SPI_WRITE(0x34, 0x10); // 16 nibble = 8byte preamble SPI_WRITE(0x35, 0x30); //0x35 need to detect 24bit preamble SPI_WRITE(0x36, 0x2d); // synchronize word SPI_WRITE(0x37, 0xd4); SPI_WRITE(0x38, 0x00); SPI_WRITE(0x39, 0x00); SPI_WRITE(0x3a, 's'); SPI_WRITE(0x3b, 'o'); SPI_WRITE(0x3c, 'n'); SPI_WRITE(0x3d, 'g'); SPI_WRITE(0x3e, 1); // total tx 1 byte SPI_WRITE(0x3f, 's'); SPI_WRITE(0x40, 'o'); SPI_WRITE(0x41, 'n'); SPI_WRITE(0x42, 'g'); SPI_WRITE(0x43, 0xff); // all the bit to be checked SPI_WRITE(0x44, 0xff); // all the bit to be checked SPI_WRITE(0x45, 0xff); // all the bit to be checked SPI_WRITE(0x46, 0xff); // all the bit to be checked SPI_WRITE(0x6d, 0x07); // tx power to max SPI_WRITE(0x79, 0x0); // no frequency hopping SPI_WRITE(0x7a, 0x0); // no frequency hopping SPI_WRITE(0x71, 0x22); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625 SPI_WRITE(0x73, 0x0); // no frequency offset SPI_WRITE(0x74, 0x0); // no frequency offset SPI_WRITE(0x75, 0x53); // frequency set to 434MHz SPI_WRITE(0x76, 0x64); // frequency set to 434MHz SPI_WRITE(0x77, 0x00);// frequency set to 434MHz SPI_WRITE(0x08, 0x03); // fifo reset SPI_WRITE(0x08, 0x00); Чем может быть вызвана эта задержка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ilnur888 0 16 сентября, 2011 Опубликовано 16 сентября, 2011 · Жалоба BaN, может быть это происходит из-за каких-нибудь помех? У меня к тебе вопрос такой, с какой МК работает радиомодуль? Я вообще сколько пытаюсь вообще что-либо передать - неполучается, наверное весь даташит выучил . BaN, ты не мог бы поделиться исходниками, пожалуйста? Или может я тебе свои например скину (на CVAVR), ты не смог бы взглянуть что не так? Незнаю к кому обратится, помоги пожалуйста. Если что пиши сюда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться