Forum: Mikrocontroller und Digitale Elektronik BTM-222 wie sicher von online in Command Modus wechseln


von Jürgen S. (jsachs)


Lesenswert?

Hallo,

ich habe ein Projekt wo ich einen AVR Master abwechselnd mit anderen 
AVRs per Funk verbinde.
Als Funkmodul kommt das BTM222 zum Einsatz.
Im Prinzip funktioniert alles bestens, sobald ich zuverlässig im Command 
Modus lande.

Theoretisch muss man ja nur "+++" senden und man kommt in den Command 
Modus.
In der Zwischenzeit warte ich zwischen jedem "+" 30ms und es klappt so 
lala.
3 mal ja und dann nicht mehr....

Das kostet mich nun schon Tage.

Kann mir jemand Tipps geben wie ich das Modul sicher vom Online 
(Verbunden) Modus in den Command Modus bekomme um die Verbindung zu 
wechseln ?
Wie gesagt, bin ich im Command Modus ist alles kein Problem mehr.

Danke
Juergen
von Jürgen S. (jsachs)


Lesenswert?

Aktuell benutze ich folgenden Code und es scheint zu gehen zu 90%
Ich denke man versteht was gemacht wird
1
void connectBTM(uint8_t module)
2
{
3
  char mac[20];
4
  char pin[20];
5
  
6
  if (module==1)
7
  {
8
    sprintf(mac, "00126f21ee95");
9
    sprintf(pin, "1234");
10
  }
11
  else if (module==2)
12
  {
13
    sprintf(mac, "00126f224049");
14
    sprintf(pin, "1234");
15
  }
16
  
17
  uartClearRxBuffer();
18
  uint8_t de=35; // Delay *10ms
19
20
uint8_t z=0;
21
do
22
{
23
  uartClearRxBuffer();
24
  if (z>=3)
25
  {
26
    z=0;
27
    delayTimer(de*3);
28
    uartPuts("\r");  // Erzeugt ERROR wenn bereits im Command Modus
29
    delayTimer(de*3);
30
  }
31
  delayTimer(de);
32
  uartPut('+');
33
  while(uart.txpos > 0)  // warten bis alles gesendet
34
    nop();  
35
  z++;
36
}while(uart.rxpos < 4);  // Error oder OK +CR + LF
37
  
38
  uartClearRxBuffer();
39
  uartPuts("ATP=");
40
  uartPuts(pin);
41
  uartPuts("\r");
42
  while(uart.txpos > 0)
43
    nop();
44
  while(uart.rxpos < 3)
45
    nop();
46
  uartClearRxBuffer();
47
48
  delayTimer(30);
49
  
50
  uartPuts("ATD=");
51
  uartPuts(mac);
52
  uartPuts("\r");
53
  while(uart.txpos > 0)
54
    nop();
55
  while(uart.rxpos < 3)
56
    nop();
57
  uartClearRxBuffer();
58
  
59
  delayTimer(30);
60
  
61
  uartPuts("ATA\r");
62
  while(uart.txpos > 0)
63
    nop();
64
  while(uart.rxpos < 3)
65
    nop();
66
  uartClearRxBuffer();
67
}

Aber schön ist das nicht wirklich.
Das ist jetzt mal zum testen, bevor ich das ins eigentlich Programm 
einbaue.
Wenn noch jemand eine bessere Möglichkeit hat, nur zu.
von Harald (Gast)


Lesenswert?

Ich habe mir den Programmcode jetzt nicht durchgelesen. Allerdings muss 
man vor und nach dem +++ jeweils eine Sekunde mit einer Sendepause 
warten! Machst Du das?
von Jürgen S. (jsachs)


Lesenswert?

Ja die Pause davor und danach habe ich drinn.
Zeiten bis zu 3 Sekunden schon getestet.
Im Jetzigen Code versuche ich es einfach so lange bis es geht.
Pause, "+", kurze Pause, "+", kurze Pause, "+", Pause, CR

Das CR sorgt dafür, falls das Modul schon im Kommando Modus ist, bekommt 
man einen Error. Das "OK" Nach dem Wechsel in den Kommando Modus 
unterbleibt ja dann und kann dies nicht feststellen.

Die kurze Pause ist derzeit 350ms und die Lange 3*350ms.
Sind die Zeiten kürzer geht es nicht mehr Zuverlässig, sind diese länger 
auch nicht mehr.
Das merkt man auch wenn man es per Terminal versucht.
Da brauche ich auch einige Anläufe...

Aus der Modem Zeit weiss ich noch, das man direkt "+++" Pause schicken 
konnte und das ging immer......

Im Moment scheint es so zu gehen. Es dauert eben ein wenig und es gehen 
1-5 Versuche ins Land. Aber es scheint zu gehen.

Kennt keiner einen besseren Weg ?
Ich war schon am Überlegen den Reset zu benutzen. Das Modul kommt ja 
immer im Kommando Modus nach einen Reset. Dazu muss ich aber die 
Hardware ändern und würde ich gerne vermeiden.
von Harald (Gast)


Lesenswert?

Welche Softwareversion hat das Modul?
von Jürgen S. (jsachs)


Lesenswert?

Das Modul hat Version 4.35
von Harald (Gast)


Lesenswert?

V4.35 ist gut, da gibt es die Probleme mit dem Verschlucken von Zeichen 
im Command-Mode nicht mehr (war nur bis V4.22 so). Also bei mir klappt 
der Wechsel ohne Probleme, vielleicht solltest Du mal extern per Logic 
Analyzer, Scope oder notfalls weiterem PC schauen, was tatsächlich 
gesendet wird. Vielleicht wird da sporadisch etwas mitgesendet was die 
Sequenz stört.
von Jürgen S. (jsachs)


Lesenswert?

Logic Analyzer habe ich nicht.
Mit den Scope war nichts zu entdecken.
Mitgehört mit dem PC habe ich auch schon mit dem PC. Keine unerwarteten 
Zeichen.

Habe auch schon ein Minimalprogramm gemacht um das aus zu schließen.
Gleiches Ergebnis.

Ich habe sogar das Problem, das sich das Modul zwar Command mäßig 
umbuchen lässt, aber im Umbuchungs Vorgang hängt und auf nichts mehr 
reagiert.
Dann hilft nur noch ein Reset.
von Harald (Gast)


Lesenswert?

Klingt zu simpel, aber hast Du mal das Modul selber getauscht?
von Jürgen S. (jsachs)


Lesenswert?

Probiert mit 2 Modulen.
Selber Effekt...

Steht die Verbindung ist das Modul wirklich Super. Aber bis eine Qual. 
:-(
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.