Forum: Mikrocontroller und Digitale Elektronik XBee-Pro 868 Digital Input


von Silvio F. (silvio123)


Lesenswert?

Hallo

Ich habe 2 XBee-Pro 868 und möchte an einem einen Taster anschließen. 
Der Schaltzustand soll an dem anderen XBee an einem DO ausgegeben 
werden. Ich ahbe jetzt über XCTU folgende Einstellungen vorgenommen:

XBee 1:
ID-7FFF
CE-End Device
D1-4(Digital Out Pin 19)
IC-FFFF (DIO Change Detect)
IR-14 (Sample Rate)

XBee 2:
ID-7FFF
CE-Coordinator
D1-3(Digital Input Pin 19)
IR-14 (Sample Rate)

Die DH und DL Adressen stimmen auch. UART Kommunikation funktioniert.
Aber leider wird der Status vom Taster nicht übertragen.

Jemand eine Idee?

von Silvio F. (silvio123)


Lesenswert?

niemand eine Ahnung wo der Fehler liegen kann?

von Harald (Gast)


Lesenswert?

Wenn bei Digi noch das gleiche Personal wie früher bei Maxstream im 
Support sitzt dann kannst Du die auch als Privatperson problemlos 
andrahten. Z.B. Auch per Email, falls Dir Englisch am Telefon nicht so 
liegen sollte.
http://www.digi.com/support/productdetail?pid=3553

Ansonsten kann ich mich erinnern, dass einige Features erst sehr spät in 
der Firmware hinzugekommen sind obwohl im Manual bereits beschrieben. 
Update ist also obligatorisch!

von Harald (Gast)


Lesenswert?

Komme nochmal drauf zurück, lese mal die Firmware History für 1.61...

http://ftp1.digi.com/support/firmware/93009379_E.txt

von Silvio F. (silvio123)


Lesenswert?

Hallo. Danke für die Antwort.

Habe die neuste Firmware drauf. Auch habe ich es mit der normalen 
Firmware und mit der für AIO/DIO adapters versucht. Das ergebnis war 
gleich. Mal abwarten was die vom Supportteam sagen.

Danke erstmal

von indi (Gast)


Lesenswert?

ich meine, ich hatte CE auf 0. Probier das mal bei beiden Modulen.

von Silvio F. (silvio123)


Lesenswert?

Also mit CE=0 bei Beiden gehts auch nicht. Woher weiß der 2. XBee, dass 
er das Eingangssignal vom XBee von Pin 19 auch an PIN 19 ausgeben soll?

von Michael S. (Gast)


Lesenswert?

Hallo,

man kann ein XBee-Modul so konfigurieren, dass es bei einem PinChange 
eine Nachricht sendet.
Und man kann an einem lokalen oder entfernten XBee-Modul Pins schalten.

Beides nacheinander geht natürlich genauso.
Aber nicht ohne externe Hilfe.

Du musst einen Controller spendieren, der die Nachricht über den 
PinChange registriert und daraufhin einen Pin schaltet.

Michael S.

von Silvio F. (silvio123)


Lesenswert?

Also der Support von Digi hilft nur wenn man ein teureres Paket bucht.
Habe unteranderem diese Seite gefunden, die beschreibt wie es geht:
http://examples.digi.com/sensors/802-15-4-digital-input-with-a-button/5/

oder das hier

https://www.youtube.com/watch?v=CLQEo2Ow1Qs

Aber leider wird dabei ein anderer XBee verwendet, so dass die 
Einstellungen bei meinen etwas anders sind.

Habt ihr eine Idee wie man den XBee 868 auch so einstellen kann?

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Der Support hilft nur gegen Geld? Was ist das denn? Vielleicht mal bei 
Digi in Dortmund anrufen (wenn es die da noch gibt). Ansonsten, wenn es 
nicht funktioniert hier schon mal eine Alternative
http://www.radiocrafts.com/uploads/rcxxxx(hp)-tm_data_sheet_1_42.pdf

RC1180(HP)-TM

von Silvio F. (silvio123)


Lesenswert?

Ich hab das ganze jetzt soweit das ich den Empfänger im API modus 
betreibe und die Daten des Schalters über UART bekomme.

