Forum: Mikrocontroller und Digitale Elektronik RFM12B - Wozu sendet man drei Dummybytes?


von Olaf (Gast)


Lesenswert?

Hallo,

warum sendet man nach den Datenwörtern noch drei Dummybytes (0xAA) bei 
der Senderoutine des RFM12B. Sende ich gar kein Dummybyte hinterher, 
werden scheinbar Zufallswörter empfangen. Sende ich ein oder mehr 
Dummybytes mit funktioniert es. Was passiert da genau? Muss da ein 
Puffer gefüllt werden?

Gruß
Olli

von C. H. (hedie)


Lesenswert?

Nein

Die Dummybytes dienen dazu, das sich das RFM Modul Synchronisieren kann.
Durch Bittoggeling also Abwechselnd 0 und 1 kann es sich perfekt ein 
Tunen.

Alles was danach kommt wird somit korrekt empfangen...

Kannst du mir mal deine Initialisierung Posten?

Ich beschäftige mich derzeit auch mit den RFM12 Modulen.

Bei mir hapert es jedoch mit dem empfang.

Siehe hier: Beitrag "RFM12 Beispiel funktioniert nicht"

von Olli (Gast)


Lesenswert?

Hallo Claudio,

was die Synchronisation betrifft habe ich in der Initialisierungsphase 2 
Synchronisationsbytes eingestellt. 0x2D ist standard und 0xD4 ist das 
zweite Synchronisationsbyte. Beim Senden schicke ich drei 0xAA 
Dummybytes voraus und mindestens eines nach den Datenbytes hinterher. 
Von den 0xAA-Bytes ist im Datenblatt soweit ich es gelesen habe nicht 
die Rede - wohl aber tauchen sie im Beispielcode auf: (Seite 16 - 
RFM12B_code)
1
RF12_SEND(0xAA);//PREAMBLE
2
RF12_SEND(0xAA);//PREAMBLE
3
RF12_SEND(0xAA);//PREAMBLE
4
RF12_SEND(0x2D);//SYNC HI BYTE
5
RF12_SEND(0xD4);//SYNC LOW BYTE
6
RF12_SEND(0x30);//DATA BYTE 0
7
ChkSum+=0x30;
8
RF12_SEND(0x31);//DATA BYTE 1
9
ChkSum+=0x31;
10
RF12_SEND(0x32);
11
ChkSum+=0x32;
12
RF12_SEND(0x33);
13
ChkSum+=0x33;
14
RF12_SEND(0x34);
15
ChkSum+=0x34;
16
RF12_SEND(0x35);
17
ChkSum+=0x35;
18
RF12_SEND(0x36);
19
ChkSum+=0x36;
20
RF12_SEND(0x37);
21
ChkSum+=0x37;
22
RF12_SEND(0x38);
23
ChkSum+=0x38;
24
RF12_SEND(0x39);
25
ChkSum+=0x39;
26
RF12_SEND(0x3A);
27
ChkSum+=0x3A;
28
RF12_SEND(0x3B);
29
ChkSum+=0x3B;
30
RF12_SEND(0x3C);
31
ChkSum+=0x3C;
32
RF12_SEND(0x3D);
33
ChkSum+=0x3D;
34
RF12_SEND(0x3E);
35
ChkSum+=0x3E;
36
RF12_SEND(0x3F); //DATA BYTE 15
37
ChkSum+=0x3F;
38
RF12_SEND(ChkSum); //send chek sum
39
RF12_SEND(0xAA);//DUMMY BYTE
40
RF12_SEND(0xAA);//DUMMY BYTE
41
RF12_SEND(0xAA);//DUMMY BYTE

Meinen die anderen auch, dass es sich um Synchronisation handelt?

Grüße
Olli

von Gastino G. (gastino)


Lesenswert?

Die Dummy-Bytes werden verschickt, damit man den Sender nicht zu zeitig 
abschaltet und damit das letzte Byte abwürgt. Wenn der Schreibpuffer 
wieder beschreibbar ist, heißt das ja noch nicht, dass der Sender schon 
mit dem Versand des letzten Bytes auch wirklich fertig ist.
Man braucht übrigens, wenn ich mich recht erinnere, nur ein Dummy-Byte.

von C. H. (hedie)


Lesenswert?

Hallo Olli

Danke für deinen Code...

Könntest du mir noch deine Initialisierung Posten?

Vielen Dank :)

von Olli (Gast)


Lesenswert?

@ Gastino :

Ja, die Erfahrung, dass man nur ein Dummybyte braucht habe ich auch 
gemacht.

@ Claudio :

Ich poste hier den Code, allerdings läuft der in einem Picoblaze ab und 
ist per Hardware-SPI an das Modul gepappt. Ich schreibe demnächst auch 
eine kleine Doku dazu, wenn ich daran denke poste ich dann noch den Link 
hier.
Viel Erfolg damit:
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                            ;;
3
;; RFM12B control functions, used for wireless communication                  ;;
4
;;                                                                            ;;
5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
7
          ;
