www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 Beispiel funktioniert nicht


Autor: Claudio H. (hedie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche schon seit ein paar tagen ein RFM12 Modul zum laufen zu 
kriegen.

Zu testzwecken habe ich das Beispielprogramm aus diesem Thread
Beitrag Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" mal zur hilfe 
verwendet.

Ich habe die initialisierung, power on etc 1:1 kopiert. Mit ausnahme der 
Frequenz
einstellung. Diese habe ich auf meine 868MHz angepasst.

Auf meinem Testboard befindet sich ein RFM12 Modul mit 
minimalbeschaltung (nSEL, SCK, SDI, SDO)
nFSS ist mit Pullup nach high geschaltet. Zudem befindet sich noch ein 
Externes RFM12 Modul am Attiny2313 (Ich wollte zum test mit einem Senden 
und mit dem anderen empfangen)

Doch leider empfange ich immer 0x00 wie man im Diagram gut sieht :(
Ich hoffe jemand sieht den fehler oder hat eine idee...




Im anhang findet sich die Logische Analyse :)
Also die Signale nach einem Tasterdruck
Ich habe die Signale mit OpenLogic aufgenommen. Programm ist mit dabei
Keine Installation notwendig!

Hier mein C Code

Das E_ bedeutet das es die Pins des Externen Moduls sind!
SDI_1 ist eingeschaltet und SDI_0 Ausgeschaltet
unsigned int SPI_External(unsigned int uiData)
{
  unsigned char   ucCount = 0;
  unsigned int   uiReceive = 0;
  E_nSEL_0;
  while(ucCount != 16)
  {
    ucCount++;
    if((uiData & 0x8000) > 0)  E_SDI_1
    else             E_SDI_0;
    E_SCK_1;
    _delay_us(10);
    //uiReceive = (uiReceive | SDO);
    if(ucCount != 16) uiReceive = uiReceive << 1;
    E_SCK_0;
    _delay_us(10);
    uiData = uiData << 1;
  }
  E_nSEL_1;
  while(!E_SDO);  //Auf externes Modul Warten
  return uiReceive;
}

unsigned int SPI_OnBoard(unsigned int uiData)
{
  unsigned char   ucCount = 0;
  unsigned int   uiReceive = 0;
  nSEL_0;
  while(ucCount != 16)
  {
    ucCount++;
    if((uiData & 0x8000) > 0)  SDI_1
    else             SDI_0;
    SCK_1;
    _delay_us(10);
    //uiReceive = (uiReceive | SDO);
    if(ucCount != 16) uiReceive = uiReceive << 1;
    SCK_0;
    _delay_us(10);
    uiData = uiData << 1;
  }
  nSEL_1;
  while(!SDO);  //Auf OnBoard Modul Warten
  return uiReceive;
}


int main( void )
{
  //RFM OnBoard
  DDRD = (1 << DDD4) | (1 << DDD5) ;                 //Ausgänge bestimmen
  DDRB = (1 << DDB0) | (1 << DDB2) | (1 << DDB3) ;         //Ausgänge bestimmen
  DDRB &= ~( 1 << DDB4 );                      //Eingang bestimmen
  DDRB &= ~( 1 << DDB1 );                      //Eingang bestimmen

  //////RFM External
  DDRD &= ~( 1 << DDD1 );                      //Eingang bestimmen
  DDRD = (1 << DDD2) | (1 << DDD3) | (1 << DDD0) ;         //Ausgänge bestimmen

  nSEL_1;
  SDI_0;
  SCK_0;
  E_nSEL_1;
  E_SDI_0;
  E_SCK_0;

  _delay_ms(50);

  SPI_OnBoard(0xC0E0);  //Clock einstellungen (Ausgang)
  SPI_OnBoard(0x80E7);  //FIFO Aktivieren
  SPI_OnBoard(0xC2AB);  //Daten Filter
  SPI_OnBoard(0xCA81);  //FIFO Modus
  SPI_OnBoard(0xE000);  //Disable Wakeuptimer
  SPI_OnBoard(0xC800);  //Disable low Duty Cycle
  SPI_OnBoard(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
  SPI_OnBoard(0xA680);  //Frequenz auf: 868.32MHz
  SPI_OnBoard(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
  SPI_OnBoard(0xC623);  //Datenrate: 9.54kbps
  SPI_OnBoard(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift

  SPI_External(0xC0E0);  //Clock einstellungen (Ausgang)
  SPI_External(0x80E7);  //FIFO Aktivieren
  SPI_External(0xC2AB);  //Daten Filter
  SPI_External(0xCA81);  //FIFO Modus
  SPI_External(0xE000);  //Disable Wakeuptimer
  SPI_External(0xC800);  //Disable low Duty Cycle
  SPI_External(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
  SPI_External(0xA680);  //Frequenz auf: 868.32MHz
  SPI_External(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
  SPI_External(0xC623);  //Datenrate: 9.54kbps
  SPI_External(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift


  while(1)
  {
    while(!taster);
    LED_gn_1;
    SPI_External(0x0000);  //Status Register auslesen
    SPI_OnBoard(0x0000);  //Status Register auslesen

    SPI_OnBoard(0x82C8);  //Rx Einschalten
    SPI_OnBoard(0xCA81);  //FIFO Modus setzen
    SPI_OnBoard(0xCA83);  //FIFO Aktivieren

    SPI_External(0x8238);  //TX Enable
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB82D);  //Senden wie im Beispiel
    SPI_External(0xB8D4);  //Senden wie im Beispiel

    SPI_External(0xB8AA);  //Eigentliche Daten Senden AA

    SPI_External(0x8208);  //Tx Deaktivieren

    SPI_OnBoard(0xB000);  //FIFO Auslesen
    SPI_OnBoard(0x8208);  //Rx Deaktivieren

    LED_gn_0;
    while(taster);
  }
}

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe etwas merkwürdiges festgestellt.

Wenn ich diese Zeilen aus dem ursprünglichen Code
SPI_OnBoard(0x82C8);  //Rx Einschalten
SPI_OnBoard(0xCA81);  //FIFO Modus setzen
SPI_OnBoard(0xCA83);  //FIFO Aktivieren

Durch diese ersetze
SPI_OnBoard(0x82C8);  //Rx Einschalten
SPI_OnBoard(0xCA07);  //FIFO Aktivieren //Permanentes Empfangen

Dann kann ich etwas empfangen.
Ich weiss jedoch nicht was. Also ich gehe davon aus das es Datenmüll 
ist.

Nun liegt eigentlich die Vermutung nahe, das mein Sender nicht die 
nötige Präambel AA sowie das Bit Pattern also 2DD4 sendet.

Ich habe vor einigen jahren mal den E-Smog tester aus dem Elektor Heft 
nachgebaut. Dieser zeigt eine Strahlungszunahme nach betätigen des 
Tasters an. Somit denke ich wird gesendet. (Besonders in der Nähe des 
Senders!)

Merkwürdigerweise, bleibt die SDO Leitung beim Ursprünglichen Code 
permanent Low (Bild4).    Wenn ich jedoch permanent ohne Mustererkennung 
empfange ist sie Das erste byte High und zeigt danach die Daten. (Bild3)
Ist das normal? (Bilder im nexten Beitrag da man nicht Editen kann!)

Wie gehe ich hier am besten vor um den Fehler zu finden?
Ich habe die Initialisierung absolut identisch wie im Beispiel
mit der ausnahme der Frequenz!

Danke Schonmal

Autor: Claudio H. (hedie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier sind nun die Bilder :)

Hoffe da sieht jemand etwas verdächtiges

Von oben nach unten

nSEL
SCK
SDI
SDO

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.