Forum: Mikrocontroller und Digitale Elektronik RFM 12 Modul gibt nichts aus


von Michael B. (michael_b)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

ich wollte in dernschuel einen Chat mit dem RFM 12 Modul realisieren. Da 
ich elektor abonnent bin, dachte ich mir ich nehme das Heft zur Hilfe. 
Nun stolpere ich immer beim Wait rfm12 Befehl. In dieser Funktion setze 
ich den Chipselect aso nSEL auf 0 und warte bis der Datenausgang SDO auf 
"high" geht. Dies macht dieser aber nie.

Hätte jemand eine Idee was der "Bock" sein könnte?

Danke schon im Vorraus

Hier noch der Programmcode:

/*********************************************************************** 
***********\
* Dateiname: rfm12_treiber.c
*
* Projekt  : uP-Grundausbildung AE2
* Hardware : SIRIUS 20-A mit H8/36049F
*
* Copyright: msw-winterthur, AE2
*
* Beschreibung:
*
*
*
*
* Datum:      Autor:         Version,  Grund der Änderung:
* 01.10.2010  M. Brunner     V1.0      Neuerstellung
*
\*********************************************************************** 
***********/

#include "iodefine.h"                  //H8/36049F I/O-Definitionen
#include "AE2_define.h"                //Port-Definitionen, 
Grundausbildung AE2

#define NSEL IO.PDR6.BIT.B0
#define SCK  IO.PDR6.BIT.B1
#define SDI  IO.PDR6.BIT.B3
#define SDO  IO.PDR6.BIT.B2


/*********************************************************************** 
***********\
* wait_1us
*
* Wartet die angegebene Zeit (Basis: Behfehls-Ausführungszeit)
* faktor  =  Wartezeit: faktor * 1us (faktor: 1..65635)
\*********************************************************************** 
***********/

void wait_1us(unsigned int uiWert)
{
  uiWert = uiWert << 1;
  while(--uiWert)
  {
    uiWert++;
    uiWert--;
  }
}

/* Hauptprogramm 
******************************************************************/
void wait_rmf12(void)
{
  NSEL = 0;
  while(SDO != 1);
}


/*********************************************************************** 
******/

void send_spi(unsigned int uiDin2)
{
  unsigned int uiEnddata = 0xB800;
  unsigned int uiZwischenspeicher = 0;
  unsigned char ucAusgabe = 0;
  unsigned char ucZaehler = 15;
  unsigned char i = 0;



  NSEL = 0;
  wait_1us(5);
  for(i=0; i<16; i++)
  {
    uiZwischenspeicher = uiDin2;
    uiZwischenspeicher = uiZwischenspeicher >> ucZaehler;
    uiZwischenspeicher = uiZwischenspeicher & 0x0001;
    if(uiZwischenspeicher == 1)
    {
      SDI = 1;
      wait_1us(3);
      SCK = 1;
      wait_1us(10);
    }
    else
    {
      SDI = 0;
      wait_1us(3);
      SCK = 1;
      wait_1us(10);
    }
    SCK = 0;
    wait_1us(5);
    SDI = 0;
    ucZaehler--;
    wait_1us(10);
  }
  wait_1us(5);
  NSEL = 1;
}

/*********************************************************************** 
******/

void send_rfm12(unsigned int uiDin)
{
  unsigned int uiEnddata = 0xB800;
  unsigned int uiZwischenspeicher = 0;
  unsigned char ucAusgabe = 0;
  unsigned char ucZaehler = 15;
  unsigned char i = 0;

  uiZwischenspeicher = uiDin | 0xFF00;
  uiEnddata = (uiEnddata & uiZwischenspeicher);
  uiDin = uiEnddata;

  NSEL = 0;
  for(i=0; i<16; i++)
  {
    uiZwischenspeicher = uiDin;
    uiZwischenspeicher = uiZwischenspeicher >> ucZaehler;
    uiZwischenspeicher = uiZwischenspeicher & 0x0001;
    if(uiZwischenspeicher == 1)
    {
      SDI = 1;
      SCK = 1;
      wait_1us(5);
    }
    else
    {
      SDI = 0;
      SCK = 1;
      wait_1us(5);
    }
    SDI = 0;
    SCK = 0;
    ucZaehler--;
    wait_1us(5);
  }
  NSEL = 1;

}

