Forum: Mikrocontroller und Digitale Elektronik GSM Modem über Atmega32 steuern


von Benni (Gast)


Lesenswert?

Aufgabenstellung:
Über meinen Microcontroller(ATmega32) mittels dem At-Befehlssatz eine 
SMS mit meinem GSM-Modem(MC35i von Siemens) zu senden.

Problem:
Das SMS wird kommt einfach nicht an. Ich bin kein C Experte und verstehe 
nicht wieso nichts funktioniert (Liegt wahrscheindlich am Coding).
Programmiert wird mittels PonyProg.
Dies ist ein Teil meiner Diplomarbeit und für mich eine sehr schwere 
Hürde.

Hier mein Coding in AVR Studio 4:

#include <avr/io.h>
#include <util/delay.h>

int uart_putc(unsigned char c);
void SendeString (char *szBuf);
void long_delay(uint16_t ms);

int main(void)
{
  int c=0;

  UCSRA = 0x00;  // MCU =ATMega32, F_CPU = 16Mhz, 9600 Baudrate
  UCSRB = 0x18;  //8 Bit , kein Parity, 1 Stopbit, Asynchron
  UCSRC = 0x86;
  UBRRH = 0x00;
  UBRRL = 0x67;

  if(c==0)
  {
  SendeString("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe
  long_delay(2000); //2 sec warten   //2 Sekunden Warteschleife
  SendeString("at+cmgf=1\r\n");   //SMS-Ein und Ausgabe erfolgt
                                           im 7Bit Klartext
  long_delay(2000);
  SendeString("at+cmgs=+436644209014\r\n"); //Zieladressnummer
                                                    nach Österreich A1
  long_delay(2000);
  SendeString("Test"); //SMS-Text
  long_delay(2000);
  uart_putc(0x1A);  //Hex Code fuer Strg+Z wird gesendet
  long_delay(5000);
  c=1;  // Überprüfung das SMS nur 1 mal gesendet wurde
  }
  return 0;
}

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

    UDR = c;                      /* sende Zeichen */
    return 0;
}

void SendeString (char *szBuf)   //Methode zum Senden
{
  while (*szBuf++)
  {
    outp (*szBuf, UDR);
    loop_until_bit_is_set (UCSRA, UDRE);
  }
}
void long_delay(uint16_t ms)  //Warteschleife
{
    for(; ms>0; ms--) _delay_ms(1);
}

von Niels H. (monarch35)


Lesenswert?

Ich nehme an, du suchst jetzt nach einem Punkt, wo du ansetzen kannst, 
um zu schauen, was jetzt schief läuft? Wo ist das Problem? Ich würde 
erstmal statt dem GSM-Modul ein PC anschliessen um zu schauen, ob 
überhaupt was vom Controller geschickt wird.

Ausserdem würde ich statt den long_wait() auf das "OK" warten, mit dem 
das Modem die AT-Befehle quittieren sollte.

von STS (Gast)


Lesenswert?

Nur mal eine Frage: Sind die AT-Befehle nicht groß zu schreiben? AT..., 
denn das ergibt ja einen ganz anderen Code. Groß-/Kleinschreibung nicht 
egal, jedenfalls stehen alle Hayes-Befehle im Manual zum TC35i/MC35i in 
Großbuchstaben drin.

von Niels H. (monarch35)


Lesenswert?

Soweit ich das gewohnt bin, spielt gross/kleinschreibung keine Rolle. 
Ein "ATZ" sollte genau wie ein "atz" funktionieren.

von Matthias (Gast)


Lesenswert?

Hab selber in der Art schon was gemacht, aber in einem Projekt.

Wir erstellten aber damals das Handy als Modem.

Schau mal ob deine Befehle stimmen die du ans Handy schickst. Am besten 
mit Datenkabel mal an PC und dort mitn Hyperterminal rumspielen. Wenn du 
das SMS schicken kannst liegts irgendwo am Controller. Also Prüf was er 
schickt und was er schicken sollte.

Wir haben damals auch so angefangen. Alleine die Datenverbindung kostete 
uns schon 3 Tage bis das von Rechner zu Rechner lief (M35 auf MT50 beide 
Siemens). Ich weis blos nicht mehr ob wir die AT Befehle gross 
geschrieben haben...doch fast Sicher gross.
Leider hab ich den Code nicht mehr, war aber auch in Basic welches dir 
nicht viel helfen wird.

Was du auch noch versuchen kannst einfach mit ATDT mal auf ein Telefon 
Rauszuwählen, damit du weist das was geht.

MfG
Matthias

P.S. Das MC35 braucht das nicht den PTY Code für ne SMS oder kann es 
sicher schon Klartext?

von crazy horse (Gast)


Lesenswert?

habe es auch mal gemacht und nur kurz drübergeschaut (mein Modem 
brauchte keine Pinnummer).

flash unsigned char at_set_textmode[]="at+cmgf=1\r";
printf(at_set_textmode);

da ist bei dir noch ein \n dran, kann sein, dass es nicht stört - 
braucht man aber nicht. Bei mir hats jedenfalls so funktioniert. Auch 
sonst überall nur \r.

von Benni (Gast)


Lesenswert?

