-         

Ergebnis 1 bis 4 von 4

Thema: RFM01 Sync. Word - weiß jemand was?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594

    RFM01 Sync. Word - weiß jemand was?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Im Datenblatt zum RFM01 bin ich auf das Sync. Word gestoßen:
    http://www.hoperf.com/pdf/rf01.pdf (Seite 17)

    Als FIFO Start-Bedingungen kann man wahlweise festlegen:
    1 - VDI
    2 - Sync. Word
    3 - VDI && Sync. Word
    4 - Always

    VDI (Valid Data Indicator) ist klar, aber was genau ist das Sync. Byte?
    Eine feste Bitfolge? Wenn ja welche? Kann man die ändern?

    Mit Bit 1 (ff) vom Output and FIFO Mode Command aktiviert man den FIFO-Fill nach Synchrone Word Empfang. Reset mit 0/1 Schalten.

    Als einzige weitere Nennung habe ich hier auf Seite 5 was gefunden:
    http://www.hoperf.com/pdf/rf0102tools.pdf
    Beim verwendeten Protokoll für das Demoboard steht hier als Sync Word: &h2D &hD4

    Weiß jemand näheres dazu?

    Zusatzfrage: Die Preamble &hAA &hAA braucht man auch noch? Oder ist das nur, um dem Modul etwas Zeit zum Aufwachen zu geben?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Die 0xAA werden zur Synchronisierung des Empfängers gebraucht, Anschließend muss dann noch 0x2D 0xD4 zum Starten des FiFo gesendet werden.
    Diese Bytes werden aber dann im RFM verworfen und es kommen nur die gesendeten Nutzbytes in den FiFo

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Ah, schön, dass das nirgendwo steht.
    Also gehe ich so vor:
    1 - 3x &HAA senden (Preamble)
    2 - &h2D &hD4 senden (FIFO starten)
    3 - n Daten-Bits senden (wie im Empfänger eingestellt)
    4 - Wenn das eingestelltes Limit erreicht ist wird nIRQ vom Empfänger aktiviert und der µC holt sich den FIFO
    5 - Der FIFO wird dabei automatisch wieder geleert (?)
    6 - Der FIFO wird solange weiter gefüllt, bis man das Sync Word zurücksetzt (ff-Bit 0/1 machen). Das Rücksetzen erledigt der µC, wenn er ein Stopbyte erkennt.

    Preamble und Sync Word kann man nicht ändern, nehme ich an?

    Zusatzfrage:
    Bit 0 (fe) Enable 16 Bit Deep FIFO Mode aktiviert ja den FIFO erst.
    Bits f0 bis f3 geben die Größe des FIFO an. Kann ich davon ausgehen, dass 0 hier 1 bedeutet, weil man ja mit 4 Bit maximal den Wert 15 erreicht kann? Macht Sinn bei 16 Bit Puffer insgesamt, oder?

    Edit:
    Habe Grad noch nen Abschnitt zum Thema Preamble + Sync Word gefunden:
    http://www.hoperf.com/pdf/rf02.pdf - Seite 18/19
    Ist aber auch wenig aussagekräftig.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Im Prinzip ist es so wie Du schreibst
    Ich schick Dir mal nen "C" Programmcode wie ich es gemacht hab

    Zuerst der Sender:
    Code:
    // Sendestring vorbereiten
    void builtstring (void)
    {
    unsigned char uc_stringbuffer[10];
    volatile unsigned char uc_stringlengh;
    
    uc_sendbuffer[0]=0xAA;
    uc_sendbuffer[1]=0xAA;
    uc_sendbuffer[2]=0xAA;
    uc_sendbuffer[3]=0x2D;
    uc_sendbuffer[4]=0xD4;
    uc_sendbuffer[5]='$';
    uc_sendbuffer[6]='3';
    uc_sendbuffer[7]=';';
    uc_sendbuffer[8]='1';
    uc_sendbuffer[9]=';';
    uc_sendbuffer[10]=0x00;
    
    itoa (ui_time,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    ltoa (li_voltage1,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    ltoa (li_voltage2,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    ltoa (li_voltage3,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";0;0;0;0;");
    
    ltoa (li_temp1,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    ltoa (li_temp2,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    ltoa (li_drehzahl,uc_stringbuffer);
    strcat (uc_sendbuffer,uc_stringbuffer);
    strcatf (uc_sendbuffer,";");
    
    checksum(); /* Checksumme ermitteln und anfügen */
    
    // Stringendebytes anfügen
    uc_stringlengh=strlen(uc_sendbuffer);
    uc_sendbuffer[uc_stringlengh]=13;    /* Carriage Return 13*/
    uc_sendbuffer[uc_stringlengh+1]=10;    /* Line Feed 10 */
    uc_sendbuffer[uc_stringlengh+2]=0;     /* Stringende anfügen */
    }
    Nun die Teile vom Empfängercode:
    Code:
    //FIFO Puffer initialisieren bei Fehlern und Datensatzende
    void reset_fifo (void)    
    {
        /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, stop FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001001);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, start FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001011);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        uc_receivebyte=0;
    }
    Code:
    // Empfange Daten vom RFM 01
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
        unsigned char uc_i=0;
        unsigned char uc_buffer=0;
        unsigned char uc_check=0;
        
        
        uc_timeout=0; /* Timeout Zähler zurücksetzen */
        
        /* Die ersten 16 Bit des Statuswortes übergehen */
        #asm ("cbi portb,nsel");
        sendbyte(0b00000000);
        sendbyte(0b00000000); 
        
        for(uc_i=0;uc_i<8;uc_i++)/* 8 Bits auslesen */
        {
            
            
            if ((PINB&(1<<3))!=0) /* SDO abfragen = PortB,3 */
            {
                uc_buffer=(uc_buffer<<1)| 0x01;
            }
            else
            {
                uc_buffer=(uc_buffer<<1);     
            }
            clockpulse();
        }
        #asm ("sbi portb,nsel"); /* nSel Leitung abschalten */
        #asm ("nop");
        
        // Hingen noch Reste im Puffer ? oder Puffer Überlauf -> Dann löschen    
        if((uc_buffer=='$')||(uc_receivebyte>125))
        {
            uc_receivebyte=1;
            uc_receivebuffer[0]='$';     /* Das Erste Byte des Empfangspuffers mit $ beschreiben*/
            uc_receivebuffer[1]=0;             /* Ein Stringende anfügen*/
        }
        else
            {
            uc_receivebuffer[uc_receivebyte]=uc_buffer;
            uc_receivebyte++;
            uc_receivebuffer[uc_receivebyte]=0; /* Stringende anfügen */
            };
             
        if (uc_buffer==10) /* Line Feed wurde empfangen*/ 
        {
            reset_fifo();
            uc_check=checksum();
                                   
            if (uc_check==0)
            {
                newstring=1;
            };
            uc_receivebyte=0;
        }
    }

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •