Forum: Mikrocontroller und Digitale Elektronik RFM12 Beispiel funktioniert nicht


von C. H. (hedie)


Angehängte Dateien:

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
1
unsigned int SPI_External(unsigned int uiData)
2
{
3
  unsigned char   ucCount = 0;
4
  unsigned int   uiReceive = 0;
5
  E_nSEL_0;
6
  while(ucCount != 16)
7
  {
8
    ucCount++;
9
    if((uiData & 0x8000) > 0)  E_SDI_1
10
    else             E_SDI_0;
11
    E_SCK_1;
12
    _delay_us(10);
13
    //uiReceive = (uiReceive | SDO);
14
    if(ucCount != 16) uiReceive = uiReceive << 1;
15
    E_SCK_0;
16
    _delay_us(10);
17
    uiData = uiData << 1;
18
  }
19
  E_nSEL_1;
20
  while(!E_SDO);  //Auf externes Modul Warten
21
  return uiReceive;
22
}
23
24
unsigned int SPI_OnBoard(unsigned int uiData)
25
{
26
  unsigned char   ucCount = 0;
27
  unsigned int   uiReceive = 0;
28
  nSEL_0;
29
  while(ucCount != 16)
30
  {
31
    ucCount++;
32
    if((uiData & 0x8000) > 0)  SDI_1
33
    else             SDI_0;
34
    SCK_1;
35
    _delay_us(10);
36
    //uiReceive = (uiReceive | SDO);
37
    if(ucCount != 16) uiReceive = uiReceive << 1;
38
    SCK_0;
39
    _delay_us(10);
40
    uiData = uiData << 1;
41
  }
42
  nSEL_1;
43
  while(!SDO);  //Auf OnBoard Modul Warten
44
  return uiReceive;
45
}
46
47
48
int main( void )
49
{
50
  //RFM OnBoard
51
  DDRD = (1 << DDD4) | (1 << DDD5) ;                 //Ausgänge bestimmen
52
  DDRB = (1 << DDB0) | (1 << DDB2) | (1 << DDB3) ;         //Ausgänge bestimmen
53
  DDRB &= ~( 1 << DDB4 );                      //Eingang bestimmen
54
  DDRB &= ~( 1 << DDB1 );                      //Eingang bestimmen
55
56
  //////RFM External
57
  DDRD &= ~( 1 << DDD1 );                      //Eingang bestimmen
58
  DDRD = (1 << DDD2) | (1 << DDD3) | (1 << DDD0) ;         //Ausgänge bestimmen
59
60
  nSEL_1;
61
  SDI_0;
62
  SCK_0;
63
  E_nSEL_1;
64
  E_SDI_0;
65
  E_SCK_0;
66
67
  _delay_ms(50);
68
69
  SPI_OnBoard(0xC0E0);  //Clock einstellungen (Ausgang)
70
  SPI_OnBoard(0x80E7);  //FIFO Aktivieren
71
  SPI_OnBoard(0xC2AB);  //Daten Filter
72
  SPI_OnBoard(0xCA81);  //FIFO Modus
73
  SPI_OnBoard(0xE000);  //Disable Wakeuptimer
74
  SPI_OnBoard(0xC800);  //Disable low Duty Cycle
75
  SPI_OnBoard(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
76
  SPI_OnBoard(0xA680);  //Frequenz auf: 868.32MHz
77
  SPI_OnBoard(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
78
  SPI_OnBoard(0xC623);  //Datenrate: 9.54kbps
79
  SPI_OnBoard(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift
80
81
  SPI_External(0xC0E0);  //Clock einstellungen (Ausgang)
82
  SPI_External(0x80E7);  //FIFO Aktivieren
83
  SPI_External(0xC2AB);  //Daten Filter
84
  SPI_External(0xCA81);  //FIFO Modus
85
  SPI_External(0xE000);  //Disable Wakeuptimer
86
  SPI_External(0xC800);  //Disable low Duty Cycle
87
  SPI_External(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
88
  SPI_External(0xA680);  //Frequenz auf: 868.32MHz
89
  SPI_External(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
90
  SPI_External(0xC623);  //Datenrate: 9.54kbps
91
  SPI_External(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift
92
93
94
  while(1)
95
  {
96
    while(!taster);
97
    LED_gn_1;
98
    SPI_External(0x0000);  //Status Register auslesen
99
    SPI_OnBoard(0x0000);  //Status Register auslesen
100
101
    SPI_OnBoard(0x82C8);  //Rx Einschalten
102
    SPI_OnBoard(0xCA81);  //FIFO Modus setzen
103
    SPI_OnBoard(0xCA83);  //FIFO Aktivieren
104
105
    SPI_External(0x8238);  //TX Enable
106
    SPI_External(0xB8AA);  //Senden wie im Beispiel
107
    SPI_External(0xB8AA);  //Senden wie im Beispiel
108
    SPI_External(0xB8AA);  //Senden wie im Beispiel
109
    SPI_External(0xB82D);  //Senden wie im Beispiel
110
    SPI_External(0xB8D4);  //Senden wie im Beispiel
111
112
    SPI_External(0xB8AA);  //Eigentliche Daten Senden AA
113
114
    SPI_External(0x8208);  //Tx Deaktivieren
115
116
    SPI_OnBoard(0xB000);  //FIFO Auslesen
117
    SPI_OnBoard(0x8208);  //Rx Deaktivieren
118
119
    LED_gn_0;
120
    while(taster);
121
  }
122
}

von C. H. (hedie)


Lesenswert?

Ich habe etwas merkwürdiges festgestellt.

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

Durch diese ersetze
1
SPI_OnBoard(0x82C8);  //Rx Einschalten
2
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

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Hier sind nun die Bilder :)

Hoffe da sieht jemand etwas verdächtiges

Von oben nach unten

nSEL
SCK
SDI
SDO

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.