Forum: Mikrocontroller und Digitale Elektronik Telit GM862-Quad Problem


von P. D. (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit dem oben genannten GSM Modul. Egal was ich ihm 
schicke ich bekomme einfach keine Antwort vom Modul.
Weder wenn ich dem Modul vom Mikrocontroller (NXP LPC2119) noch vom 
Hyperterminal etwas zuschicke.
Mit dem Oszi überwache ich die RxD und TxD Leitung. Beim Modul kommt 
alles sauber an was ich rüberschicke aber nichts zurück.
Das Modul schalte ich ebenfalls über den µC ein und die Status LED 
meldet sich dann auch.

Habe es mit 3 Leitungen versucht (RxD, TxD, GND) und dann noch mit den 
anderen (RTS, DTR, etc. etc.) Reichen 3 oder brauche ich die volle 
Handshake Geschichte bei diesem Modul?

Der Befehl AT<cr> sollte mir ja eigentlich ein OK zurückgeben, 
unabhängig von den Einstellungen (baudrate usw.) oder nicht?

Weis vieleicht jemand Rat oder hatte das gleich Problem mit diesem 
Modul!

Danke!
Peter

von Martin W. (martin_ch)


Lesenswert?

Hallo Peter
Ich benutzte für meine Diplomarbeit (Bikealarmanlage) ein Telit GE864 
Modul.

Es reichen RxD, TxD, GND für die Kommunikation, einfach die Pegel 
beachten. Das Modul hat eine automatische Baudraten Erkennung.

Allerdings nur im neusten Hardware-User-Guide stand, dass der Anschluss 
"TXD (rx_uart)" keinen internen Pullup Widerstand hat und einen externen 
benötigt.

Dazu benutzte ich die PWRMON Leitung zusammen mit einem Pullup 
Widerstand (47K) um den benötigten High-Pegel am TXD Ausgang zu 
erreichen.

vielleicht ist es ja das...

Grüsse aus der Schweiz
Martin

von Harald N. (Firma: AWP) (meff)


Angehängte Dateien:

Lesenswert?

Hallo Peter,

Sind eventuell nur RX und TX vertauscht? Defekte Module sind sehr 
selten. Wir haben einen Vorschlag:
- Wir tauschen das Modul im Vorabtausch, unabhängig wie alt es ist oder 
wo es gekauft wurde.
- Alle User dieses Forums erhalten 30% Rabatt auf ein Round Solutions 
Starterkit
- Über weitere Goodies können wir uns gerne unterhalten

Weiteres:
- Wir suchen immer Freelancer für kleine Aufgaben, aber auch für 
Geräteentwicklungen. Wer Interesse hat kann sich gerne melden.
- Wir wachsen und suchen Personal mit Kenntnissen in uC und GPRS 
Modulen. Zwei Stellen haben wir gerade besetzt, aber die nächste 
Einstellung kommt bestimmt.

Beispiele für Aufträge
- www.track4free.com >>> erster kostenfreier Server für Entwickler von 
Ortungsgeräten
- www.gauge4free.com >>> erster kostenfreier Server für Entwickler zur 
Visualisierung von Messdaten
- Python Debugger für die GPRS Module mit lizenzfreiem Pythoninterpreter 
(siehe Upload im Anhang)

Bitte sende eine Email an harald.naumann (at) roundsolutions.com und 
frage nach einer RMA Nummer für die Rücksendung an:
Round Solutions GmbH & Co KG
Im Steingrund 3
D-63303 Dreieich
Tel +49 6103 27044200
Fax +49 6103 27044199
www.roundsolutions.com

Viele Grüße vom Round Solutions Support Team
Harald Naumann
P.S. Kunden können das weltweit größte Forum zum Thema GPRS, UMTS, CDMA, 
WIFI, Bluetooth, ZigBee und ISM Module von Round Solutions nutzen

von Harry (Gast)


Lesenswert?

Hallo MC-Freunde!
Ich tüftel gerade an einem Project, in dem ich AT-Befehle von einem 
MC(P89LPC932) über die serielle Schnittstelle (UART) zu einem Telit 
GM862 Modem schicken will.
Hardware ist richtig verbunden, funktionierte vorher schon mit einem 
anderen ASM-Code.

Ich schreibe nun ein neues Programm in C. In dem Programm sende ich vom 
LPC932 den AT-Befehl AT#SHDN zum Telit Modem.
Daraufhin soll ein OK zurück gegeben werden und sich das Telit Modem zu 
mindest ausschalten. Sollte ein OK zurück kommen, signalisiert der MC 
dies durch einschalten von LED_W. Sollte etwas anderes zurück kommen, 
geht LED_W an.
Jedoch zeigt das Modem, abgesehen davon, dass die Status LED beim 
Einschalten an geht, keinerlei Reaktion.
Der P89LPC932 wird mit einem externen Quarz mit einer Frequenz von 
1,8432 MHz betrieben.

Hier ist mein Code.
1
#include <REG932.H>
2
#include <STDIO.H>
3
#include <STRING.H>
4
5
// DECLARATION---------------------------------------------------------------------------------------------------------
6
#define resLen 50
7
8
// function declaration
9
void initialization(void);
10
void wait(int);
11
void setModemOn(void);
12
void sendString(unsigned char *);
13
void receiveString(unsigned char *);
14
15
// bit declaration
16
sbit LED_R = P1^7;        // WHITE LED
17
sbit LED_W = P1^6;          // RED LED
18
19
sbit MDM_SHDN = P1^4;      // MDM_SHDN = 0 --> power on
20
sbit MDM_RST = P1^3;      // MODEM RESET;  reset = 0
21
sbit MDM_PWR = P1^2;        // MODEM ON/OFF; push = 0
22
23
sbit MDM_CTS = P2^5;            // CLEAR TO SEND(MCU INPUT)  Modem is ready to receive data
24
sbit MDM_RTS = P2^4;        // Request To Send(MCU OUTPUT = 1) MCU is ready to receive data
25
sbit MDM_DTR = P2^3;        // DATA TERM RDY(MCU OUTPUT) Modem wakeup
26
sbit MDM_DCD = P2^2;         // CARRIER DET(MCU INPUT)
27
28
static bit busy;
29
//---------------------------------------------------------------------------------------------------------------------
30
31
32
33
// FUNCTION DEFINITION-------------------------------------------------------------------------------------------------
34
35
// MAIN-------------------------------------------------------------------------------------------
36
void main(void) {
37
  unsigned char at[12] = {"'AT#SHDN',13"};
38
  unsigned char res[resLen];
39
  unsigned int first, last;
40
41
  initialization();
42
  setModemOn();
43
        
44
  sendString(at);
45
46
  receiveString(res);
47
48
  first = strcspn(res, "O");
49
  last = strcspn(res, "K");
50
  while(1==1) {
51
    if((last-first) == 1) {
52
      LED_W = 0;
53
    }
54
    else {
55
      LED_R = 0;
56
    }
57
  }
58
}
59
//-------------------------------------------------------------------------------------------------
60
61
62
// INITIALIZATION----------------------------------------------------------------------------------
63
void initialization(void) {
64
  // Save power initialization
65
  WDCON = 0x00;        // #00000000B; STOP WATCH DOG INTERRUPT
66
  AUXR1 = 0x80;        // #10000000B; SET CLOCK LOW POWER(MAX 8Mhz)
67
  PCONA = 0xAD;        // #10101101B;(PCONA.7 RTC, PCONA.5 A/D, PCONA.3 I2C, PCONA.2 SPI, PCONA.0 CCU) = power off
68
69
  // I/O port initialization
70
  P1M1 = 0x2F;        // #00101111B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
71
  P1M2 = 0x0F;        // #00001111B; 0/      | 1/            | 0/      | 1/
72
  P1 = 0xD0;          // P1 = b11010000; LED_R P1.7=1->off, LED_W P1.6=1->off,
73
                // MDM_SHDN P1.4=1->off, MDM_RST P1.3=0->on, MDM_PWR P1.2=0->on
74
  P2M1 = 0x3C;        // #00111100B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
75
  P2M2 = 0x3C;        // #00111100B; 0/      | 1/            | 0/      | 1/
76
77
  // Timer initialization
78
  TMOD = 0x01;           // #00100000B; timer 1: mode 2, 8-bit timer, auto-reload
79
  TR0 = 1;
80
  
81
82
  // Serial port initialization
83
  // Bits per second: 9600, startbit, Data bits: 8, Stop bits: 1, Parity: None, Flow control: Hardware
84
  //PCON = 0x80;        // #10000000B; SMOD = 1
85
  SCON = 0x50;        // #01010000B; MODE 1, 8 BIT, VAR. BAUDRATE, receive enabled
86
  TI = 1;            // ready to transmit
87
  BRGR1 = 0x000;        // SET BAUD RATE GENERATOR HIGH
88
  BRGR0 = 0x0B0;        // SET BAUD RATE GENERATOR LOW
89
  BRGCON = 0x03;        // #00000011B; SET BAUD RATE GENERATOR CONTR
90
}
91
//-------------------------------------------------------------------------------------------------
92
93
94
// MODEM ON----------------------------------------------------------------------------------------
95
void setModemOn(void) {
96
  MDM_RST = 1;        // release floating pin modem reset
97
  MDM_PWR = 1;           // release floating pin modem power
98
  MDM_SHDN = 0;         // power on  modem
99
  wait(10);             // WAIT 1SEC FOR POWER TO STAB.
100
101
  MDM_PWR = 0;           // set floating pin modem power
102
  wait(11);             // wait 1.1 sec. and...
103
  MDM_PWR = 1;           // release floating pin modem power
104
  wait(30);           
105
}
106
//-------------------------------------------------------------------------------------------------
107
108
109
// WAIT x/10 SEC.----------------------------------------------------------------------------------
110
void wait(int tenths) {
111
  int i,j;
112
  const RLV = 76;        // reload value for timer 0; t=50ms
113
114
  for(i=1;i<=tenths;i++) {
115
    for(j=1;j<=2;j++) {    // 2*50ms = 0.1 sec.
116
      TH0 = RLV;
117
      while(TF0 == 0);   // waits until timer0-flag is set
118
      TF0 = 0;       // unsets timer0-flag
119
    }
120
  }
121
}
122
//-------------------------------------------------------------------------------------------------
123
124
125
// SEND STRING TO UART-----------------------------------------------------------------------------
126
void sendString(unsigned char *string) {
127
  unsigned int len;
128
  unsigned int i;
129
  
130
  len = strlen(string);         // determine string length
131
  for(i =  0; i < len;i++) {
132
    TI = 0;
133
    SBUF = string[i];  
134
    while(TI == 0);
135
  }
136
}
137
//-------------------------------------------------------------------------------------------------
138
139
140
// RECEIVE STRING FROM UART------------------------------------------------------------------------
141
void receiveString(unsigned char *string) {
142
  unsigned int i;
143
144
  for(i = 0; i < resLen; i++) {
145
    while(RI != 1);          // wait until the serial port signals a new character has arrived
146
    string[i] = SBUF;       // read the value in the serial buffer
147
    RI = 0;            // free to receive a new character
148
  }
149
}
150
//-------------------------------------------------------------------------------------------------

Wäre sehr dankbar für Hilfe.

Gruß Harry

von holger (Gast)


Lesenswert?

>  unsigned char at[12] = {"'AT#SHDN',13"};

Sicher das das so gesendet werden soll ?
Versuchs mal mit

 unsigned char at[12] = {"AT#SHDN\r\n"};

von Harry (Gast)


Lesenswert?

1
unsigned char at[12] = {"AT#SHDN\r"};
...geht leider auch nicht.
Habe es so implementiert dass jedes mal wenn ein Byte versonden ist eine 
LED an geht. Scheinbar werden alle Bytes übertragen. Wenn ich dann beim 
Empfangen auch eine LED anschalte, empfängt er ein Byte und bleibt dann 
bei...
1
while(RI != 1);
...hängen. Scheinbar wird nur ein Byte empfangen und dann bleibt der 
Empfangsbuffer leer.
Sende- und Empfangsfunktion sehen nun so aus:
1
// SEND STRING TO UART-----------------------------------------------------------------------------
2
void sendString(unsigned char *string) {
3
   unsigned int len;
4
  unsigned int i;
5
  
6
  len = strlen(string);         // determine string length
7
  for(i =  0; i < len;i++) {
8
    LED_W = 1;
9
    LED_R = 0;
10
    wait(5);
11
12
    TI = 0;
13
    SBUF = string[i];  
14
    while(TI == 0);
15
16
    LED_R = 1;
17
    LED_W = 0;
18
    wait(5);
19
  }
20
}
21
//-------------------------------------------------------------------------------------------------
22
23
24
// RECEIVE STRING FROM UART------------------------------------------------------------------------
25
void receiveString(unsigned char *string) {
26
  unsigned int i;
27
  for(i = 0; i < resLen; i++) {
28
    LED_W = 1;
29
    LED_R = 0;
30
    wait(5);
31
    
32
    while(RI != 1);          // wait until the serial port signals a new character has arrived
33
    string[i] = SBUF;       // read the value in the serial buffer
34
    RI = 0;            // free to receive a new character
35
    
36
    LED_R = 1;
37
    LED_W = 0;
38
    wait(5);
39
  }
40
}
41
//-------------------------------------------------------------------------------------------------

von holger (Gast)


Lesenswert?

Nimm doch mal die wait(5); beim empfangen raus.

von Harry (Gast)


Lesenswert?

Ohne
1
wait(5);
 geht es auch nicht.
Aber im Grunde genommen darf es daran ja auch nicht liegen, da die Zeit 
zwischen den einzelnen Bytes ja nicht von Bedeutung ist. Nach jedem Byte 
ist ja die Übertragung abgeschlossen.

Um nochmal auf den Abschluss eines Befehls zurück zu kommen.
Was muss da gesendet werden? Reicht ein <cr> (0x0D oder 13) aus?
Muss das Char-Arry in besonderer Art und Weise abgeschlossen werden, 
z.B. mit /0 und dafür noch ein weiteres Feld zur verfügung stehen?
Denke, die letzte Frage ist eigentlich hiermit...
1
unsigned char at[] = {"AT#SHDN\r"};
...beantwortet. Das Array wird in der Größe des Strings erstellt und es 
werden 8 Zeichen (AT#SHDN = 7, + \r = 1, = 8) übertragen, was ich an der 
LED sehe.

Wie sieht es bei dieser Art der Implementierung mit der manuellen 
Auslese und Setzung von RTS(output), DTR(output), CTS(intput), 
DCD(input) aus?
Bei näherer Betrachtung meiner Schaltung ist noch aufgefallen, das DSR- 
und RI-Pin vom Modem nicht mit dem MC verbunden sind.
Dies sollte aber im Grunde kein Hindernis darstellen, da genau diese 
Hardware  unter dem Assembler code funktionierte. Gegebenen Falls ist 
vielleicht eine andere Implementierung erforderlicht?

Danke für eure bisherige Hilfe!
Vielleicht habt ihr ja noch weitere Ideen woran es liegen könnte?

Gruß Harry

von holger (Gast)


Lesenswert?

>void receiveString(unsigned char *string) {
>  unsigned int i;
>  for(i = 0; i < resLen; i++) {

Du wartest mit dieser Schleife auf 30 Zeichen.
Du bekommst in diesem Fall aber möglicherweise nur 3 => "OK\r".
Beim Zeichen 13 musst du die Schleife abbrechen.
Sonst hängt dein Programm.

von Harry (Gast)


Lesenswert?

Hallo Holger!

Vielen Dank für den Hinweis. Aber leider hat dies auch nicht 
weitergeholfen.
Nach dem ersten Byte ist schluss.
Hier ist nochmal die Funktion "receiveString()":
1
// RECEIVE STRING FROM UART------------------------------------------------------------------------
2
void receiveString(unsigned char *string) {
3
  unsigned int i = 0;
4
  while(SBUF != 13) {
5
    LED_W = 1;
6
    LED_R = 0;
7
    wait(5);    
8
9
    while(RI != 1);          // wait until the serial port signals a new character has arrived
10
    string[i] = SBUF;       // read the value in the serial buffer
11
    RI = 0;            // free to receive a new character
12
    
13
    LED_R = 1;
14
    LED_W = 0;
15
    wait(5);
16
    i++;
17
  }
18
}
19
//-------------------------------------------------------------------------------------------------
Meintest du das in etwa so?

Habe nun nochmal die Deklaration des Arrays angepasst:
1
unsigned char at[] = {'A','T','#','S','H','D','N',13};
Müsste nun doch eigentlich richtig sein, aber wiedermals ohne Erfolg! :(

von holger (Gast)


Lesenswert?

// RECEIVE STRING FROM 
UART-------------------------------------------------------------------- 
----
void receiveString(unsigned char *string)
 {
  unsigned int i;
  unsigned char tmp;
  for(i = 0; i < resLen; i++)
  {
    LED_W = 1;
    LED_R = 0;
 //   wait(5); // weg mit dem Schrott

    while(RI != 1);          // wait until the serial port signals a new 
character has arrived
    tmp = SBUF;
    RI = 0;            // free to receive a new character
    if(tmp==13) { string[i]=0; break; }

    string[i] = tmp;       // read the value in the serial buffer

    LED_R = 1;
    LED_W = 0;
//    wait(5); // weg mit dem Schrott
  }
}

Was glaubst du eigentlich wieviel Zeichen bei so einem wait(5)
flöten gehen ? Dein Modem wird sicherlich kein wait(5) ausführen.
Das sendet munter weiter.

von Harry (Gast)


Lesenswert?

Hallo Holger,

habe mal alle waits entfernt und den Code nach deinem Vorbild 
implementiert. Jedoch wieder ohne Erfolg.
Auch am MC liegt es nicht, den habe ich auch mal ausgetauscht.

Aber werden daten die in SBUF stehen wenn sie nicht abgerufen werden 
einfach überschrieben? Wartet da nicht der Sender auf den Empfänger?

Naja, also ich vermute ganz stark, dass es doch an meiner 
Initialisierung liegt. Habe zwar die Initialisierungswerte von dem 
Assemblerprogramm übernommen, aber irgendwas scheint dort dennoch faul 
zu sein.
Die die Formel zur Baudratengenerierung mit hilfe des internen 
Baudratengenerators ist ja folgende:

Baudrate = CCLK⁄((BRGR1, BRGR0)+16)

Nur weiß ich nicht genau, wie ich sie anwenden muss, mit dem Komma 
zwischen BRGR1 und BRGR0?

Habe auch schon probiert den Timer1 zur Baudratengenerierung zu 
benutzen.
Dann sollte die Initialisierung ja so aussehen:
1
// INITIALIZATION----------------------------------------------------------------------------------
2
void initialization(void) {
3
  // Save power initialization
4
  //WDCON = 0x00;      // #00000000B; STOP WATCH DOG INTERRUPT
5
  //AUXR1 = 0x80;      // #10000000B; SET CLOCK LOW POWER(MAX 8Mhz)
6
  //PCONA = 0xAD;      // #10101101B;(PCONA.7 RTC, PCONA.5 A/D, PCONA.3 I2C, PCONA.2 SPI, PCONA.0 CCU) = power off
7
8
  // I/O port initialization
9
  P1M1 = 0x2F;        // #00101111B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
10
  P1M2 = 0x0F;        // #00001111B; 0/      | 1/            | 0/      | 1/
11
  P1 = 0xD0;          // P1 = b11010000; LED_R P1.7=1->off, LED_W P1.6=1->off,
12
                      // MDM_SHDN P1.4=1->off, MDM_RST P1.3=0->on, MDM_PWR P1.2=0->on
13
  P2M1 = 0x3C;        // #00111100B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
14
  P2M2 = 0x3C;        // #00111100B; 0/      | 1/            | 0/      | 1/
15
16
  // Timer initialization
17
  TMOD = 0x21;        // #00100001B;   timer 0: mode 1, 16-bit timer
18
                      //               timer 1: mode 2, 8-bit timer, auto-reload
19
  TL1 = 250;          // set start value timer 1 low s. bits
20
  TH1 = 250;          // set reload value timer 1  most s. bit
21
  TR1 = 1;            // start timer 1
22
  TR0 = 1;
23
  
24
25
  // Serial port initialization
26
  // Bits per second: 9600, startbit, Data bits: 8, Stop bits: 1, Parity: None, Flow control: Hardware
27
  PCON = 0x80;        // #10000000B; SMOD = 1
28
  SCON = 0x50;        // #01010000B; MODE 1, 8 BIT, VAR. BAUDRATE, receive enabled
29
  SSTAT = 0x00;
30
  TI = 1;             // ready to transmit
31
}
32
//-------------------------------------------------------------------------------------------------
Die Formel für TH1 und PCON = 0x80:

baudrate = CCLK⁄((256−TH1)32)
TH1 = 256-(CCLK/(32*9600))= 250

Aber er bleibt wieder irgendwo stehen.
Es ist doch zum Verzweifeln!

von Harry (Gast)


Lesenswert?

Oh, ganz vergessen hier nochmal zu erwähnen.
Benutze einen externen Quarz mit einer Frequenz von 1,8432 MHz.

Bin für jede Hilfe sehr dankbar!

von holger (Gast)


Lesenswert?

Du solltest deine Schaltung erst mal mit
einem PC verbinden um die Baudrate zu kontrollieren.
Solange die nicht stimmt klappts auch nicht mit dem Modem :(

Evtl. braucht dein Modem auch noch die Handshake Leitungen.
Aber das sollte im Datenblatt stehen.

von Harry (Gast)


Lesenswert?

Das Modem hat Baudraten Autodetection. Ist also über Hyperterminal mit 
zu mindest allen Standardbaudraten ansprechbar und reagiert auch.
Das Problem ist der MC und wie du schon vielleicht richtig vermutet 
hast, müssen die Handshakeleitungen verwendet werden.
Ich will es morgen mal nachlesen. Wo nach müsste man dann suchen? UART 
Handshake?

Besten Dank!
Harry

von Martin W. (martin_ch)


Lesenswert?

Hi Harry
hast du mein Posting #2 überhaupt schon gelesen?

gruss martin

von Harry (Gast)


Lesenswert?

Hallo Martin!
Genau so wie du es beschrieben hast, ist meine Schaltung auch aufgebaut.
Fällt dir vielleicht sonst ein Fehler in meinem Code auf?
1
#include <REG932.H>
2
#include <STDIO.H>
3
#include <STRING.H>
4
5
// DECLARATION---------------------------------------------------------------------------------------------------------
6
#define resLen 50
7
8
// function declaration
9
void initialization(void);
10
void wait(int);
11
void setModemOn(void);
12
void sendString(unsigned char *);
13
void receiveString(unsigned char *);
14
15
// bit declaration
16
sbit LED_R = P1^7;        // WHITE LED
17
sbit LED_W = P1^6;        // RED LED
18
19
sbit MDM_SHDN = P1^4;     // MDM_SHDN = 0 --> power on
20
sbit MDM_RST = P1^3;      // MODEM RESET;  reset = 0
21
sbit MDM_PWR = P1^2;      // MODEM ON/OFF; push = 0
22
23
sbit MDM_CTS = P2^5;      // CLEAR TO SEND(MCU INPUT)  Modem is ready to receive data
24
sbit MDM_RTS = P2^4;      // Request To Send(MCU OUTPUT = 1) MCU is ready to receive data
25
sbit MDM_DTR = P2^3;      // DATA TERM RDY(MCU OUTPUT) Modem wakeup
26
sbit MDM_DCD = P2^2;      // CARRIER DET(MCU INPUT)
27
//---------------------------------------------------------------------------------------------------------------------
28
29
30
31
// FUNCTION DEFINITION-------------------------------------------------------------------------------------------------
32
33
// MAIN-------------------------------------------------------------------------------------------
34
void main(void) {
35
  unsigned char at[] = {'A','T','#','S','H','D','N',13};
36
  unsigned char res[resLen];
37
  unsigned int first, last;
38
39
  initialization();
40
  setModemOn();
41
  while(MDM_CTS == 1);
42
          
43
  sendString(at);
44
  receiveString(res);
45
46
  first = strcspn(res, "O");
47
  last = strcspn(res, "K");
48
  while(1==1) {
49
    if((last-first) == 1) {
50
      LED_W = 0;
51
    }
52
    else {
53
      LED_R = 0;
54
    }
55
  }
56
}
57
//-------------------------------------------------------------------------------------------------
58
59
60
// INITIALIZATION----------------------------------------------------------------------------------
61
void initialization(void) {
62
  // Save power initialization
63
  //WDCON = 0x00;        // #00000000B; STOP WATCH DOG INTERRUPT
64
  //AUXR1 = 0x80;        // #10000000B; SET CLOCK LOW POWER(MAX 8Mhz)
65
  //PCONA = 0xAD;        // #10101101B;(PCONA.7 RTC, PCONA.5 A/D, PCONA.3 I2C, PCONA.2 SPI, PCONA.0 CCU) = power off
66
67
  // I/O port initialization
68
  P1M1 = 0x2F;           // #00101111B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
69
  P1M2 = 0x0F;           // #00001111B; 0/      | 1/            | 0/      | 1/
70
  P1 = 0xD0;             // P1 = b11010000; LED_R P1.7=1->off, LED_W P1.6=1->off,
71
                         // MDM_SHDN P1.4=1->off, MDM_RST P1.3=0->on, MDM_PWR P1.2=0->on
72
  P2M1 = 0x3C;           // #00111100B; 0-QUASI BIDIR| 0-PUSH PULL   | 1-INPUT ONLY  | 1-OPEN DRAIN
73
  P2M2 = 0x3C;           // #00111100B; 0/      | 1/            | 0/      | 1/
74
75
  // Timer initialization
76
  // CCLK = 1,8432 MHz
77
  TMOD = 0x21;           // #00100001B;   timer 0: mode 1, 16-bit timer
78
                         //               timer 1: mode 2, 8-bit timer, auto-reload
79
  TL1 = 250;             // set start value timer 1 low s. bits
80
  TH1 = 250;             // set reload value timer 1  most s. bit
81
  TR1 = 1;               // start timer 1
82
  TR0 = 1;
83
  
84
85
  // Serial port initialization
86
  // CCLK = 1,8432 MHz
87
  // Bits per second: 9600, startbit, Data bits: 8, Stop bits: 1, Parity: None, Flow control: Hardware
88
  PCON = 0x80;           // #10000000B; SMOD = 1
89
  SCON = 0x50;           // #01010000B; MODE 1, 8 BIT, VAR. BAUDRATE, receive enabled
90
  SSTAT = 0x00;
91
  TI = 1;                // ready to transmit
92
  //BRGR1 = 0x000;       // SET BAUD RATE GENERATOR HIGH
93
  //BRGR0 = 0x0B0;       // SET BAUD RATE GENERATOR LOW
94
  //BRGCON = 0x03;       // #00000011B; SET BAUD RATE GENERATOR CONTR
95
  //MDM_RTS = 0;         // READY FOR MODEM DATA
96
}
97
//-------------------------------------------------------------------------------------------------
98
99
100
// MODEM ON----------------------------------------------------------------------------------------
101
void setModemOn(void) {
102
  MDM_RST = 1;           // release floating pin modem reset
103
  MDM_PWR = 1;           // release floating pin modem power
104
  MDM_SHDN = 0;          // power on  modem
105
  wait(10);              // WAIT 1SEC FOR POWER TO STAB.
106
107
  MDM_PWR = 0;           // set floating pin modem power
108
  wait(11);              // wait 1.1 sec. and...
109
  MDM_PWR = 1;           // release floating pin modem power 
110
  wait(100);          
111
}
112
//-------------------------------------------------------------------------------------------------
113
114
115
// WAIT x/10 SEC.----------------------------------------------------------------------------------
116
void wait(int tenths) {
117
  int i,j;
118
  const RLV = 76;        // reload value for timer 0; t=50ms
119
                // RLV =  
120
  for(i=1;i<=tenths;i++) {
121
    for(j=1;j<=2;j++) {  // 2*50ms = 0.1 sec.
122
      TH0 = RLV;
123
      while(TF0 == 0);   // waits until timer0-flag is set
124
      TF0 = 0;           // unsets timer0-flag
125
    }
126
  }
127
}
128
//-------------------------------------------------------------------------------------------------
129
130
131
// SEND STRING TO UART-----------------------------------------------------------------------------
132
void sendString(unsigned char *string) {
133
  unsigned int len;
134
  unsigned int i;
135
  
136
  len = strlen(string);   // determine string length
137
  for(i =  0; i < len;i++) {
138
    TI = 0;
139
    SBUF = string[i];  
140
    while(TI == 0);
141
  }
142
}
143
//-------------------------------------------------------------------------------------------------
144
145
146
// RECEIVE STRING FROM UART------------------------------------------------------------------------
147
void receiveString(unsigned char *string) {
148
  unsigned int i;
149
  unsigned char tmp;
150
151
  for(i = 0;i < resLen; i++) {
152
    while(RI != 1);       // wait until the serial port signals a new character has arrived
153
    tmp = SBUF;           // read the value in the serial buffer
154
    RI = 0;               // free to receive a new character
155
    if(tmp == 13) {
156
      string[i] = 0; 
157
      break;
158
    }
159
    string[i] = tmp;
160
  }
161
}
162
//-------------------------------------------------------------------------------------------------

von Harry (Gast)


Lesenswert?

So, der MC sendet nun endlich Zeichen und das Modem empfängt sie! :)
Habe mal nen Oszilloskop dran gehängt und die Baudrate überprüft und sie 
stimmte.
Dann habe ich mir noch einen Max232 besorgt und den an TxD und RxD 
geklemmt und siehe da, auf einmal sah ich Zeichen in Hyperterminal und 
auch das Modem schaltete sich bei dem Shutdown-Befehl brav aus. :)

Aber fragt mich nun nicht, was ich verändert habe, eigentlich ist alles 
beim Alten.

Das einzige Problem was ich nun noch habe ist, dass der MC immer noch 
nicht die Daten richtig empfängt...

Aber da komme ich schon hinter!
Erstmal ein dickes Dankeschön an alle die geholfen haben!
Wenn ich wieder nicht weiter komme, nerv ich euch weiter... ;)

Gruß Harry

von Harry (Gast)


Lesenswert?

Hallo MC-Freunde!

Die Freude war nur von kurzer Dauer.
Habe nun herrausgefunden, dass es nur funktioniert, wenn ich die RxD 
Leitung vom PC an die TxD Leitung des MCs anschließe und mithöre. In 
diesem Falle schaltet sich auch das Modem durch AT#SHDN\r\n aus.

Wenn ich die RxD Leitung des PCs entferne, tut sich gar nichts.
Was macht die RxD Leitung, damit es funktioniert? Sie dürfte doch 
eigentlich lediglich mit hören und nicht in die Kommunikation einwirken.

MfG
Harry

von Harry (Gast)


Lesenswert?

Kein Kontakt zwischen Modem und MC wenn RxD nicht angeschlossen ist. ;)

von ta..m (Gast)


Lesenswert?

-Welche maximale Baudrate lässt sich erreichen mit 8MHz?

von Alexander (Gast)


Lesenswert?

RTS auf GND ziehen und es klappt !!!!!!!!!!!!!

von Daniel (Gast)


Lesenswert?

Hatte grade auch das Problem keine Uart Vebindung zu bekommen.


Das Problem war Tauschen von RXD und TXD...


so gehts:
(Master ist PC)

Leitung vom PC zum GM862 heisst MOSI und geht auf TXD vom GM
Leitung vom GM862 zum PC heisst MISO und geht auf RXD vom GM


Schon seltsam, ich benenne doch keine Leitung die empfängt TXD !??!!
egal nun gehts


Gruß,
Daniel

von Chris (Gast)


Lesenswert?

Doch weil es sich dabei um ein Modem handelt das die Daten auf dieser 
Leitung über die Modem-Verbindung versendet, siehe auch EIA-232 in 
Wikipedia ;)

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.