Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь. |
26.04.2013, 09:48
|
#611
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Сообщение от niXto
|
С чего вы взяли, что скачет? Какую установлю командами, такая и будет. Только если кварц поплывет...
Чип заточен под 50 Ом, то есть под 1/4. У 5/8 если не ошибаюсь, 75 Ом, без балуна хорошо работать не будет
|
Ну да. У меня опыта ноль на этих частотах, но на метровых и дециметровых балун не сложен - катушка согласования. Наверное и здесь что-то подобное пройдет.
Насчет "скачет" - вы же сами сказали "какую установлю". ![Улыбка](images/smilies/icon_smile.gif) Разве это не "скачет", подстраивать не придется? Или полоса антенны такая, что эти скачки в нее укладываются? Я не знаю.
__________________
С уважением,
Vic / ut1wpr
Последний раз редактировалось ut1wpr; 26.04.2013 в 09:51.
|
|
|
|
26.04.2013, 12:00
|
#612
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Частота задается цифровым способом - записью в специальный регистр определенного числа. У меня трансиверы работают на одной частоте, т.е. в этот регистр записывается одно и то же число, и "скачет" она максимум на 100...200 кГц, иначе трансиверы просто не увидят друг друга
Балун конечно пройдет, но много нюансов, например, лишний 1 см дорожки - это уже 1/12 длины волны, т.е. фактически паразитная индуктивность - нужен сверхплотный монтаж на сверхминиатюрных деталях, чтобы окончательно не угробить параметры... Есть пьезокерамические балуны, но они тоже заточены под выходные 50 Ом
|
|
|
|
28.04.2013, 20:42
|
#613
|
Частый гость
Регистрация: 17.06.2010
Сообщений: 40
Сказал спасибо: 28
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Итак, "И снова здравствуйте!". В общем,мудохаюсь с этими модулями вторую неделю. Библиотека Tinkerer прекрасно работала,но только до первого обрыв связи. FLUSH_TX посылается по дефолту в mirf_send(),так что этот вариант отпадает. Решил использовать простой и дубовый жизненный принцип:"мне пофиг на всех,я апельсин". смысл в том,что никаких ACK'ов, интерраптов и прочей ненужной фигни. Отрубил я ACK,отрубил прерывания, ну вы поняли. Испытал-вроде бы все классно. Однако, в рандомный момент передача может сдохнуть напрочь. Ладно,не в первой. Цепляю светодиоды на вывод меги и смотрю исполнение программы. Опытным путем установлено,что передача сдыхает на функции mirf_send(). То есть,МК в неё входит и все,приплыли,из неё уже не выбирается. Это что за прикол,интересно?))))Вот код:
Код меги,которая на UART:
Код:
|
#include "CPU_settings.h"
#include "makros.h"
#include "nrf24l01_register.h"
#include "UART.h"
#include "nrf24l01_function.h"
unsigned char rx_buffer[mirf_PAYLOAD];
unsigned char tx_buffer[mirf_PAYLOAD];
unsigned char trans=0;
unsigned char rec=0;
int main( void )
{
UART_init();
mirf_init();
delay_ms(1000);
mirf_config();
delay_ms(50);
__enable_interrupt();
for(unsigned char i=0;i‹mirf_PAYLOAD;i++)
{
tx_buffer[i]=0;
rx_buffer[i]=0;
}
while(1)
{
while(!mirf_data_ready());
mirf_get_data(rx_buffer);
SB(UCSRB,UDRIE);
delay_ms(3);
mirf_send(tx_buffer,mirf_PAYLOAD);
delay_ms(1);
RX_POWERUP;
mirf_config_register(STATUS,((1‹‹TX_DS)|(1‹‹MAX_RT)));
delay_ms(1);
}
}
#pragma vector=USART_UDRE_vect
__interrupt void Uart_UDRE(void)
{
UDR=rx_buffer[trans];
trans++;
if(trans==mirf_PAYLOAD)
{
CB(UCSRB,UDRIE);
for(char i=0;i‹mirf_PAYLOAD;i++)
rx_buffer[i]=0;
trans=0;
}
}
#pragma vector=USART_RXC_vect
__interrupt void Uart_RX(void)
{
tx_buffer[rec]=UDR;
rec++;
if(rec==mirf_PAYLOAD)
rec=0;
} |
Часть кода меги,которая на роботе:
Код:
|
receive[0]=0;
receive[1]=15;
mirf_send(tranceive,mirf_PAYLOAD);
DDRD_Bit1=1;
PORTD_Bit1=1;
delay_ms(1);
RX_POWERUP;
mirf_config_register(STATUS,(1‹‹TX_DS)|(1‹‹MAX_RT)); // Reset status register
mirf_over=0;
while(mirf_data_ready()==0)
{
delay_ms(1);
mirf_over++;
if(mirf_over›20)
{
mirf_avaria=1;
DDRD_Bit0=1;
PORTD_Bit0=1;
break;
}
}
if(!mirf_avaria)
{
DDRD_Bit0=1;
PORTD_Bit0=0;
mirf_avaria=0;
mirf_get_data(receive);
switch(receive[0])
{
case 0:{brake(); break;}
case 1:{back_forward();break;}
case 2:{back_back();break;}
case 3:{brake();break;}
case 4:{back_brake_and_turn_left();break;}
case 5:{back_forward_and_turn_left();break;}
case 6:{back_back_and_turn_left();break;}
case 7:{brake();break;}
case 8:{back_brake_and_turn_right(); break;}
case 9:{back_forward_and_turn_right();break;}
case 10:{back_back_and_turn_right();break;}
case 11:{brake();break;}
case 12:{brake();break;}
case 13:{brake();break;}
case 14:{brake();break;}
case 15:{brake();break;}
}
if((receive[0]!=0)&&(receive[0]!=3)&&(receive[0]!=4)&&(receive[0]!=7)&&(receive[0]!=8)&&(receive[0]!=11)&&(receive[0]!=12)&&(receive[0]!=13)&&(receive[0]!=14)&&(receive[0]!=15))
engine_power=receive[1];
}
else
{
mirf_avaria=0;
brake();
}
tranceive_array_full();
delay_ms(period_interview);
DDRD_Bit1=1;
PORTD_Bit1=0; |
Инициализация и измененные функции библиотеки:
Код:
|
#define mirf_CH 2
#define mirf_PAYLOAD 16
#define mirf_CONFIG ( (1‹‹MASK_RX_DR) | (1‹‹EN_CRC) | (0‹‹CRCO) )
#define CE 0
#define CSN 1
#define mirf_CSN_hi PORTB |= (1‹‹CSN);
#define mirf_CSN_lo PORTB &= ~(1‹‹CSN);
#define mirf_CE_hi PORTB |= (1‹‹CE);
#define mirf_CE_lo PORTB &= ~(1‹‹CE);
#define TX_POWERUP mirf_config_register(CONFIG, mirf_CONFIG | ( (1‹‹PWR_UP) | (0‹‹PRIM_RX) ) )
#define RX_POWERUP mirf_config_register(CONFIG, mirf_CONFIG | ( (1‹‹PWR_UP) | (1‹‹PRIM_RX) ) )
void mirf_init();
void mirf_config();
void mirf_set_RADDR(unsigned char * adr);
void mirf_set_TADDR(unsigned char * adr);
unsigned char mirf_data_ready();
void mirf_get_data(unsigned char * data);
void mirf_config_register(unsigned char reg, unsigned char value);
void mirf_read_register(unsigned char reg, unsigned char * value, unsigned char len);
void mirf_write_register(unsigned char reg, unsigned char * value, unsigned char len);
void mirf_send(unsigned char * value, unsigned char len);
unsigned char TX_ADDRESS[5]={0xE7,0x2A,0xB4,0xCA,0xBA};
unsigned char RX_ADDRESS[5]={0xE7,0x2A,0xB4,0xCA,0xBA};
unsigned char mirf_avaria=0;
void mirf_init()
{
DDRB |= ((1‹‹CSN)|(1‹‹CE));
mirf_CE_lo;
mirf_CSN_hi;
spi_init();
}
void mirf_config()
{
mirf_config_register(RF_CH,mirf_CH);
mirf_config_register(RX_PW_P0, mirf_PAYLOAD);//Объем буфера 10 байт
mirf_config_register(CONFIG,((1‹‹MASK_RX_DR)|(1‹‹EN_CRC)|(1‹‹CRCO)));//Включить прерывание по передаче пакета,по превышению кол-ва попыток передачи,включить CRC
mirf_config_register(RF_SETUP,(1‹‹1)|(1‹‹2)|(1‹‹5));//Мощность 0dBm
mirf_config_register(EN_AA,~(1‹‹ENAA_P2));
mirf_set_TADDR(TX_ADDRESS);
mirf_set_RADDR(RX_ADDRESS);
// Start receiver
RX_POWERUP; // Power up in receiving mode
mirf_CE_hi; // Listening for pakets
}
void mirf_set_RADDR(unsigned char * adr)
{
mirf_CE_lo;
mirf_write_register(RX_ADDR_P0,adr,5);
mirf_CE_hi;
}
void mirf_set_TADDR(unsigned char * adr)
{
mirf_write_register(TX_ADDR, adr,5);
}
unsigned char mirf_data_ready()
{
unsigned char status;
// Read MiRF status
mirf_CSN_lo; // Pull down chip select
status = spi_fast_shift(NOP); // Read status register
mirf_CSN_hi; // Pull up chip select
return status & (1‹‹RX_DR);
}
void mirf_get_data(unsigned char * data)
{
mirf_CSN_lo; // Pull down chip select
spi_fast_shift( R_RX_PAYLOAD ); // Send cmd to read rx payload
spi_transfer_sync(data,data,mirf_PAYLOAD); // Read payload
mirf_CSN_hi; // Pull up chip select
mirf_config_register(STATUS,(1‹‹RX_DR)); // Reset status register
}
void mirf_config_register(unsigned char reg, unsigned char value)
{
mirf_CSN_lo;
spi_fast_shift(W_REGISTER | (REGISTER_MASK & reg));
spi_fast_shift(value);
mirf_CSN_hi;
}
void mirf_read_register(unsigned char reg, unsigned char * value, unsigned char len)
{
mirf_CSN_lo;
spi_fast_shift(R_REGISTER | (REGISTER_MASK & reg));
spi_transfer_sync(value,value,len);
mirf_CSN_hi;
}
void mirf_write_register(unsigned char reg, unsigned char * value, unsigned char len)
{
mirf_CSN_lo;
spi_fast_shift(W_REGISTER | (REGISTER_MASK & reg));
spi_transmit_sync(value,len);
mirf_CSN_hi;
}
void mirf_send(unsigned char * value, unsigned char len)
{
mirf_CE_lo;
TX_POWERUP; // Power up
mirf_CSN_lo; // Pull down chip select
spi_fast_shift( FLUSH_TX ); // Write cmd to flush tx fifo
mirf_CSN_hi; // Pull up chip select
mirf_CSN_lo; // Pull down chip select
spi_fast_shift( W_TX_PAYLOAD ); // Write cmd to write payload
spi_transmit_sync(value,len); // Write payload
mirf_CSN_hi; // Pull up chip select
mirf_CE_hi;
} |
|
|
|
|
28.04.2013, 21:03
|
#614
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Команды FLUSH нельзя подавать когда буфер пустой - у меня на старых чипах (2010 год) это с вероятностью примерно 1/1000 приводило к зависанию намертво до перетыкания питания. Можно подавать только когда в буфере что-то есть. Я это уже второй раз повторяю тебе, и раз 10 - в этой теме
|
|
|
|
28.04.2013, 21:06
|
#615
|
Частый гость
Регистрация: 17.06.2010
Сообщений: 40
Сказал спасибо: 28
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Спасибо))))Так,модули у меня nrf24l01+. Но ведь в библиотеке Tinkerer FLUST_TX подавался,даже если буфер пуст.....Причем,судя по всему,зависает МК...Хм,значит,придется копать ещё глубже....
Последний раз редактировалось Pika4u56; 28.04.2013 в 21:10.
|
|
|
|
28.04.2013, 21:29
|
#616
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Копайся в контроллере... л01+ - это л01Р, скачай даташит на Р-шку, хотя отличий мало
|
|
|
|
29.04.2013, 08:46
|
#617
|
Частый гость
Регистрация: 17.06.2010
Сообщений: 40
Сказал спасибо: 28
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Даташит уже скачал....Зависает,я думаю,только в.одном месте- когда ждет установки бита SPIF. Больше,как бы негде. Получается,при подаче FLUSH_TX нрф просто перестает отвечать?)
|
|
|
|
29.04.2013, 10:03
|
#618
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Примерно так, подробно не разбирался. Если не пытаться очистить пустой буфер - работает очень надежно, здесь http://forum.ixbt.com/topic.cgi?id=48:10609 без зависаний и перезагрузок работает с августа прошлого года, порядка 200 нажатий в сутки, то есть минимум 20.000 пакетов было отправлено. Это кстати говорит и об экономичности трансивера - батарейка CR2032 стоит ещё родная
|
|
|
|
29.04.2013, 10:46
|
#619
|
Частый гость
Регистрация: 17.06.2010
Сообщений: 40
Сказал спасибо: 28
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
ХМ,за ссылку спасибо)))Сейчас понаставил delay_ms,перед каждой передачей стал заново настраивать трансивер-пока что полет нормальный)
|
|
|
|
29.04.2013, 11:03
|
#620
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
У меня 86000 пакетов за сутки уходит и работает уже пол года на 2032 и не самом экономичном STM8S103. Еще был вариант на PIC12 с софтовым SPI. Тот уже полтора года работает.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:56.
|
|