Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

ja_dzik 25 Mar 2010 11:15 237011 707
Altium Designer Computer Controls
  • #301
    krzys_7
    Level 10  
    Witam!
    U mnie występuje taki problem, że sygnał nRES mam cały czas w stanie niskim, czyli aktywny przez co nie mam w ogóle komunikacji pomiędzy modułami. Wie ktoś może jak rozwiązać taki problem. Podłączyłem sygnał nRES do VCC jednak to nic nie pomogło :/
    Pozdrawiam.

    EDIT:
    Mój problem został rozwiązany. Źle dobrałem kondensatory pod stabilizator.
  • Altium Designer Computer Controls
  • #302
    marol_pm
    Level 11  
    Ma ktoś może przykładowy kod w C, najbanalniejszy np coś z diodą, sprawdzający poprawność działania modułów RFM12BP ?? Jestem podpięty do Atmegi8 :)

    Serdecznie pozdrawiam
  • Altium Designer Computer Controls
  • #303
    Freddy
    Level 43  
    Przeczytałeś cały topic, czy tylko ostatni post ???????
  • #304
    marol_pm
    Level 11  
    Przeczytałem cały i znalazłem, coś tu...
    https://www.elektroda.pl/rtvforum/topic890223-60.html
    Programy nadajnika i odbiornika użytkownika avatar.

    Podpiąłem wszystko do jednego komputera (wspólne zasilanie, masa)
    diody się świecą i mrugają :)

    Podłączyłem na osobnych kompach, już lipa, nadajnik działa, na obojętnie którym kompie, zaś odbiornik nic, nie świeci się dioda ...
  • #305
    atek000
    Level 17  
    Witam kolegów elektroników.
    Zakupiłem niedawno 2 sztuki RFM12BS i zabrałem się do pracy. Kilka prób, problemów z czasem ale wczoraj zabrałem się do tego o 10 rano, przeczytałem cały ten post od początku do końca. Fakt, jak już ktoś tu wspomniał ,szkoda że pomieszane są tu RFM01 i 02 z RFM12 i 12b, dodam jeszcze że bascom z c. Ja pracuje w bascom-ie. Robiłem wiele prób, głównie opierając się o kod podany przez kolegę atom1477 - tzn kopiując jego kod i w nim dokonując zmian. Skończyłem o 2-giej w nocy i nic. Wyświetlacz podłączony do odbiornika pokazuje 255, pomimo odłączonego nadajnika. Wczoraj żona jeszcze mi darowała siedzenie ale dziś zaczyna mocniej marudzić abym zaopiekował się dzieckiem, zrobił coś. Stąd moja prośba, aby przyspieszyć całą pracę proszę o pomoc. Oto 2 jak najmniej zmodyfikowane kody, gdzie robię błąd?
    'RFMnadajnik
    
    $regfile = "attiny2313.dat"
    $crystal = 1000000
    '-----------------------------------------------------
    Dim Dana As Byte
    
    Dim I As Byte
    
    Dim Data_out As Word
    Dim Data_in As Word
    
    Dim Data_to_send As Byte
    Dim Received_data As Byte
    
    Dim X As Byte
    
    '-----------------------------------------------------
    Rf_sck Alias Portd.0
    Rf_sdo Alias Pind.1
    Rf_nirq Alias Pind.2
    Rf_sdi Alias Portd.3
    Rf_nsel Alias Portd.4
    '-----------------------------------------------------
    
    Config Portb = &B01111010
    
    
    Waitms 100
    Gosub Rf12_init
    Waitms 100
    Gosub Rf12_init
    
    
    
    Do
    
     X = X + 1
    
    
              Data_out = &H0000
              Gosub Rf12_wrt_cmd_2
              Data_out = &H8238                                 '!er,!ebb,et,es,ex,!eb,!ew,dc
              Gosub Rf12_wrt_cmd_2
    
    
    
              Data_to_send = &HAA
              Gosub Rf12_send
              Data_to_send = &HAA
              Gosub Rf12_send
              Data_to_send = &HAA
              Gosub Rf12_send
    
              Data_to_send = &H2D
              Gosub Rf12_send
              Data_to_send = &HD4
              Gosub Rf12_send
    
    '-----------------------------------------------------------
              Data_to_send = X
              Gosub Rf12_send
    '-----------------------------------------------------------
    
              Data_to_send = &HAA
              Gosub Rf12_send
              Data_to_send = &HAA
              Gosub Rf12_send
              Data_to_send = &HAA
              Gosub Rf12_send
    
    
    
    
              Data_out = &H8200
              Gosub Rf12_wrt_cmd_2
    
    
      Wait 2
    
    Loop
    '-----------------------------------------------------
    Rf12_init:
        Data_out = &H80E7                                       'El,Ef,868band,12.0pf                80E8     12.5pf
        Gosub Rf12_wrt_cmd_2
        Data_out = &H8238                                       '!er,!ebb,et,es,ex,!eb,!ew,dc        8298     er,!ebb,!et,es,ex,!eb,!ew,!dc
        Gosub Rf12_wrt_cmd_2
        Data_out = &HA640                                       '868MHz
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC687                                       '4.8kbps                             C611     19.2kbps
        Gosub Rf12_wrt_cmd_2
        Data_out = &H94A0                                       'VDI,FAST,134kHz,0dBm,-103dBm
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC2AC                                       'AL,!ml,DIG,DQD4
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCA81                                       'FIFO8,SYNC,!ff,DR
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCED4                                       'SYNC=2DD4;
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC483                                       '@PWR,NO RSTRIC,!st,!fi,OE,EN
        Gosub Rf12_wrt_cmd_2
        Data_out = &H9850                                       '!mp,90kHz,MAX OUT
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCC77                                       'OB1,OB0, LPX,!ddy,DDIT,BW0          CC17     !OB1,!OB0, LPX,!ddy,DDIT,BW0
        Gosub Rf12_wrt_cmd_2
        Data_out = &HE000                                       'NOT USE
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC800                                       'NOT USE
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC070                                       '1.66MHz,
        Gosub Rf12_wrt_cmd_2
    Return
    '-----------------------------------------------------
    Rf12_send:
      !Wait_for_nIRQ_low_1:
      sbic Pind,2
        jmp Wait_for_nIRQ_low_1
    
    
    
      lds R16, {Data_to_send}
      sts {Data_Out+0}, R16
      ldi R16, &HB8
      sts {Data_Out+1}, R16
    
      Gosub Rf12_wrt_cmd_2
    Return
    '-----------------------------------------------------
    Rf12_receive:
    '(  'Timeout = 0
    
      Jeszcze:
      Data_out = &H0000
      Gosub Rf12_wrt_cmd_2
    
      If Data_in.15 = 0 Then
        'Incr Timeout
        'If Timeout > 10000 Then
        '  pop R16
        '  pop R16
        '
        '  Goto Start_1
        'End If
    
        Goto Jeszcze
      End If
    
    
      Data_out = &HB000
      Gosub Rf12_wrt_cmd_2
    
      lds R16, {Data_In+0}
      sts {Received_data}, R16                                  ')
    ')
    
    
    
    
      !Wait_for_nirq_low_2:
      sbic Pind, 2
        jmp Wait_for_nIRQ_low_2
    
    
      Data_out = &HB000
      Gosub Rf12_wrt_cmd_2
    
      lds R16, {Data_In+0}
      sts {Received_data}, R16
    Return
    '-----------------------------------------------------
    Rf12_wrt_cmd_2:
        Rf_sck = 0
        Rf_nsel = 0
    
    
    
        Data_in = 0
    
        For I = 0 To 15
           Rf_sdi = Data_out.15
    
           Shift Data_out , Left , 1
    
           Rf_sck = 1
    
           Shift Data_in , Left , 1
    
           Data_in.0 = Rf_sdo
    
           Rf_sck = 0
        Next I
    
    
    
        Rf_sck = 0
        Rf_nsel = 1
    Return
    '-----------------------------------------------------


    'RFModbiornik
    
    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
    '-----------------------------------------------------
    
    Config Lcd = 16 * 2
    Config Lcdpin = Port , Port = Portb , E = Portd.5 , Rs = Portd.6,
    
    
    Dim Dana As Byte
    
    Dim I As Byte
    
    Dim Data_out As Word
    Dim Data_in As Word
    
    Dim Data_to_send As Byte
    Dim Received_data As Byte
    
    Dim X As Byte
    
    '-----------------------------------------------------
    Rf_sck Alias Portd.0
    Rf_sdo Alias Pind.1
    Rf_nirq Alias Pind.2
    Rf_sdi Alias Portd.3
    Rf_nsel Alias Portd.4
    '-----------------------------------------------------
    
    
    Waitms 100
    Gosub Rf12_init
    Waitms 100
    Gosub Rf12_init
    
    
    Do
      Data_out = &H8298                                         '!er,!ebb,et,es,ex,!eb,!ew,dc        8298     er,!ebb,!et,es,ex,!eb,!ew,!dc
      Gosub Rf12_wrt_cmd_2
    
    
      Data_out = &HCA81
      Gosub Rf12_wrt_cmd_2
      Data_out = &HCA83
      Gosub Rf12_wrt_cmd_2
    
    
      Waitus 1
    
    
      Gosub Rf12_receive
      X = Received_data
    
      Data_out = &HCA81
      Gosub Rf12_wrt_cmd_2
      Data_out = &HCA83
      Gosub Rf12_wrt_cmd_2
    
    Cls
    Lcd X
    
      Waitms 5
    
    Loop
    '-----------------------------------------------------
    Rf12_init:
        Data_out = &H80E7                                       'El,Ef,868band,12.0pf                80E8     12.5pf
        Gosub Rf12_wrt_cmd_2
        Data_out = &H8238                                       '!er,!ebb,et,es,ex,!eb,!ew,dc        8298     er,!ebb,!et,es,ex,!eb,!ew,!dc
        Gosub Rf12_wrt_cmd_2
        Data_out = &HA640                                       '868MHz
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC687                                       '4.8kbps                             C611     19.2kbps
        Gosub Rf12_wrt_cmd_2
        Data_out = &H94A0                                       'VDI,FAST,134kHz,0dBm,-103dBm
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC2AC                                       'AL,!ml,DIG,DQD4
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCA81                                       'FIFO8,SYNC,!ff,DR
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCED4                                       'SYNC=2DD4;
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC483                                       '@PWR,NO RSTRIC,!st,!fi,OE,EN
        Gosub Rf12_wrt_cmd_2
        Data_out = &H9850                                       '!mp,90kHz,MAX OUT
        Gosub Rf12_wrt_cmd_2
        Data_out = &HCC77                                       'OB1,OB0, LPX,!ddy,DDIT,BW0          CC17     !OB1,!OB0, LPX,!ddy,DDIT,BW0
        Gosub Rf12_wrt_cmd_2
        Data_out = &HE000                                       'NOT USE
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC800                                       'NOT USE
        Gosub Rf12_wrt_cmd_2
        Data_out = &HC070                                       '1.66MHz,
        Gosub Rf12_wrt_cmd_2
    Return
    '-----------------------------------------------------
    Rf12_send:
      !Wait_for_nIRQ_low_1:
      sbic Pind, 2
        jmp Wait_for_nIRQ_low_1
    
    
    
      lds R16, {Data_to_send}
      sts {Data_Out+0}, R16
      ldi R16, &HB8
      sts {Data_Out+1}, R16
    
      Gosub Rf12_wrt_cmd_2
    Return
    '-----------------------------------------------------
    Rf12_receive:
      'Timeout = 0
    
      Jeszcze:
      Data_out = &H0000
      Gosub Rf12_wrt_cmd_2
    
      If Data_in.15 = 0 Then
        'Incr Timeout
        'If Timeout > 10000 Then
        '  pop R16
        '  pop R16
        '
        '  Goto Start_1
        'End If
    
        Goto Jeszcze
      End If
    
    
      Data_out = &HB000
      Gosub Rf12_wrt_cmd_2
    
      lds R16, {Data_In+0}
      sts {Received_data}, R16
    
    
    
    
    '(  !Wait_for_nirq_low_2:
      sbic Pind, 2
        jmp Wait_for_nIRQ_low_2
    
    
      Data_out = &HB000
      Gosub Rf12_wrt_cmd_2
    
      lds R16, {Data_In+0}
      sts {Received_data}, R16                                  ')
    ')
    Return
    '-----------------------------------------------------
    Rf12_wrt_cmd_2:
        Rf_sck = 0
        Rf_nsel = 0
    
    
    
        Data_in = 0
    
        For I = 0 To 15
           Rf_sdi = Data_out.15
    
           Shift Data_out , Left , 1
    
           Rf_sck = 1
    
           Shift Data_in , Left , 1
    
           Data_in.0 = Rf_sdo
    
           Rf_sck = 0
        Next I
    
    
    
        Rf_sck = 0
        Rf_nsel = 1
    Return
    '-----------------------------------------------------
  • #306
    Grzybens
    Level 13  
    Witam,
    Ostatnio również ja, skuszony możliwościami układów rfm12, postanowiłem zakupić dwa moduły tego typu (433 MHz). Śledząc ten wątek natknąłem się na kod użytkownika avatar, postanowiłem wykorzystać go więc w mojej aplikacji. Niestety, po podłączeniu modułów do procesorów nie zachodzi żadna transmisja. Po pewnym czasie nierównej walki z w/w nasunęło mi się kilka pytań, na które niestety, sam sobie odpowiedzieć nie potrafię. Dlatego tez zdecydowałem się zabrać głos w tej pouczającej dyskusji.

    No ale do rzeczy.

    Nadajnik podpięty mam do Attiny 2313, poniżej prezentuje kod dla funkcji obsługującej moduł nadajnika

    #include <avr\io.h>
    #define F_CPU 8000000
    #include "rfm12_nadajnik.h"
    #include <util/delay.h>
    
    void portInit() {
      HI(CS);
      HI(SDI);
      LO(SCK);
      DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
      DDRB = (1<<LED);
    }
    
    unsigned int writeCmd(unsigned int cmd) {
      unsigned char i;
      unsigned int recv;
      recv = 0;
      LO(SCK);
      LO(CS);
      for(i=0; i<16; i++) {
        if(cmd&0x8000) HI(SDI); else LO(SDI);
        HI(SCK);
        recv<<=1;
        if( PINB&(1<<SDO) ) {
          recv|=0x0001;
        }
        LO(SCK);
        cmd<<=1;
      }
      HI(CS);
      return recv;
    }
    
    void rfInit() { 
      writeCmd(0x80D7); //EL,EF,433band,12.0pF writeCmd(0x80D7);
      writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
      writeCmd(0xA640); //frequency select
      writeCmd(0xC647); //4.8kbps
      writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
      writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
      writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
      writeCmd(0xCED4); //SYNC=2DD4?G
      writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
      writeCmd(0x9850); //!mp,90kHz,MAX OUT
      writeCmd(0xCC17); //OB1?COB0, LPX,?Iddy?CDDIT?CBW0	CC17
      writeCmd(0xE000); //NOT USE
      writeCmd(0xC800); //NOT USE
      writeCmd(0xC040); //1.66MHz,2.2V
    }
    
    void rfSend(unsigned char data){
     //while(WAIT_NIRQ_LOW());
      WAIT_NIRQ_LOW();
      writeCmd(0xB800 + data);
    }


    Oraz kod dla programu głównego obsługującego moduł nadajnika

    #include <avr\io.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    
    #include "rfm12_nadajnik.h"
    #include "DS18b20.h"
    //****************************************************************************************************
    ////////////////////	Program główny	//////////////////////////////////////////////////////////////
    //****************************************************************************************************
    int main(void)
    {
    PORTA=0x00;	//Pin 0 - czujnik temperatury
    DDRA=0xFE;	//Pin 0 - wejsie czujnika temperatury
    //PORTB=0x00;	//Port dla RFM12 ( Piny 2-5 magistrala SPI)
    //DDRB=0xEF;	//Pin 4 - wejscie magistrali SPI (Strona procesora) Pin7 - dioda sygnalizacyjna
    //PORTD=0x04; //Pin 2 - przerwanie od rfm12
    DDRD=0xFB;	//Pin 2 - wejscie dla przerwania od rfm12
    
    volatile unsigned int i,j;
      asm("cli");
      for(i=0;i<1000;i++)for(j=0;j<123;j++);
      portInit();
      /* rsInit(BAUDRATE); */
      rfInit();
      
      while(1){
        LED_ON();
        writeCmd(0x0000);
        rfSend(0xAA); // PREAMBLE
        rfSend(0xAA);
        rfSend(0xAA);
       // rfSend(0x2D); // SYNC
        rfSend(0xD4);
        for(i=0; i<16; i++) {
    	  rfSend(0x30+i);
       }
       // rfSend(0xAA); // DUMMY BYTES
       // rfSend(0xAA);
       // rfSend(0xAA);
        LED_OFF();
       
    	for(i=0; i<10000; i++)
          for(j=0; j<123; j++);
      }
    }
    


    To co udało mi się zaobserwować bardzo mnie zdziwiło. Dla powyższej konfiguracji pinu portu, do którego podłączone jest przerwanie od modułu rfm12 (Pin2 port D) dioda miga. Natomiast, gdy włączę wewnętrzne podciąganie pod Pin 2, dioda zapala się i już nie gaśnie. Wygląda na to, że układ RFM12 wcale nie generuje przerwania na swoje linii NIRQ. Podobny stan ma miejsce, gdy całkowicie odłączę układ RF12 od uC. Drugą sprawą jest fakt że nadajnik nie zwiększa poboru prądu podczas wysyłania danych. Nie wiem jednak na ile mój pomiar jest prawdziwy, ponieważ skok prądu może zachodzić tak szybko, że miernik nie jest w stanie go wychwycić. Tyle w sprawie nadajnika:D

    Odbiornik podłączony został do Atmega8. Zamierzeniem było odczytywanie danych z nadajnika i wystawianie ich na wyświetlacz LCD.

    Kod dla funkcji obsługującej moduł odbiornika

    
    #include <avr\io.h>
    
    #define F_CPU 8000000UL	
    #include <util/delay.h>
    #include "rfm12_odbiornik.h"
    #include "LCD.h"
    // Ustawienie portu 9600 b  2 bity stopu
    void rsInit(unsigned char baud) {
       UBRRH = 0;
       UBRRL = 51; 
       UCSRB = (1<<RXEN)|(1<<TXEN); 
       UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    // Wysylanie na port UART odebranych danych z RFM12
    void rsSend(unsigned char data) {
        while ( !( UCSRA & (1<<UDRE)) ); 
       UDR = data;
    }
    
    unsigned char rsRecv() {
      while( !(UCSRA & (1<<RXC)));
      return UDR;
    }
    
    void portInit() {
      HI(CS);
      HI(SDI);
      LO(SCK);
      DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
      DDRC = (1<<LED);
    }
    
    unsigned int writeCmd(unsigned int cmd) {
      unsigned char i;
      unsigned int recv;
      recv = 0;
      LO(SCK);
      LO(CS);
      for(i=0; i<16; i++) {
        if(cmd&0x8000) {
          HI(SDI);
    	}
        else {
          LO(SDI);
    	}
        HI(SCK);
        recv<<=1;
        if( PINB&(1<<SDO) ) {
          recv|=0x0001; 
    	}
        LO(SCK);
        cmd<<=1;
      }
      HI(CS);
      return recv;
    }
    
    void FIFOReset() {
      writeCmd(0xCA81);
      writeCmd(0xCA83);
    }
    /*
    void waitForData() {
      unsigned int status;
      while(1) {
        status = writeCmd(0x0000);
        if ( (status&0x8000) ) {
          return;
        }
      }
    }
    */
    void rfInit() {
      writeCmd(0x80D7); //EL,EF,433band,12.0pF
      writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC
      writeCmd(0xA640); //freq select 
      writeCmd(0xC647); //4.8kbps writeCmd(0xC647)
      writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
      writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
      writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
      writeCmd(0xCED4); //SYNC=2DD4;
      writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
      writeCmd(0x9850); //!mp,90kHz,MAX OUT
      writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
      writeCmd(0xE000); //NOT USE
      writeCmd(0xC800); //NOT USE
      writeCmd(0xC040); //1.66MHz,2.2V
    }
    
    /*
    unsigned char rfRecv() {
      unsigned int data;
      writeCmd(0x0000);
      data = writeCmd(0xB000);
      return (data&0x00FF);
    }
    */
    
    unsigned char rfRecv() {
      unsigned int data;
      while(1) {
        data = writeCmd(0x0000);
        if ( (data&0x8000) ) {
          data = writeCmd(0xB000);
          return (data&0x00FF);
        }
      } 
    }
    
    /*
    unsigned char rfRecv() {
      unsigned int data;
      while(1) {
      	 data = writeCmd(0xB000);
         	if (data) {
    	  return (data&0x00FF);
        }
      } 
    }
    */
    unsigned int rfRDstatus()
    {
    unsigned char i;
    unsigned int recv;
      recv = 0;
      LO(SCK);
      LO(CS);
      LO(SDI);
      for(i=0; i<16; i++) {
        HI(SCK);
        recv<<=1;
        	if( PINB&(1<<SDO) ) {
          	recv|=0x0001; 
    		}
        LO(SCK);
      }
      HI(CS);
      piszdlcd((recv&0xFF00)>>8);
      piszdlcd(recv&0x00FF);
      
      return recv;
    }
    


    Oraz kod dla programu głównego obsługującego moduł odbiornika

    #include <avr/io.h>
    
    #define F_CPU 8000000UL		
    #include <util/delay.h>
    
    #include "LCD.h"
    #include "rfm12_odbiornik.h"
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    //************************	Program główny	***********************************************************
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    
    int main(void)
    {
    //PORTB=0x01;		//Port dla RFM12 ( Piny 2-5 magistrala SPI)
    //DDRB=0xEF;		//Pin 4 - wejscie magistrali SPI (Strona procesora)
    //PORTC=0x00;		
    //DDRC=0xFB;		//Pin 2 - przerwania od RFM12, Pin 3 - dioda sygnalizacyjna	
    PORTD=0x00;		
    DDRD=0xFF;		//Port dla LCD (PIN 0 i 1 - sygnał RS i E Piny 4-7 magistrala danych)		
    
     /////////////////////////////	inicjalizacja wyswietlacza		
     _delay_ms(45);		
     initial_lcd();
     piszilcd(0x28);				//interfejs 4-bitowy, 2 linie, znak 5x7
     _delay_ms(1);		
     piszilcd(0x0C);				//wlacz LCD,wylacz kursor,wylacz mruganie
     _delay_ms(1);		
     piszilcd(0x01);				//czysc LCD
     _delay_ms(1.64);			//opoznienie dla instrukcji czyszczenia
    ///////////////////////////////////////////////////////////
    
    unsigned char data, i;
      portInit();
      rfInit();
      LED_OFF();
    //  rsInit(BAUDRATE);          // >> debag
      FIFOReset();
    rfRDstatus();
    //piszdlcd('A');
      while(1) {
          for (i=0; i<16; i++) {
            data = rfRecv();
     		piszdlcd(data);
     //      rsSend(data);      // >>debag
           LED_ON();     
         }
          FIFOReset();
      LED_OFF();
      }
      return 0;
    
    }
    


    W tym przypadku program wpada w nieskończoną pętle poniższej funkcji
    
    unsigned char rfRecv() {
      unsigned int data;
      while(1) {
        data = writeCmd(0x0000);
        if ( (data&0x8000) ) {
          data = writeCmd(0xB000);
          return (data&0x00FF);
        }
      } 
    }
    


    W związku z tym mam pewne pytanie. Jakie dane powinien zwrócić moduł RFM12 po wysłąnie do niego komendy 0x000. Nota aplikacyjna nic o tym nie wspomina. Zmieniłem nieco tą funkcję tak by nie wysyłała komendy 0x000 ale niestety bez zadowalającego rezultatu. Funkcja ciągle tkwi w nieskończonej pętli.
    
    unsigned char rfRecv() {
      unsigned int data;
      while(1) {
      	 data = writeCmd(0xB000);
         	if (data) {
    	  return (data&0x00FF);
        }
      } 
    }
    


    W celu sprawdzenia czy wogóle zachodzi jakaś rozmowa pomiędzy RFM12 a uC napisałem funkcje odczytująca rejestr statusowy RFM12. Sposób odczytu zaczerpnięty został z noty aplikacyjnej modułu TRC102 (str. 17).
    
    unsigned int rfRDstatus()
    {
    unsigned char i;
    unsigned int recv;
      recv = 0;
      LO(SCK);
      LO(CS);
      LO(SDI);
      for(i=0; i<16; i++) {
        HI(SCK);
        recv<<=1;
        	if( PINB&(1<<SDO) ) {
          	recv|=0x0001; 
    		}
        LO(SCK);
      }
      HI(CS);
      piszdlcd((recv&0xFF00)>>8);
      piszdlcd(recv&0x00FF);
      
      return recv;
    }
    


    Po uruchomieniu tej funkcji na wyświetlaczu pojawiają się znaki, jednak po każdorazowym resecie procesora znaki te zmieniają się, co świadczy o tym że wartość tego rejestru ulega zmianie. Czy rejestr ten może od tak zmieniać sobie wartości, mimo iż konfiguracja przeprowadzana jest zawsze przy użyciu tych samych parametrów:?:

    Dodam jeszcze, że moduły testuje na płytce stykowej. Podłączyłem je do uC za pomocą 10 cm przewodów pozyskanych ze skrętki Ethernetowej. Całość zasilana jest z portu USB komputera. Oba moduły mają to samo źródło zasilania.

    To chyba tyle jeśli chodzi o pierwsze spostrzeżenia. Jeżeli ktoś byłby w stanie uchylić rąbka tajemnicy, jaką osnute są moduły RFM12, moje prace mogłyby posunąć się kroczek dalej.

    Z góry dziękuje i pozdrawiam
  • #307
    Kabelek
    Level 15  
    Bascom - przykładowy działający kod do testowania RFM12 na 868MHz
    Odbiornik generuje przerwanie po odebraniu z nadajnika Byte 2D D4 i dopiero odbiera dane użytkowe, czyli Data_in(1)...Data_in(7)

    Odbiornik:
    'Odbiornik
    
    $regfile = "m8def.dat"                                      ' specify the used micro
    $crystal = 8000000                                          ' used crystal frequency
    $baud = 19200                                               ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    
    '$sim
    
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.3 , Db6 = Portc.1 , Db7 = Portc.2 , E = Portc.5 , Rs = Portc.4.
    
    Nsel Alias Portb.2
    Sdi Alias Portb.3
    Sdo Alias Pinb.4
    Sck Alias Portb.5
    
    Dim D As Word
    Dim Data_in(7) As Byte
    Dim N As Byte
    Dim Timeout As Word
    Dim T As Word
    Dim Tt As Word
    Dim Freq As Single
    
    Declare Sub Receive_rfm12
    Declare Sub Freq_rfm12
    Declare Function Spi16(byval Dout As Word) As Word
    Declare Sub Dioda
    
    Config Nsel = Output
    Config Sdi = Output
    Config Sck = Output
    Config Portb.1 = Output                                     'LED
    
    
    'Init
      Nsel = 1
      Sck = 0
     'D = Spi16(&H80d7)                                         ' El , Ef , 11.5pf, 433 MHz band
      D = Spi16(&H80e7)                                         ' El , Ef , 11.5pf, 868 MHz band
      D = Spi16(&H82d9)                                         '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
      D = Spi16(&Ha67c)                                         ' 434,15 MHz / 868,3 MHz
      D = Spi16(&Hc647)                                         ' 4.8kbps
      D = Spi16(&H94a4)                                         ' Vdi , Fast , 134 kHz , 0db , -79dbm
      D = Spi16(&Hc2ac)                                         ' Al , !ml , Dig , Dqd4
      D = Spi16(&Hca81)                                         ' Fifo8 , Sync , !ff , Dr
      D = Spi16(&Hc483)                                         ' @pwr , No Rstric , !st , !fi , Oe , En
      D = Spi16(&H9854)                                         ' 90 kHz , power - 0 dB
      D = Spi16(&He000)                                         '
      D = Spi16(&Hc800)                                         '
      D = Spi16(&Hc000)                                         ' 1 MHz , 2.2V
    
      Freq = 868.300
      Freq_rfm12
    
    
    
    
    
    
      On Int1 Migacz                                            'Jezeli wystapi przerwanie to mignij dioda
      Enable Int1
      Enable Interrupts
    
    Cls
    
    Do
       For N = 1 To 7
       Data_in(n) = 0
       Next N
       Timeout = 400 + Rnd(1000)
       Receive_rfm12
          Cls 
          Lcd Data_in(1) ; "  " ; Data_in(2) ; "  " ; Data_in(3) ; "  " ; Data_in(4) ; " " ; Data_in(5) ; "  " ; Data_in(6) ; " " ; Data_in(7) 
          Enable Int1
    Loop
    
    
    Sub Freq_rfm12
      If Freq < 800 Then Freq = Freq * 2
      Freq = Freq - 860
      D = Freq / 0.0050
      If D < 96 Then D = 96
      If D > 3903 Then D = 3903
      D = D + &HA000
      D = Spi16(d)
    End Sub
    
    
    Sub Receive_rfm12
      Tt = Timeout * 10
      D = Spi16(&H82c8)
      D = Spi16(&Hca83)
      For N = 1 To 7
        Nsel = 0
        T = 0
        Do
          T = T + 1
          Waitus 100
          If T > Tt Then Goto Nosignal
        Loop Until Sdo = 1
        D = Spi16(&Hb000)
        Data_in(n) = D
          Next N
    
    Nosignal:
      D = Spi16(&H8208)
    
    End Sub
    
    
    Function Spi16(byval Dout As Word) As Word
    Local Nspi As Integer
    Local Dspi As Integer
    Local Dsdo As Word
      Nsel = 0
      Dsdo = 0
      For Nspi = 1 To 16
        Dspi = Dout And &H8000
        If Dspi = 0 Then
           Sdi = 0
        Else
           Sdi = 1
        End If
        Dout = Dout * 2
        Dsdo = Dsdo * 2
        Dsdo = Dsdo + Sdo
        Sck = 1
        Waitus 5
        Sck = 0
      Next Nspi
      Nsel = 1
      Spi16 = Dsdo
    End Function
    
    
    Sub Dioda
       Set Portb.1
       Waitms 15
       Reset Portb.1
       Enable Int1
    End Sub
    
    Migacz:
    Disable Int1
    Dioda
    Return


    Nadajnik:
    'Nadajnik
    
    $regfile = "m8def.dat"                                      ' specify the used micro
    $crystal = 8000000                                          ' used crystal frequency
    $baud = 19200                                               ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    
    '$sim
    
    Nsel Alias Portb.2
    Sdi Alias Portb.3
    Sdo Alias Pinb.4
    Sck Alias Portb.5
    
    Dim D As Word
    Dim Data_out(7) As Byte
    Dim N As Byte
    Dim X As Byte
    Dim Freq As Single
    
    Declare Sub Send_rfm12
    Declare Sub Receive_rfm12
    Declare Sub Freq_rfm12
    Declare Sub Wait_rfm12
    
    Declare Function Spi16(byval Dout As Word) As Word
    
    
    Config Nsel = Output
    Config Sdi = Output
    Config Sck = Output
    
    Config Portd.2 = Output                                     'LED
    
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    Config Pinc.3 = Input
    Config Pinc.4 = Input
    Config Pinc.5 = Input
    
    Config Pind.4 = Input
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Pind.7 = Input
    
    
    
    Portb.0 = 1
    Portb.1 = 1
    
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 1
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 1
    
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    
    'Init
      Nsel = 1
      Sck = 0
     'D = Spi16(&H80d7)                                         ' El , Ef , 11.5pf, 433 MHz band
      D = Spi16(&H80e7)                                         ' El , Ef , 11.5pf, 868 MHz band
      D = Spi16(&H82d9)                                         '!er , !ebb , Et , Es , Ex , !eb , !ew , Dc
      D = Spi16(&Ha67c)                                         ' 434,15 MHz / 868,3 MHz
      D = Spi16(&Hc647)                                         ' 4.8kbps
      D = Spi16(&H94a4)                                         ' Vdi , Fast , 134 kHz , 0db , -79dbm
      D = Spi16(&Hc2ac)                                         ' Al , !ml , Dig , Dqd4
      D = Spi16(&Hca81)                                         ' Fifo8 , Sync , !ff , Dr
      D = Spi16(&Hc483)                                         ' @pwr , No Rstric , !st , !fi , Oe , En
      D = Spi16(&H9850)                                         ' 90 kHz , power - 0 dB
      D = Spi16(&He000)                                         '
      D = Spi16(&Hc800)                                         '
      D = Spi16(&Hc000)                                         ' 1 MHz , 2.2V
    
      Freq = 868.300
      Freq_rfm12
    
    
    
      Do
      '-----------------------------------------------------------------------------
    
       If Pind.6 = 0 Then                                       'Wyslanie siedmiu Byte
         Data_out(1) = 1
         Data_out(2) = 2
         Data_out(3) = 3
         Data_out(4) = 4
         Data_out(5) = 5
         Data_out(6) = 6
         Data_out(7) = 7
    
         Send_rfm12
       End If
    '---------------------
       If Pind.7 = 0 Then
         Data_out(2) = 2
         Send_rfm12
       End If
    '---------------------
       If Pinb.0 = 0 Then
         Data_out(3) = 3
         Send_rfm12
       End If
    
    '---------------------
       If Pinb.1 = 0 Then
         Data_out(4) = 4
         Send_rfm12
       End If
    
    '---------------------
       If Pinc.3 = 0 Then
         Data_out(5) = 5
         Send_rfm12
       End If
    '---------------------
       If Pinc.2 = 0 Then
         Data_out(6) = 6
         Send_rfm12
       End If
    '---------------------
       If Pinc.1 = 0 Then
         Data_out(7) = 7
         Send_rfm12
       End If
    
    Loop
    
    
    
    Sub Freq_rfm12
      If Freq < 800 Then Freq = Freq * 2
      Freq = Freq - 860
      D = Freq / 0.0050
      If D < 96 Then D = 96
      If D > 3903 Then D = 3903
      D = D + &HA000
      D = Spi16(d)
    End Sub
    
    
    Sub Send_rfm12
      D = Spi16(&H8238)
      Wait_rfm12
    
      D = Spi16(&Hb8aa)
      Wait_rfm12
      D = Spi16(&Hb8aa)
      Wait_rfm12
      D = Spi16(&Hb8aa)
      Wait_rfm12
      D = Spi16(&Hb82d)
      Wait_rfm12
      D = Spi16(&Hb8d4)
      For N = 1 To 7
        Wait_rfm12
        D = &HB800 + Data_out(n)
        D = Spi16(d)
      Next N
      'Wait_rfm12
      'D = Spi16(&Hb800)
      'Wait_rfm12
      'D = Spi16(&Hb800)
      Wait_rfm12
      D = Spi16(&H8208)
    
    End Sub
    
    
    Sub Wait_rfm12
      Nsel = 0
      Do
      Loop Until Sdo = 1
    End Sub
    
    
    Function Spi16(byval Dout As Word) As Word
    Local Nspi As Integer
    Local Dspi As Integer
    Local Dsdo As Word
      Nsel = 0
      Dsdo = 0
      For Nspi = 1 To 16
        Dspi = Dout And &H8000
        If Dspi = 0 Then
           Sdi = 0
        Else
           Sdi = 1
        End If
        Dout = Dout * 2
        Dsdo = Dsdo * 2
        Dsdo = Dsdo + Sdo
        Sck = 1
        Waitus 5
        Sck = 0
      Next Nspi
      Nsel = 1
      Spi16 = Dsdo
    End Function


    Kod na podstawie niemieckiego Elektor 1/2009
  • #308
    Grzybens
    Level 13  
    Witam,
    czy ktoś z szanownych forumowiczów, którym udało się odpalić moduły RFM12 mógłby wyjaśnić mi sens poniższego fragmentu kodu dla odbiornika:

    
    unsigned char rfRecv() {
      unsigned int data;
      while(1) {
        data = writeCmd(0x0000);   //wątpliwy fragment
        if ( (data&0x8000) ) {
          data = writeCmd(0xB000);
          return (data&0x00FF);
        }
      } 
    }
    


    Z tego co widzę program zawsze w tym fragmencie będzie wpadał w nieskończona pętle. Nigdzie w dokumentacji nie doczytałem się, że moduł RFM12 ma zwrócić jakieś dane podczas wysłania do niego kodu 0x0000. Tak też dzieje się u mnie.

    Pozdrawiam
  • #309
    User removed account
    Level 1  
  • #310
    Grzybens
    Level 13  
    atom1477 -> > Dziękuje bardzo za szybką odpowiedź :)

    Faktycznie, nie zauważyłem w dokumentacji, że podczas odczytu rejestru statusu właśnie komendą 0x0000 jako pierwszy idzie bit, który gdy jest w stanie wysokim, sygnalizuje że coś przyszło do FIFO.
  • #311
    marol_pm
    Level 11  
    [RFM12BP, Atmega8, C]
    Komunikacja działa na odleglosci 0,5m, co 2 pakiet dochodzi pełnosprawny :]
    Anteny mam prymitywne druciki 173mm, takie cieniutkie z taśmy, ledwie co stoją ;|

    Pytanko do Was, czy masa w module pin 23 to ma być podłączona do masy całego układu, czy to jest do anteny masa? (czyli dla śmiesznego drucika niewykorzystany pin)??

    Może coś z anteną pokombinować, koncentryk czy cos??
    Miło by było jak by padła jakaś odp. :)
    Pozdro
  • #312
    User removed account
    Level 1  
  • #313
    marol_pm
    Level 11  
    Zasięg się nie zwiększył.
    Chyba żeby wykonać cały moduł (uC Atmega8 i reszta elementów) w wersji SMD, bo może te RFM12BP lubią "ciasne połączenia" tak jak w przypadku RFM12B ??
  • #314
    User removed account
    Level 1  
  • #315
    marol_pm
    Level 11  
    Zamiast 12V mam podłączone 5V, ale próbowałem bez zasilania wzmacniacza i to samo, na 0,5m transmisja.
    To jest moduł na 433 MHz

    Zamieszczę płytkę oraz schemat
    wzorowałem się ze strony:
    http://plischka.at/blog/?p=3

    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12 [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12 ]
  • #316
    User removed account
    Level 1  
  • #317
    marol_pm
    Level 11  
    Sam nie wiem jak to się stało z tym pinem AVCC... :cry:
    LM7812 w linku źródłowym jaki podałem nie było ceramików na we.
    W nocie kat. jest :| -> poprawie to !
    Ale chyba wiem o co Ci chodzi, zastosować dodatkowo elektrolity na we. i wy. dla obydwu stabilizatorów
    :D -poprawię to!
    Poczytam o tworzeniu PCB, by nie było znowu załamki:)
    Dzięki za zrypke !
  • #318
    User removed account
    Level 1  
  • #319
    marol_pm
    Level 11  
    Poprawiłem AVCC, dorzuciłem 100nF na we. LM7812
    Zasiliłem końcówki mocy, jest ok 12V
    Dalej to samo, jak nie gorzej, transmisja na odległości 20cm :cry:
  • #320
    Grzybens
    Level 13  
    Dzisiaj udało mi się odpalić moduły RFM12 na 433 MHz :D

    Zainteresowanym przedstawiam konfiguracje:

    Nadajnik:
    
    writeCmd(0x80D7); //EL,EF,433band,12.0pF writeCmd(0x80D7);
      writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC		8239
      writeCmd(0xA640); //frequency select					AC80
      writeCmd(0xC647); //4.8kbps							C647
      writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
      writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
      writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
      writeCmd(0xCED4); //SYNC=2DD4?G
      writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
      writeCmd(0x9850); //!mp,90kHz,MAX OUT
      writeCmd(0xCC77); //OB1?COB0, LPX,?Iddy?CDDIT?CBW0	CC17
      writeCmd(0xE000); //NOT USE
      writeCmd(0xC800); //NOT USE
      writeCmd(0xC070); //1.66MHz,2.2V						C040
    


    Odbiornik:
    
     writeCmd(0x80D7); //EL,EF,433band,12.0pF
      writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC		8299
      writeCmd(0xA640); //freq select 						AC80
      writeCmd(0xC647); //4.8kbps writeCmd					(0xC647)
      writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
      writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
      writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
      writeCmd(0xCED4); //SYNC=2DD4;
      writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
      writeCmd(0x9850); //!mp,90kHz,MAX OUT
      writeCmd(0xCC77); //!OB1,!OB0, LPX,!ddy,DDIT,BW0		CC17
      writeCmd(0xE000); //NOT USE
      writeCmd(0xC800); //NOT USE
      writeCmd(0xC070); //1.66MHz,2.2V	
    


    Korzystam z kodu użytkownika "avatar". Całość działa na płytce stykowej, więc połączenia wykonane są na "pająka". Moduły do procesorów podłączone są za pomocą 10 cm odcinków kabelków pozyskanych ze skrętki. Wszystko zasilane jest z jednego źródła, jakim jest port USB. Z racji tego, że wszystko jest na jednej płytce, nie wiem jaki maksymalny zasięg uda mi się wycisnąć. Będę to mógł sprawdzić dopiero, gdy zrobię płytki PCB.

    Pozdrawiam i dziękuje za pomoc
  • #321
    Cubaza
    Level 14  
    Witam.
    Przeczytałem ten temat i nie znalazłem na swoje pytanie odpowiedzi. Mianowicie chciałem się zapytać czy uruchomił ktoś moduły RFM12B w trybie zarówno nadajnik i odbiornika. Nie chodzi mi tutaj o to, że jeden moduł jest nadajnikiem, a drugi odbiornikiem. Bo takie kody są tutaj i tak mi te moduły działają bez problemu.
    Chodzi mi o to, że nie mogę sobie poradzić z modułem jako nadajnik i zarazem odbiornik.
    Korzystając z programu zamieszczonego na tej stronie:
    http://www.technofun.org/blog/
    Przy konfiguracji odbiornika i nadajnika na osobnych modułach konfiguracja wygląda tak:
    Dla nadajnika:
    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12
    Dla Odbiornika:
    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

    I teraz kiedy chciałem uruchomić układ w trybie zarówno odbiornika i nadajnika to ustawiałem:
    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12
    Jednak układ się zawieszał. Zatrzymywał się na pierwszej akcji. Nie zależnie czy jest to wysyłanie czy odbieranie.

    Potem postanowiłem zmienić program troszkę. Postanowiłem, że gdy układ będzie miał coś wysłać to ustawię układ w tryb nadajnika. Normalnie układ jest w trybie odbiornika. I wszystko byłoby okej w momencie kiedy układ zaczyna pracować i tylko odbiera to jest OK. Nie ma błędów w transmisji ani nic. Problem się pojawia w momencie kiedy chcę coś wysłać. Wysyłam i kicha. Niestety układ nie wraca w tryb odbiornika.

    I tutaj jest moja prośba. Czy mógłby mi ktoś udostępnić jakiś kod, w którym układ działa jako transceiver? Bądź nakierować mnie jak powinno się ustawić bity konfiguracyjne.

    Mam jeszcze pytanie. Czy jak zmieniam konfigurację RFM12B to muszę wysyłać wszystkie dane konfiguracyjne za każdym razem? Czy mogę tylko to ustawienie, które zmieniam, czyli:
    Muszę wysłać to?
    
    writeCmd(0x80D7); //EL,EF,433band,12.0pF writeCmd(0x80D7);
      writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC      8239
      writeCmd(0xA640); //frequency select               AC80
      writeCmd(0xC647); //4.8kbps                     C647
      writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
      writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
      writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
      writeCmd(0xCED4); //SYNC=2DD4?G
      writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
      writeCmd(0x9850); //!mp,90kHz,MAX OUT
      writeCmd(0xCC77); //OB1?COB0, LPX,?Iddy?CDDIT?CBW0   CC17
      writeCmd(0xE000); //NOT USE
      writeCmd(0xC800); //NOT USE
      writeCmd(0xC070); //1.66MHz,2.2V                  C040 

    Czy mogę wysłać np. tylko to:
    
      writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC     
  • #322
    User removed account
    Level 1  
  • #323
    Cubaza
    Level 14  
    atom1477, masz racje, źle się wyraziłem ;) Oczywiście mój układ nie będzie działać tak, że w tym samym momencie mam odbierać i nadawać itp.
    Chodzi mi o to, że nie mogę przejść z nadawania na odbiór i odwrotnie w jednym układzie.
    Gdy włączę odbiór to układ odbiera bez problemu.
    W momencie kiedy nacisnę przycisk aby coś wysłał to owszem wyśle, ale już nie wróci do odbioru tylko zostaje skonfigurowany jako nadajnik ;) I już mogę tylko wysyłać.
    A według programu to po wyjściu z funkcji wysyłania zmieniam ustawienia na odbiornik. Ale tak jakby tą czynność akurat mijało :(
  • #324
    User removed account
    Level 1  
  • #325
    Cubaza
    Level 14  
    atom, to jeszcze jedno, ostatnie pytanie.
    Czy przy zmianie konfiguracji z nadajnika na odbiornik wysyłałeś całą konfigurację czy tylko tą w której jest zmiana z "aktywowania" odbiornika zamiast nadajnika.
    Z góry dzięki za odpowiedź.
  • #326
    User removed account
    Level 1  
  • #327
    pepson
    Level 17  
    Witam

    Faktycznie też miałem problem z dwukierunkową transmisją między modułami RFM12(B)
    z wykorzystaniem przerwań.

    Wyglądało to mniej więcej tak:
    Po włączeniu zasilania moduł był konfigurowany jako odbiornik
    i wszystko pięknie odbierał
    jak w trakcie pracy przełączyłem go na nadawanie to włączył nośną
    ale nie generował kolejnych przerwań na NIRQ po wysłaniu bajtu
    i tak pozostawał aż do momentu ponownego polecenia wysłania danych
    wtedy się jakby odblokował i następne paczki wysyłał poprawnie
    wszystko było już fajnie dopóki nie wyłączyłem zasilania
    po ponownym załączeniu zasilania występował ten sam efekt

    Kombinacje z opóźnieniami, podwójnym wysłaniem konfiguracji po włączeniu zasilania
    nic nie pomagało
    W końcu zrobiłem tak jak było w przykładzie na stronie producenta
    tam konfiguracja i dla nadajnika i dla odbiornika zaczynała sie od włączenia nadawania
    [ writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC ]
    wyczytałem nawet uwagi w necie, że to błąd
    ale mój problem z powodzeniem został rozwiązany
    Teraz po wysłaniu bajtów konfiguracyjnych na końcu przełączam w tryb odbioru

    Trzeba pamiętać o zresetowaniu FIFO po włączeniu trybu odbioru
    i oczywiście o odczycie rejestru statusu
    (odczyt tego rejestru powoduje powrót wyjścia NIRQ do stanu wysokiego )


    U mnie to mniej więcej tak:

    włączenie zasilania
    odczekanie ok. 200ms
    wysłanie bajtów konfiguracyjnych(jak dla nadajnika)
    .....
    8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC ]
    .....
    .....
    .....
    przełączenie w tryb odbiornika
    82D9H ;TURN ON RX
    reset FIFO
    CA81H ; //wyłączenie FIFO
    CA83H ; //włączenie FIFO -czeka na słowo synchronizacji

    0000H ;odczyt statusu(powrót NIRQ do stanu wysokiego)

    Pętla główna
    i tutaj już sobie czeka na przerwanie po odebraniu danych do FIFO
    ---------------
    Jeżeli chcemy nadawać:
    przełączenie w tryb nadajnika
    8239H ;TURN ON TX
    wysyłamy kilka bajtów preambuły
    wysyłamy nasze dane
    i ze dwa nie znaczące bajty na zakończenie

    ponownie wracamy do odbierania:
    przełączenie w tryb odbiornika
    82D9H ;TURN ON RX
    reset FIFO
    CA81H ; //wyłączenie FIFO
    CA83H ; //włączenie FIFO -czeka na słowo synchronizacji

    0000H ;odczyt statusu(powrót NIRQ do stanu wysokiego)
    -------------------

    Nie twierdzę, że to jest zgodne z zaleceniami twórców układu
    ale działa poprawnie
    i transmisja na przerwaniach śmiga aż miło

    nie stosuję żadnych opóźnień po przełączeniu z nadawania na odbiór i odwrotnie
    choć w dokumentacji jest taka pozycja
    (może gubi się pierwszy bajt preambuły, ale mi to nie przeszkadza)
  • #328
    Hetii
    Level 16  
    Witam :>

    Uff widzę iż temat rzeka z tymi modułami, ale do rzeczy.

    Potrzebuję mieć możliwość przesyłu danych z różnych pomieszczeń jednak nasuwają mi się następujące wątpliwości:

    1. Czy jeden odbiornik jest wstanie odbierać dane z pozostałych n nadajników
    (jeżeli tak to czy są restrykcje co do ich ilości).
    Dane powinny być dostarczane do stacji odbiorczej powiedzmy co 5m (pomiar ciśnienia, wilgotności, temperatury)

    2. Jaki algorytm byłby tu waszym zdaniem wskazany. Jak synchronizować nadajniki aby odbiornik był w stanie zebrać dane.

    3. Stacje nadawcze nie zawsze będą miały dostęp do zasilania dlatego też zastanawia mnie jaki akumulator musiał by być zastosowany aby taki układ działał niezawodnie przez np rok.
    Konstrukcyjnie byłby to RF12 + atmega8 bez kwarcu + kilka czujników.

    4. Jakiego zasięgu jestem w stanie się spodziewać w pomieszczeniach zamkniętych np bloki, hale etc ?

    5. Czy wobec powyższych punktów moduły serii RF12 spełnią swoją role czy też możecie polecić innego rodzaju rozwiązanie.

    Pozdrawiam gorąco.
  • #329
    Egzi
    Level 13  
    Po kilku dniach ciezkiej walki w koncu uruchomilem swojego RFM12. Bazowalem na przykladzie z datasheetu. Jest tam kilka bledow miedzy innymi:

    -ostatnia dana inicjalizacji do ustawiania napiecia progowego i czestotliwosci wyjsciowej CLK jest 0xC400 a ma byc 0xC040 (2 cyfry sa zamienione a 0xC4XX to zupelnie inne polecenie).
    -funkcja zapisu/odczytu ma pomylona kolejnosc polecen i nie odczytuje ostatniego bitu. Ma to znaczenie glownie przy odczycie bitow statusu bo sa wtedy przesuniete o 1 miejsce.
    -opisy w inicjalizacji sa bledne ale same wartosci o ile dobrze pamietam sa poprawne (po opisach wynika, ze inicjalizacja odbiornika uruchamia transmiter).
    - definicje DATA_PORT, DATA_PIN, DATA_DDR nie sa uzywane i mozna skasowac.

    Piny mozna podlaczac do procka dowolnie tylko trzeba wtedy pozmieniac numery pinow w konfiguracji. Ja wybralem piny portu B (atmega8), te ktore nie sa wykorzystywane do programowania zeby modul sie z programatorem nie zarl. nIRQ podlaczylem do portu D3 (INT1).
    Do testow najlepiej ustawic bitrate tak maly jak to tylko mozliwe (to chyba bylo cos kolo 0,3kbps).
    Po poborze pradu nie bardzo widac czy modul nadaje czy nie. Ja mam radio, ktore odbiera 434MHz wiec slyszalem trzaski.
    Komunikacje procka z RFem mozna bardzo latwo sprawdzic przez odczytanie rejestru statusu. Pierwsze odczytanie po zalaczeniu napiecia do madulu ma dac flage POR=1 (pamietac o bledzie w przykladzie producenta) drugi i dalsze odczyty POR=0.

    Datasheet z HopeRF to totalna porazka, lepiej tam w ogole nie zagladac, tylko glowa moze rozbolec. Najlepiej przedstawiono uklad TRC101, ktory funkcjonalnie jest identyczny. Rozni sie tylko troche nazewnictwo.

    Mam jeszcze jeden problem. RF przy bitrate 4,8kbps i wiecej zaczyna gubic dane (w tym samym stopniu w odleglosci 30cm jak i 30m) a przy 19,2kbps juz w ogole nie ma komunikacji. Przy transferze 1kbps mam idealna komunikacje przez 4 betonowe sciany, na odleglosci kulkudziesieciu metrow.
    Jakies pomysly?


    Prawidlowa funkcja nadawania/obioru ma wygladac tak:
    unsigned int RFXX_WRT_CMD(unsigned int aCmd){
    unsigned char i;
    unsigned int temp;
    LOW_SCK();
    LOW_SEL();
    
    for(i=0;i<16;i++){
    LOW_SCK();
    
    if(aCmd&0x8000){HI_SDI();}else{LOW_SDI();
    aCmd<<=1;
    
    HI_SCK();
    
    temp<<=1;
    if(SDO_HI()) temp|=0x0001;
    
    };
    LOW_SCK();
    HI_SEL();
    return(temp);
    }
  • #330
    pepson
    Level 17  
    Quote:
    Mam jeszcze jeden problem. RF przy bitrate 4,8kbps i wiecej zaczyna gubic dane (w tym samym stopniu w odleglosci 30cm jak i 30m) a przy 19,2kbps juz w ogole nie ma komunikacji. Przy transferze 1kbps mam idealna komunikacje przez 4 betonowe sciany, na odleglosci kulkudziesieciu metrow.
    Jakies pomysly?


    Prawdopodobnie procedura odczytu bajtu z FIFO jest dość długa.
    Przy większej prędkości transmisji dane mogą przychodzić
    jeszcze przed zakończeniem odbierania poprzedniego bajtu z FIFO

    U mnie czas odbioru bajtu z FIFO (w przerwaniu) wynosi około 300us
    i przy tej metodzie mogę zapomnieć o dużych prędkościach transmisji