/*********************************************************************** 
******/
void init_rfm12(void)
{
  NSEL = 1;
  SCK = 0;
  SDI = 0;

  send_spi(0x80E7);
  send_spi(0x82D9);
  send_spi(0xA67C);
  send_spi(0xC647);
  send_spi(0x94A0);
  send_spi(0xC2AC);
  send_spi(0xCA81);
  send_spi(0xC483);
  send_spi(0x9854);
  send_spi(0xE000);
  send_spi(0xC800);
  send_spi(0xC000);

  /*send_spi(0xC0E0);    // AVR CLK: 10MHz
  send_spi(0x80D7);    // Enable FIFO
  send_spi(0xC2AC);    // Data Filter
  send_spi(0xCA81);    // FIFO mode
  send_spi(0xE000);    // disable wakeuptimer
  send_spi(0xC800);    // disable low duty cycle*/
}

/*********************************************************************** 
***********/



/*********************************************************************** 
******/


void main(void)
{
  unsigned char i;
  PortInitAE2();                       //Einstellungen Grundausbildung 
AE2
  IO.PCR6 = 0xFB;
  init_rfm12();
  send_spi(0x8238);
  while(1)
  {
    wait_rmf12();
    send_spi(0xB8AA);
  }
}

von R. W. (quakeman)


Lesenswert?

Bist du sicher, dass dein SDO Pin am Controller auch bidirektional 
arbeitet?
Denn du musst ja Daten dadrüber ausgeben und gleichzeitig bei der 
Abfrage von SDO den externen Status auch einlesen können und nicht den 
Wert, den du selber zuletzt dadrauf ausgegeben hast.

Alternativ habe ich mal deine Register beim Initialisieren mit meinen 
verglichen. Es gibt nur geringe Unterschiede, aber dabei ist nichts, was 
dieses Verhalten auslösen könnte. Du hast auch nicht angegeben auf 
welcher Frequenz du arbeitest. Deine Einstellungen des RFM12 besagen, 
dass du im 868 MHZ Band mit genau 868,3 MHz arbeitest.

Hier mal ein Vergleich deiner Init Werte zu meinen (nur die 
unterschiedlichen Register habe ich aufgeführt, erster Wert von dir, 
zweiter Wert von mir):

setting command
1000 0000 1110 0111  // el , ef , 11.5pf, 866 MHz band
1000 0000 1101 0111  // el , ef , 11.5pf, 433 MHz band

power management
1000 0010 1101 1001  // er , ebb , !et , es , ex , !eb , !ew , dc
1000 0010 1100 1001  // er , ebb , !et , !es , ex , !eb , !ew , dc

frequency setting
1010 0110 0111 1100  // 868,3 MHz
1010 0110 0100 0000  // 434,00 MHz

data rate command
1100 0110 0100 0111  // 4.8kbps
1100 0110 0010 0011  // 9.6kbps

receiver control command
1001 0100 1010 0000  // Vdi , Fast , 67 kHz Bandbreite, -14db , -79dbm
1001 0100 1100 0100  // Vdi , Fast , 67 kHz Bandbreite, 0db , -79dbm

afc command
1100 0100 1000 0011  // @pwr , keine Beschränkung , !st , !fi , oe , en
1100 0100 1001 0011  // @pwr , +15/-16 f(res) , !st , !fi , oe , en

tx configuration control
1001 1000 0101 0100  // 90 kHz Frequenzhub, tx-power -12 dB, !mp
1001 1000 0010 0111  // 45 kHz Frequenzhub, tx-power -21 dB, !mp


So auf den ersten Blick kann ich ansonsten auch keinen Fehler erkennen. 
Am besten wäre es, wenn du einen Logik Analyzer hättest um die 
Kommunikation real beobachten zu können.

Ciao,
     Rainer

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.