Die Daten die ich empfange sehen dann so aus:
7E 00 12 92 00 13 A2 00 40 A2 94 45 FF FE 01 01 00 02 00 00 02 FA

Die vorletzte Stelle bedeutet das der Schalter aus ist. Schalte ich den 
Schalter an, sthet dort eine 00.

Habe jetzt meinen 2. XXBee an einen Atmega8 angeschlossen und über RX/TX 
verbunden.

Wollte jetzt die Daten mit BASCOM auswerten um dann einen PIN zu 
schalten, komme aber bei dem Vergleich der HEX Daten nicht so richtig 
voran.

Hat dafür jemand ein Beispielprogramm? Alternativ auch in C?

von Michael S. (Gast)


Lesenswert?

Hallo,

Du bist doch schon fast am Ziel.

Das IO-Frame des Routers hast Du empfangen und den Pin-Status 
ausgelesen.

Jetzt musst Du nur noch ein lokales AT-Command absetzen, das den 
auserwählten Pin am lokalen Device schaltet.

mfg

Michael S.

von Silvio F. (silvio123)


Lesenswert?

Und wie mache ich das mit dem lokalen AT Komando setzten? Muss ich das 
über den Microcontroller machen oder geht das über den XBee?

Beim Microcontroller habe ich das Problem das ich die Hexwerte des 
Strings nicht richtig verglichen bekomme.

Und wenn ich eh den Microcontroller benutzen muss, kann ich ja auch 
gleich einen digitalen Ausgang vom Controller nutzen.
1
$regfile "m8def.dat"
2
$crystal = 3686400
3
$baud = 9600
4
5
Dim S As String * 18 
6
7
On URXC OnRxD
8
Enable URXC
9
Enable Interrupts
10
11
Config Portc.5 = Output
12
Portc.5 = 0
13
14
Do
15
   //Vergleich der Hexwerte
16
17
Loop
18
End
19
20
Onrxd:
21
  'S = S + Chr(udr)
22
  S = Chr(udr)
23
Return

Kann mir jemand bei dem Vergleich auf den HEX Wert helfen?

von Michael S. (Gast)


Lesenswert?

Hallo,

Silvio Franz schrieb:
> Die Daten die ich empfange sehen dann so aus:
> 7E 00 12 92 00 13 A2 00 40 A2 94 45 FF FE 01 01 00 02 00 00 02 FA
>
> Die vorletzte Stelle bedeutet das der Schalter aus ist. Schalte ich den
> Schalter an, sthet dort eine 00.

Du hast das Prozedere mit Worten bereits beschrieben.

Die Bytes des Frames haben eine Bedeutung, die dem Manual zu entnehmen 
sind (das habe ich jetzt nicht vorliegen - ich versuchs aus der 
Erinnerung):

7E 00 12 92 00 13 A2 00 40 A2 94 45 FF FE 01 01 00 02 00 00 02 FA
                                                aa bb    cc dd

aa bb = gibt an, welche Pins als digitaler Inputs geschaltet sind
cc dd = gibt an, wie der Status der Pins ist

Das bedeutet: Pin 2 (welcher auch immer das am Modul ist) ist high.

Wenn Dir bekannt ist, welches der Pin ist, der das IO-Sample auslöst, 
dann reicht es aus, diesen zu testen:

if (dd & 02), dann ist Pin2 high, andernfalls low.


Silvio Franz schrieb:
> Und wenn ich eh den Microcontroller benutzen muss, kann ich ja auch
> gleich einen digitalen Ausgang vom Controller nutzen.

Das ist natürlich richtig.


mfg

Michael S.

von Silvio F. (silvio123)


Lesenswert?

Ja das ist richtig, dass hatte ich auch so verstanden.
mein Problem ist aber den string zu vergleichen.

Jetzt wird in den String S jedes Zeichen geschrieben
1
S = Chr(udr)

Jetzt habe ich den String mit den Zeichen drin.
Jetzt muss z.B. die 21. Stelle auf 02 geprüft werden
1
if HEX(substr(S,20,1))="02" Then

Aber die abfrage bekomme ich nicht so richtig hin

