собрал передатчик по схеме и прошивке от MiklSh.
заработала сразу, только одна проблема - видимо наводки вызывают прерывание от кнопок SA1-SA2 как только подношу руку к девайсу. если отключаю режим "sleep" то всё работает четко. что делать ?
edisson писал(а):всем доброе время суток .
собрал передатчик по схеме и прошивке от MiklSh.
заработала сразу, только одна проблема - видимо наводки вызывают прерывание от кнопок SA1-SA2 как только подношу руку к девайсу. если отключаю режим "sleep" то всё работает четко. что делать ?
Код: Выделить всё
MCUCR=0b11110000;
#asm("sleep");
Код: Выделить всё
MCUCR=0b01110000;
#asm("sleep");
Код: Выделить всё
if (SA1==0)
{ RF2_Init();
data [0]=0xA0; data [1]=0xA1; data [2]=0xA2; data [3]=0xA3; data [4]=0xA4; data [5]=0xA5; data [6]=0xA6; data [7]=0xA7;
rf02_txdata(data);
VD=1; delay_ms(10); VD=0;
rf02_txdata(data); delay_ms(1);
-------------------------------------------------------------------------Код: Выделить всё
if (SA2==0)
{ RF2_Init();
data [0]=0xB0; data [1]=0xB1; data [2]=0xB2; data [3]=0xB3; data [4]=0xB4; data [5]=0xB5; data [6]=0xB6; data [7]=0xB7;
rf02_txdata(data);
VD=1; delay_ms(10); VD=0; delay_ms(30); VD=1; delay_ms(10); VD=0;
rf02_txdata(data); delay_ms(1);
Код: Выделить всё
Chip type : ATtiny2313
Clock frequency : 4,000000 MHz
Memory model : TinyAI_Disable писал(а):Код для работы с RFM12. Проверено с мегой32, тини24, тини2313.
Приём:Передача:Код: Выделить всё
#define DDR_SS DDRD #define DDR_SCK DDRC #define DDR_MOSI DDRD #define PORT_SS PORTD #define PORT_SCK PORTC #define PORT_MOSI PORTD #define PIN_MISO PINC #define PIN_IRQ PIND #define SS 6 #define SCK 0 #define MOSI 7 #define MISO 1 #define IRQ 2 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned int RFXX_WRT_CMD(unsigned int aCmd) //Отправить команду { unsigned char i; unsigned int temp=0; PORT_SCK&=~(1<<SCK); PORT_SS&=~(1<<SS); for(i=0;i<16;i++) { if(aCmd&0x8000) PORT_MOSI|=(1<<MOSI); else PORT_MOSI&=~(1<<MOSI); PORT_SCK|=(1<<SCK); temp<<=1; if(PIN_MISO&(1<<MISO)) temp|=0x0001; PORT_SCK&=~(1<<SCK); aCmd<<=1; } PORT_SS|=(1<<SS); return(temp); } void RF12_INIT(void) //Инициализация { DDR_SS|=(1<<SS); DDR_SCK|=(1<<SCK); DDR_MOSI|=(1<<MOSI); PORT_SS|=(1<<SS); RFXX_WRT_CMD(0x80D8);//EL,EF,433band,12.5pF RFXX_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC RFXX_WRT_CMD(0xA640);//A140=430.8MHz RFXX_WRT_CMD(0xC647);//4.8kbps RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4 RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT RFXX_WRT_CMD(0xE000);//NOT USE RFXX_WRT_CMD(0xC800);//NOT USE RFXX_WRT_CMD(0xC040);//1.66MHz,2.2V } int main () { //Внешнее прерывание от INT0, к которому цепляем nIRQ MCUCR|=(1<<ISC01); GICR|=(1<<INT0); sei(); //Инициализация FRM12 RF12_INIT(); //Включаем fifo буфер и читаем статус регистр RFXX_WRT_CMD(0xCA83); RFXX_WRT_CMD(0x0000); } ISR(INT0_vect) //обработчик внешнего прерывания { //тут хаваем данные с RFM12 data=((RFXX_WRT_CMD(0xB000))&0x00FF); }Код: Выделить всё
void RF12_SEND(unsigned char aByte) { while(!(RFXX_WRT_CMD(0x0000)&0x8000)); RFXX_WRT_CMD(0xB800+aByte); } int main () { //Инициализация FRM12 RF12_INIT(); RFXX_WRT_CMD(0xCA81); RFXX_WRT_CMD(0x0000);//read status register RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC RF12_SEND(0xAA);//PREAMBLE RF12_SEND(0xAA);//PREAMBLE RF12_SEND(0xAA);//PREAMBLE RF12_SEND(0x2D);//SYNC HI BYTE RF12_SEND(0xD4);//SYNC LOW BYTE RF12_SEND(data); //тут передаём что хотим RF12_SEND(0xAA);//DUMMY BYTE RF12_SEND(0xAA);//DUMMY BYTE RF12_SEND(0xAA);//DUMMY BYTE }
Да, всё верно. Логика:mcsik писал(а): В данном случаи подключения контролера к трансиверу следующее?
контрол Трансивер
SS (PD6) -> SS
SCK (PC0) -> SCK
MOSI (PD7) -> SDI ???
MISO (PC1) -> SDO???
PD2 -> iRQ
Может и дохлые, а может просто не те команды шлеш, там на каждый модуль rfm свои команды. Напиши полное название модуля, попытаюсь помочь.mcsik писал(а):Я просто сконфигурировал РФМ 12 как РФМ01, и поэтому на выходе nRIQ не устанавливались нужные уровни, и программа зацикливалась. Я убирал фрагменты на которых она зацикливалась, и действительно диоды мигали.
Я никак не мог сконфигурировать РФМ12.Что-то не получается.Может модули дохлые.....
эмм RFM02 Только передатчик?MiklSh писал(а):Да, только наоборот - RFM01 приемник, RFM02 - передатчик
все понял а RFM12 он приемник и передатчик. или опять туплю!MiklSh писал(а):Да. http://bashel.bashel.ru/info8/HopeRF.pdf
но, опять же, в полудуплексе. так что не стоит особо раскатывать губу на его возможности.MiklSh писал(а):Все верно RFM12 "трансивер" содержит и приемник и передатчик у себя на борту, сразу чтоб двунаправленную линию делать.
но, опять же, в полудуплексе. так что не стоит особо раскатывать губу на его возможности.[/quot]svd71 писал(а):MiklSh писал(а):Все верно RFM12 "трансивер" содержит и приемник и передатчик у себя на борту, сразу чтоб двунаправленную линию делать.