8
          ; initialize 
9
          ;
10
          ;; 80E7 - el, ef, 868MHZ, 16pF load capacitance  
11
          ;; 8239 - !er, !ebb, et, es, ex, !eb, !ew, dc
12
          ;; A74E
13
          ;; C647
14
          ;; 94A0
15
          ;; C2AC
16
          ;; CA81
17
          ;; CED4
18
          ;; C483
19
          ;; 9820
20
          ;; CC77
21
          ;; E000
22
          ;; C800
23
          ;; C040
24
init_rfm12b:
25
          LOAD GP_REG1, 80
26
          LOAD GP_REG2, E7
27
          CALL spi_exchange
28
          
29
          LOAD GP_REG1, 82
30
          LOAD GP_REG2, 39
31
          CALL spi_exchange
32
          
33
          LOAD GP_REG1, A7
34
          LOAD GP_REG2, 4E
35
          CALL spi_exchange
36
          
37
          LOAD GP_REG1, C6
38
          LOAD GP_REG2, 47
39
          CALL spi_exchange
40
          
41
          LOAD GP_REG1, 94
42
          LOAD GP_REG2, A0
43
          CALL spi_exchange
44
          
45
          LOAD GP_REG1, C2
46
          LOAD GP_REG2, AC
47
          CALL spi_exchange
48
          
49
          LOAD GP_REG1, CA
50
          LOAD GP_REG2, 81
51
          CALL spi_exchange
52
          
53
          LOAD GP_REG1, CE
54
          LOAD GP_REG2, D4
55
          CALL spi_exchange
56
          
57
          LOAD GP_REG1, C4
58
          LOAD GP_REG2, 83
59
          CALL spi_exchange
60
          
61
          LOAD GP_REG1, 98
62
          LOAD GP_REG2, 20
63
          CALL spi_exchange
64
          
65
          LOAD GP_REG1, CC
66
          LOAD GP_REG2, 77
67
          CALL spi_exchange
68
          
69
          LOAD GP_REG1, E0
70
          LOAD GP_REG2, 00
71
          CALL spi_exchange
72
          
73
          LOAD GP_REG1, C8
74
          LOAD GP_REG2, 00
75
          CALL spi_exchange
76
          
77
          LOAD GP_REG1, C0
78
          LOAD GP_REG2, E0
79
          CALL spi_exchange
80
          
81
          RETURN
82
          
83
          ;
84
          ; sends several bytes to another RFM module
85
          ;
86
          ;; DATA_DESTINATION_REG specifies where data to send is located in scratchpad RAM
87
          ;; DATA_LENGTH_REG indicates the length of the string to transmit
88
send_rfm12b:
89
          LOAD GP_REG1, 82
90
          LOAD GP_REG2, 38
91
          CALL spi_exchange
92
          
93
          LOAD RFM_DATA_REG, AA
94
          CALL put_rfm12b          ; 0xAA
95
          CALL put_rfm12b          ; 0xAA
96
          CALL put_rfm12b          ; 0xAA
97
          LOAD RFM_DATA_REG, 2D
98
          CALL put_rfm12b          ; 0x2D
99
          LOAD RFM_DATA_REG, D4
100
          CALL put_rfm12b          ; 0xD4
101
          
102
 send_byte_rfm12b:
103
          FETCH RFM_DATA_REG, (DATA_DESTINATION_REG)
104
          CALL put_rfm12b
105
          SUB DATA_LENGTH_REG, 01
106
          JUMP NZ, send_byte_rfm12b
107
          
108
          LOAD RFM_DATA_REG, AA
109
          ;CALL put_rfm12b          ; 0xAA ###############
110
          ;CALL put_rfm12b          ; 0xAA ###############
111
          CALL put_rfm12b          ; 0xAA
112
          
113
 send_rgit_wait:
114
          LOAD GP_REG1, 00
115
          LOAD GP_REG2, 00
116
          CALL spi_exchange
117
          TEST GP_REG1, 80
118
          JUMP Z, send_rgit_wait
119
          
120
          LOAD GP_REG1, 82
121
          LOAD GP_REG2, 08
122
          CALL spi_exchange
123
          
124
          RETURN
125
          
126
          ;
127
          ; receives several bytes from another RFM module
128
          ;
129
          ;; DATA_DESTINATION_REG specifies where received data is located in scratchpad RAM
130
          ;; DATA_LENGTH_REG indicates the length of the string to receive
131
receive_rfm12b:
132
          LOAD GP_REG1, 82
133
          LOAD GP_REG2, 99
134
          CALL spi_exchange
135
          
136
          LOAD GP_REG1, CA
137
          LOAD GP_REG2, 81
138
          CALL spi_exchange
139
          
140
          LOAD GP_REG1, CA
141
          LOAD GP_REG2, 83
142
          CALL spi_exchange
143
          
144
 receive_byte_rfm12b:
145
          CALL get_rfm12b
146
          STORE RFM_DATA_REG, (DATA_DESTINATION_REG)
147
          ADD DATA_DESTINATION_REG, 01
148
          SUB DATA_LENGTH_REG, 01
149
          JUMP NZ, receive_byte_rfm12b
150
          
151
 receive_ffit_wait:
152
          LOAD GP_REG1, 00
153
          LOAD GP_REG2, 00
154
          CALL spi_exchange
155
          TEST GP_REG1, 80
156
          JUMP Z, receive_ffit_wait
157
          
158
          LOAD GP_REG1, 82
159
          LOAD GP_REG2, 08
160
          CALL spi_exchange
161
          
162
          RETURN
163
          
164
put_rfm12b:
165
          LOAD GP_REG1, 00
166
          LOAD GP_REG2, 00
167
          CALL spi_exchange
168
          TEST GP_REG1, 80
169
          JUMP Z, put_rfm12b
170
          
171
          LOAD GP_REG1, B8
172
          LOAD GP_REG2, RFM_DATA_REG
173
          CALL spi_exchange
174
          
175
          RETURN
176
          
177
get_rfm12b:
178
          LOAD GP_REG1, 00
179
          LOAD GP_REG2, 00
180
          CALL spi_exchange
181
          TEST GP_REG1, 80
182
          JUMP z, get_rfm12b
183
          
184
          LOAD GP_REG1, B0
185
          LOAD GP_REG2, 00
186
          CALL spi_exchange
187
          LOAD RFM_DATA_REG, GP_REG2
188
          
189
          RETURN

von Olli (Gast)


Lesenswert?

@Claudio:
Anmerkung:
Den Code, den ich davor gepostet habe, ist dem Datenblatt entnommen.

von C. H. (hedie)


Lesenswert?

Olli schrieb:
> Ich poste hier den Code, allerdings läuft der in einem Picoblaze ab und
> ist per Hardware-SPI an das Modul gepappt

Danke für den Code

Ich hab deine Initialisierung 1:1 Übernommen.

Auch das senden habe ich genau so gemacht.

Jedoch klappt es nicht :(

Meine Module liegen 5 cm voneinander entfernt.


Nach dem ich gesendet habe, lese ich beim empfanger Modul das 
Statusregister aus. Diese zeigt merkwürdigerweise bei nach jedem senden 
un auslesen etwas anderes an :S

Nach dem ich das Statusregister ausgelesen habe, springt nIRQ auf High
Die solange bis ich den RX Deaktiviere.

Sehr merkwürdig oder?

von Olli (Gast)


Lesenswert?

* Hast du eine Antenne angelötet?
* Wie sieht deine Empfangsroutine aus?

Gruß

von Sörn (Gast)


Lesenswert?

Schonmal darüber nachgedacht eine fertige library dafür zu nehmen? Ich 
sehe hier immer wieder threads aufpoppen, bei denen Leute fragen zu 
RF12(B) ICs stellen - okay zugegeben - die datenblätter sind echt 
schlecht... Aber ich verstehe nicht warum man nicht einfach was fertiges 
benutzen oder zumindest daraus abgucken kann...

Hier mal eine Auswahl:
* http://github.com/ethersex/ethersex/tree/master/hardware/radio/rfm12/
* http://das-labor.org/wiki/RFM12_library
* http://cafe.jeelabs.net/sw/library_-_rf12/

von Holger S. (holli_1)


Lesenswert?

Olaf schrieb:
> warum sendet man nach den Datenwörtern noch drei Dummybytes (0xAA) bei
> der Senderoutine des RFM12B. Sende ich gar kein Dummybyte hinterher,
> werden scheinbar Zufallswörter empfangen. Sende ich ein oder mehr
> Dummybytes mit funktioniert es. Was passiert da genau? Muss da ein
> Puffer gefüllt werden?

Richtig, wenn du den Sendepuffer des RFM12 verwendest, musst du an Ende 
noch 2 (Dummy)Bytes in den Puffer schieben. Damit werden deine letzten 2 
Datenbytes auch aus dem Puffer noch gesendet. Sonst bekommst du wie 
beobachtet diese Zufallswörter, da die Daten im Puffer stecken bleiben. 
Ob es 0xAA ist oder etwas anderes ist letztendlich egal.

Zu Beginn der Übertragung brauchst du die Dummybytes eigentlich auch 
nicht zu übertragen, da der RFM 2 Dummybytes automatisch erzeugt. Bei 
et=0 wird der Sendepuffer automatisch auf 0xAA gesetzt. Diese werden 
dann beim Übertragen der Sync bytes gesendet.

von Gastino G. (gastino)


Lesenswert?

Sörn schrieb:
> Schonmal darüber nachgedacht eine fertige library dafür zu nehmen?

Kann man machen, muss man aber nicht. Manche haben auch den Anspruch, 
detailliert zu verstehen, wie das funktioniert. Und das geht nun mal am 
besten, wenn man es selber macht. Vom sportlichen Gedanken mal ganz 
abgesehen...

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.