von Michael S. (Gast)


Lesenswert?

Hallo,

Du legst die empfangenen Bytes als String ab:

Silvio Franz schrieb:
> Onrxd:
>   'S = S + Chr(udr)
>   S = Chr(udr)
> Return

Das ist wenig zielführend.

Speichere die Werte in einem Array, denn es handelt sich um 
Integer-Werte.

Dann kannst Du z.B. prüfen, ob im 21. Element das Bit.2 gesetzt ist:

if (my_array[20] & 0x02) ....

mfg

Michael S.

von Silvio F. (silvio123)


Lesenswert?

Danke für eure Hilfe.
Läuft jetzt soweit alles.
Wer wissen will wie man den API-Modus des XBee Pro 868 ausließt, kann 
folgenden Code nehmen. Zusatzlich ließt er noch aus was über UART 
gesendet wird.
1
$regfile "m8def.dat"
2
$crystal = 3686400
3
$baud = 9600
4
$hwstack = 32                                               ' default use 32 for the hardware stack
5
$swstack = 10                                               ' default use 10 for the SW stack
6
$framesize = 40                                             ' default use 40 for the frame space
7
8
Dim S As String * 1                                         'h für hoch, r für runter
9
Dim E(50) As Integer
10
Dim Pos As Integer
11
Dim Zeichen As Integer
12
Dim Stimmtio As Bit
13
Dim Stimmtzeichen As Bit
14
Pos = 1
15
Zeichen = -1
16
17
Do
18
   If S = "h" Then
19
      ...
20
   Elseif S = "r" Then
21
      ...
22
   End If
23
Loop
24
End
25
26
On Urxc Onrxd
27
Enable Urxc
28
Enable Interrupts
29
30
Onrxd:
31
   Zeichen = Udr
32
   If Zeichen = 126 Then                                    'Wenn Zeichen HEX(E7) - Zeichen für Stringanfang
33
      Pos = 1
34
      Stimmtio = 1
35
      Stimmtzeichen = 1
36
   End If
37
38
   If Pos > 50 Then                                         'Wenn Arrayspeicher voll, dann auf 1 zurücksetzen
39
      Pos = 1
40
   End If
41
42
   E(pos) = Zeichen
43
   'Print Pos ; ":" ; E(pos) ; ":" ; Zeichen
44
45
   berprufen ob alle Bits richtig sind
46
   If Pos = 4 Then
47
      If E(pos) <> 146 Then                                 'Sendemodus DI = HEX(92) - wenn ein digitaler Eingang am XBee geschaltet wird
48
         Stimmtio = 0
49
      End If
50
      If E(pos) <> 144 Then                                 'Sendemodus Zeichen = HEX(90) - wenn ein Zeichen über UART gesendet wird
51
         Stimmtzeichen = 0
52
      End If
53
   End If
54
   If Pos = 16 Then                                         '
55
      If Stimmtzeichen = 1 Then                             '
56
         If E(pos) = 114 Then
57
            S = "r"
58
         Elseif E(pos) = 104 Then
59
            S = "h"
60
         End If
61
      End If
62
   End If
63
   If Pos = 17 Then                                         'Erste Stelle Bitmask = 00
64
      If E(pos) <> 0 Then
65
         Stimmtio = 0
66
     End If
67
   End If
68
   If Pos = 18 Then                                         'Zweite Stelle Bitmask = 02
69
      If E(pos) <> 2 Then
70
         Stimmtio = 0
71
      End If
72
   End If
73
   If Pos = 20 Then                                         'Erste Stelle Bit == 00
74
      If E(pos) <> 0 Then
75
         Stimmtio = 0
76
      End If
77
   End If
78
   If Pos = 21 Then                                         'Zwiete Stelle Bit =00(Schalter ein), =02(Schalter aus)
79
      If Stimmtio = 1 Then                                  'Schalter nicht betätigt
80
         If E(pos) = 2 Then
81
            S = "h"
82
         Elseif E(pos) = 0 Then                             'Schalter betätigt
83
            S = "r"
84
         End If
85
      End If
86
   End If
87
   'Zurücksetzen
88
   Pos = Pos + 1
89
90
Return

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.