Erstmals danke für die zahlreichen Antworten. Jedoch kenne ich mich 
persönlich nicht so gut in C aus und habe den Code größtenteils kopiert 
u zusammengesetzt. Das senden mittels Hyperterminal funktioniert 
einwandfrei.
Das Problem liegt ganz allein am Microcontroller der einfach nichts 
Ausgibt in Hyperterminal und ich und mein Partner wissen einfach nicht 
warum. Kann uns wer vl eine einfache Anwendung schicken wo man etwas in 
Hyperterminal vom microcontroller ausgibt, das würde uns glaub ich sehr 
helfen.
lg Benni

von Niels H. (monarch35)


Lesenswert?

lach

Nein, das funktioniert gewiss so nicht. Wenn euer Kontroller nicht so 
funktioniert, wie ihr es haben wollt, könnt ihr nicht jedesmal im Forum 
nachfragen, ob jemand die Arbeit für euch macht.

Ich schlage vor, ihr beschäftigt euch selber mit dem Problem. Nur so 
lernt ihr. Im GCC-Tutorial ist alles was man über den Betrieb des UARTs 
wissen muss beschrieben. Das müsst ihr euch erstmal durchlesen..

Ich vermute, das ihr die UART falsch inititalisiert und UDRE nicht vom 
kontroller gesetzt wird. Die Folge: euer Code hängt in einer 
Endlosschleife. Wie man richtig initialisiert steht hier im im 
GCC-Tutorial.

Tipps und Ratschläge werden hier gerne erteilt, aber daß sich jemand die 
Arbeit für euch macht, könnt ihr ganz schnell vergessen.

von Badhan T. (Firma: BULME-HTL) (indian_buddy)


Lesenswert?

Hy Benni,
I have read your Code and your problems. And tried your Code to the same 
modem i have.
So, let me tell you details.

num1. UART configuration is OK.
num2. SendeString() is not working in order to send String to Hyper 
terminal. So use those methods -

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

    UDR = c;                      /* sende Zeichen */
    return 0;
}


void uart_puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

That means to your Code:

uart_puts("at+cpin=0000\r\n"); //AT-Befehl zur Pineingabe
or just leave \n
number 3: You should wait for the answer from your modem. The answer 
could be "OK" or "ERROR"

just try to proof positive that you can make communication between your 
GSM modem and microcontroller.
For that you wait for "OK" string.... and let your LED ON.

num 4. You must read "String Empfangen" from the GCC tutorial here or at 
Roboternetz.Tips: write a programm to send a string("OK" then press 
Enter ) to ATmega32 from your hyperterminal. IF microcontroller get OK 
to USART, LED should goes ON.

num 5. Next tip: you might need Interrupt Routines for USART/UART.

num 6. Another important thing is your Serielle Kabel. To communate PC 
and your board, you might use Nullmodem 9 Pol Seriell Kabel. Here you 
have One side Männlich and other side Weiblich of your kabel.
At your modem you might need gekreuztes Kabel. You just have to convert 
it and proof if your RxD and TxD lines are connencted to Gsm modem and 
microcontroller.



PS. my German is horrible and my english is also not very good.Though i 
have tried to explain my tips to your projekt.
You and everybody can write me in German.i dont have any problem with 
it.
Thats all for now.

von Benjamin W. (Firma: Schüler - HTL BULME) (benni111)


Lesenswert?

Danke für die zahlreichen Infos.
Ich hab schon herausgefunden wie es funktioniert.
Und zwar war mein Microcontroller kaputt und man konnte nichts über UART 
schicken.
Nun hab ich Microcontroller ausgewechselt und des Program lief 
ausnahmslos.
lg Benni

von Miri (Gast)


Lesenswert?

Hi

soweit ich weis akzeptiert Siemens 35i nur PDU Mode.
Du verschickst aber nur klartext mit dem progi oder habe
ich da was übersehen?

von badhan (Gast)


Lesenswert?

Hy Miri,
Da wird Klar Text gesendet... und funktiniert einwandfrei mit Siemens 
35i.

cheers

von Miri (Gast)


Lesenswert?

Ich habe das schon mit sl45i ausprobiert. Kann nur PDU.
Verstehe jetzt die Welt nicht mehr. Das s35i ist noch älter.

wie geht das???

von badhan (Gast)


Lesenswert?

Hy Miri,
Just study this site :
http://www.dreamfabric.com/sms/

Here you will find about PDU format.

There are two ways of sending and receiving SMS messages: by text mode 
and by PDU (protocol description unit) mode.
The text mode is unavailable on some phones.

I guess..your Siemens sl45i doesnt support Text Mode. In this situation 
you can try to Convert your PDU Format in Text mode. You will find 
enough about this converting in google.

cheers

von Schmidt (Gast)


Lesenswert?

Hallo,
Nur um das Thema "Text / PDU Mode" abzuschließen:
GSM-Modems von Siemens sind standardmäßig im PDU Mode initialisiert. Bei 
vielen (z.B. beim 35i oder 45i) kann man aber über den Befehl 
"AT+CMGF=1" in den Text Mode wechseln, wobei stest die Befehle "AT&W" 
sowie "AT^SMSO" (lässt Modem 1x runterfahren und speichert dabei die 
Werte) nötig sind, um diese und andere Einstellungen dauerhaft zu 
sichern. Details hierzu stehen in den jeweiligen AT Command Sets...

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.