Forum: Mikrocontroller und Digitale Elektronik UART (AT)-Echo bzw Puffer empfangen und auslesen, WIE


von Elektrolyt (Gast)


Angehängte Dateien:

Lesenswert?

Tach Zusammen,

für ein Oberstufenprojekt bin ich an einer GSM gesteuerten 
Microcontrolleranwendung dran, um gewisse Dinge später mit einer 
Relaiskarte per gsm anzusteuern.
Wenn ich per Terminal AT-Commmands an ein SiemensHandy sende, dann sehe 
ich nach jedem Ausführen des Befehls ein "OK" vom Modem.
Ich möchte nun diese Modemrückmeldung per Microcontroller empfangen und 
mittels Terminalprogramm ausgeben (später auswerten).
Das Handy läßt sich problemlos steuern, folglich muss die Tx Leitung des 
Controllers bzw die Rx Leitung des Handys in Ordnung sein.(Ich benutze 
die Schaltung aus diesem Forum mit den 2,7V Z-Dioden gegen Masse und ein 
Serienwiderstand 1K)
Die Tx Leitung des Handys liefert jedoch nur ca 2.7V, also habe ich eine 
Pegelwandlung mit 2 Transistoren dazugeschaltet um den CMOS-Pegel auf 
TTL 5V zu wandeln. Im Anhang befindet sich die Pegelwandlerschaltung. 
Ich habe jedoch statt die eingezeichneten Transistoren die BC547C 
genommen und ein 40K statt die eingezeichneten 47K. Ferner liegen bei 
mir am Eingang die 2.7V an statt die 3.6V.
Ich hatte Tx des Handys auch schon direkt am Rx des AVRs. Allerdings 
bekomme ich das Modemecho in beiden Fällen (mit Pegelwandlung und Ohne 
Pegelwandlung) nicht zu sehen. Ich bin seit einiger Zeit mit der 
Suchfunktion und Google beschäftigt aber leider komme ich einfach nicht 
auf was gescheites.
Kurz gesagt:
AVR schickt die Befehle raus, Handy bekommt sie und führt sie auch aus, 
aber ich bekomme einfach keine Rückmeldung vom Handy (obwohl das Handy 
wenns direkt mit dem PC verbunden wird, das "OK" anzeigt.)
Was mache ich (seit Tagen) falsch???
Ich wäre euch sehr verbunden, wenn mir jemand aus meiner verzweifelten 
Situation wieder auf die Beine helfen könnte.
gruß Elektrolyt

von Elektrolyt (Gast)


Lesenswert?

Am einfachsten wäre es ja das ankommende "RING" anzuzeigen, aber wie 
realisiere ich das, damit ich das vom Handy gesendete "RING" (bei 
ankommendem Anruf) wieder am Terminal ausgebe??? Ich programmiere in C 
und ich muss dazu erwähnen, dass ich den Controller mit dem Handy 
verbunden habe und am Board noch der MySmartUSB dransteckt, womit ich 
die Kommunikation, zwischen Handy und Controller am Hyperterminal 
mitracen kann.
schönen Samstag abend noch...
Elko

von Falk B. (falk)


Lesenswert?

@ Elektrolyt (Gast)

>Ich hatte Tx des Handys auch schon direkt am Rx des AVRs. Allerdings
>bekomme ich das Modemecho in beiden Fällen (mit Pegelwandlung und Ohne
>Pegelwandlung) nicht zu sehen. Ich bin seit einiger Zeit mit der

Ein Oszi wäre hier hilfreich.

>AVR schickt die Befehle raus, Handy bekommt sie und führt sie auch aus,
>aber ich bekomme einfach keine Rückmeldung vom Handy (obwohl das Handy
>wenns direkt mit dem PC verbunden wird, das "OK" anzeigt.)

Was heisst direkt mit dem PC verbunden? Da muss ja noch ein Pegelwandler 
dazwischen sein, denn der PC arbeitet mit 12V RS232 Pegeln und nicht 
2,7V LVCMOS.

>Was mache ich (seit Tagen) falsch???

Wahrscheinlich muss dein Pegelwandler vom Handy zum AVR invertieren, 
so wie es der MAX232 auch tut. Kann man leicht prüfen. Wenn im 
Ruhezustand die Leitung vom Handy auf HIGH liegt braucht du einen 
NICHTinvertierenden Pegelwandler, anderenfalls einen INVERTIERENDEN.

MFG
Falk

von Elektrolyt (Gast)


Lesenswert?

Hallo Falk,

danke für die schnelle Antwort, bin wirklich erstaunt...
Also direkt angeschlossen heisst, dass ich das Handy natürlich mit einem 
Datenkabel an den Rechner angeschlossen habe und da funktionieren die 
AT-Commands und es werden auch die Echos bzw Parametereinstellungen 
angezeigt.
Die Leitung vom Handy ist im Ruhezustand auf high und geht bei 
Aktivitäten auf Low. Also müsste ich, nach dem, was ich grad von dir 
erfahren habe mit dem Nichtinvertierenden Pegelwandler richtig liegen. 
Mich wundert es nur ein wenig, dass ich am Ausgang von der 
Transistorschaltung NIX (0.03V) messe, obwohl am Eingang High (2.7V) 
ist. also müsste doch der Ausgang voll durchschalten (5V) ??? Ich hab 
mir natürlich auch irgendwie vorgestellt, dass das korrekt sein muss, da 
die kompletten 5V am 1K Widerstand abfallen und am Ausgang gegen Masse 
natürlich NIX anliegt. Liege ich mit der Überlegung in etwa richtig???
Muss ich das Empfangen des ModemEchos mit Interrupts abholen, oder geht 
das auch im polling???
Vielen danke im Voraus...
gruss Elektrolyt

von Falk B. (falk)


Lesenswert?

@ Elektrolyt (Gast)

>Die Leitung vom Handy ist im Ruhezustand auf high und geht bei
>Aktivitäten auf Low. Also müsste ich, nach dem, was ich grad von dir
>erfahren habe mit dem Nichtinvertierenden Pegelwandler richtig liegen.

Genau.

>Mich wundert es nur ein wenig, dass ich am Ausgang von der
>Transistorschaltung NIX (0.03V) messe, obwohl am Eingang High (2.7V)
>ist. also müsste doch der Ausgang voll durchschalten (5V) ??? Ich hab

Eben. Da ist was faul.

>mir natürlich auch irgendwie vorgestellt, dass das korrekt sein muss, da
>die kompletten 5V am 1K Widerstand abfallen und am Ausgang gegen Masse
>natürlich NIX anliegt. Liege ich mit der Überlegung in etwa richtig???

Nein. Der Ausgang des Pegelwandlers wird praktisch nicht belastet, weder 
durch dein Messgerät (normales Multimeter hat 10 MOHm) noch durch deinen 
AVR (einge hundert MOhm). Also fliesst kein nennenswerter Strom durch R5 
und du musst 5V messen.

>Muss ich das Empfangen des ModemEchos mit Interrupts abholen, oder geht
>das auch im polling???

Kann man pollen. HALT!!!! Das kommt darauf an! Wenn du per Polling deine 
Kommandos sendest, und das Handy teilweise schon während des Empfangs 
antwortet dann brauchst du Interrupts!

MFG
Falk

von Elektrolyt (Gast)


Lesenswert?

Danke für deine Hilfe, Falk...
Ich habe den zweiten Transistor ausgetauscht, weil ich dachte, der sei 
defekt, doch ohne Erfolg.
Kann es daran liegen, dass ich statt der BC8xx die BC547C verwende??? 
Sind eigentlich beides Standardtypen, oder?
Ich spiele mittlerweile mit dem Gedanken, mein AVR-Board mit 3.3V zu 
betreiben. Dann dürfe der direkte Anschluss (Rx-Tx vertauscht) des 
Handys an den Controller ja keine Probleme machen und die Handyseitigen 
2.7V müssten am Controller als High erkannt werden, allerdings habe ich 
den MyAVRusb-Board. Da sitzt ein L7806CV (5V Spannungsregler) drauf. Was 
muss ich tun, damit ich mein Board mit 3.3V betreiben kann??? Oder ist 
das gar nicht möglich mit den Fertigboards, dass ich den Spannungsregler 
austauschen kann, ohne weitere Maßnahmen. Ich bin echt am Verzweifeln, 
mit Interrups habe ich dummerweise noch nichts zu tun gehabt und wüsste 
auch nicht auf anhieb wie ich das realisiere. Das würde auch sehr viel 
Zeit in Anspruch nehmen, Zeit die ich für das Projekt nicht habe. Hast 
du ein Vorschlag, wie ich die Modemechos ohne Interrups abholen kann? 
Oder vielleicht eine Funktion in C? Ich übergebe die AT-Befehle mit der 
Funktion:
********************************************************************

void uart_puts (const char *s)
{
  do
  {
    uart_putc (*s);
  }
  while (*s++);
}

********************************************************************
Das klappt ja auch ohne Probleme, aber wie hole ich die Daten (bzw. 
erstmal mein Modemecho "OK") ab??? Etwa mit der Funktion:
********************************************************************

static inline uint8_t uart_getc_wait()
{
  // Warten, bis etwas empfangen wird
            while (!(UCSRA & (1 << RXC))) ;
  // Das empfangene Zeichen zurückliefern
     return UDR;
}

********************************************************************
oder mit der Funktion:
********************************************************************
static inline int uart_getc_nowait()
{
  return (UCSRA & (1 << RXC)) ? (int) UDR : 44;
         Liefert das Empfangene Zeichen zurück, ansonsten Zeichen 44;
}

Wäre für eine Antowrt oder ein Codebeispiel sehr dankbar, damit ich 
ausschliessen kann, dass ich Software-technisch Fehler vermeide. Ich 
übergebe die Befehle per polling, aber ich kann nicht sagen, ob mein 
handy bereits beim Datenempfang Antwortet, da der gesendete String mit 
dem Befehl ja erst mit dem "Carrier Return" abgeschlossen wird, und 
exakt nach dem Return, lautet mein nächster Befehl im Hauptprogramm "auf 
eine Antwort warten". Vermutlich müsste dann doch was vom Handy kommen, 
z.b das "OK" oder "RING" beim Anruf?! Kann mir das jemand bestätigen, 
damit ich Quellcodemässig schon mal abgesichert bin???
Dann bleibt noch die Sache mit der Pegelwandlung. Ich weiss nicht warum 
aber die Transistorschaltung funktioniert bei mir nicht. Am Ausgang 
liegen immer nur 0.01-0.03V an statt der 5V :-( weil die ganze Spannung 
an R5 abfällt :-( was mache ich falsch??? Müssen es die BC847er sein???
Ich brauch eure Hilfe, kann im Netz ansonsten keine Referenzen zu dem 
Thema und meinem Problem finden und wenn dann nur Ansatzweise hier in 
dem Forum.
gruss Elektrolyt

von Falk B. (falk)


Lesenswert?

@ Elektrolyt (Gast)

>Kann es daran liegen, dass ich statt der BC8xx die BC547C verwende???
>Sind eigentlich beides Standardtypen, oder?

Das passt.

>Ich spiele mittlerweile mit dem Gedanken, mein AVR-Board mit 3.3V zu
>betreiben. Dann dürfe der direkte Anschluss (Rx-Tx vertauscht) des
>Handys an den Controller ja keine Probleme machen und die Handyseitigen
>2.7V müssten am Controller als High erkannt werden, allerdings habe ich

Ja.

>den MyAVRusb-Board. Da sitzt ein L7806CV (5V Spannungsregler) drauf. Was
>muss ich tun, damit ich mein Board mit 3.3V betreiben kann??? Oder ist

Spannungsregler tauschen.

>du ein Vorschlag, wie ich die Modemechos ohne Interrups abholen kann?

Das könnte kniffliger werden als mit Interrupts. Schau dir den Link 
mal an.

uart_getc() ist schon OK.

>Wäre für eine Antowrt oder ein Codebeispiel sehr dankbar, damit ich

Erstmal muss dein Pegelwandler laufen! Denn du musst wenigsten EIN 
Zeichen als Antwort sehen, auch ohne Interrupts.

>exakt nach dem Return, lautet mein nächster Befehl im Hauptprogramm "auf
>eine Antwort warten". Vermutlich müsste dann doch was vom Handy kommen,

Das passt dann erstmal.

>z.b das "OK" oder "RING" beim Anruf?! Kann mir das jemand bestätigen,

Eben. Genau das, was du auch am PC im Terminal siehst. Nimm mal HTerm, 
dort wird für jedes Byte die genaue Sende - und Empfangszeit 
protokolliert. Damit kannst du leicht feststellen wann das Handy 
antwortet, ganz ohne Oszi.

http://www.der-hammer.info/terminal/index.htm

>Dann bleibt noch die Sache mit der Pegelwandlung. Ich weiss nicht warum

Nein, das ist der ERSTE Punkt.

>aber die Transistorschaltung funktioniert bei mir nicht. Am Ausgang
>liegen immer nur 0.01-0.03V an statt der 5V :-( weil die ganze Spannung
>an R5 abfällt :-( was mache ich falsch??? Müssen es die BC847er sein???

Komplette Schaltung?

MFG
Falk

von Elektrolyt (Gast)


Lesenswert?

Nach ellenlanger Fehlersuche kann ich jetzt sagen, dass der Pegelwandler 
läuft.. ich habe spasseshalber den ersten Transistor auch ausgetauscht, 
weil ich absolut nicht mehr weiter wusste...  es lag wohl daran, kanns 
mir zwar nicht erklären, warum der defekt sein kann, oder nicht so 
funktioniert hat, da neu, aber okey...
Also, die wichtigste Hürde ist getan, am Ausgang liegen jetzt 4.8V an 
und das is definitiv High...
Bleibt noch die Sache mit dem Modemecho. Ich habe gerade nochmal das 
Programm umgeschrieben und warte in MAIN auf Zeichen in einer 
Endlosschleife. Hyperterminal lieferte wieder nix, aber ich habe mal das 
gebrannte Programm in AVR Workpad Plus simuliert und getestet mit 
19200bauds/8/n/1/n und ich habe während des Tests auf das Handy 
angerufen, (nix anderes tue ich seit 2 tagen mit dem Hyperterminal) 
siehe da, das Programm liefert mir ein String mit
(0x0D 0x0A 0x52 0x49 0x4E 0x47 0x0D 0x0A) zurück,
dies würde ja einem (Return, LineFeed,"RING",LineFeed) entsprechen, 
worauf ich ein wenig stolz bin :-) Natürlich nur mit deiner Hilfe Falk, 
bin dir sehr dankbar, aber warum macht Hyperterminal das nicht mit??? 
Werde mir gleich mal das von dir genannte Programm anschauen und es 
damit testen und natürlich auch posten. Wie kanns sein, dass die 
Simulation in Workpad funktioniert und im Hyperterminal mit den selben 
Einstellungen nicht??? Einstellungsfehler??? Ich benutze keine 
Flusssteuerung und auch die 8/n/1/19200bauds sind eingestellt??? Was 
macht die Simulation in Workpad anders???
hoffe, ich geh dir nicht aufn Sänkel
gruß Elko

von Elektrolyt (Gast)


Lesenswert?

<\r><\n>RING<\r><\n><\r><\n> liefert hterm... warum sehe ich das "ring" 
nicht im hyperterminal, was für ein Terminalprogramm könnt ihr mir noch 
empfehlen, das zb. auch auf Linuxdistros vertreten ist oder gern benutzt 
wird, womit ich das ganze nochmal Testen könnte???
Viele vielen Dank im Voraus, Klasse Forum hier...
gruß Elko

von Christian K. (Gast)


Lesenswert?

Hallo,

nimm RealTerm... is besser als HT, es zeig dir auch <CR> und <LF> an...

von Christian K. (Gast)


Lesenswert?

Um die Antwort des Handys auszuwerten schreibst du dir am besten eine 
Methode,
die dir aus "<CR><LF> Antwort <CR><LF>" die Antwort extrahiert.

- mit einer State machine
oder
- mit while-schleifen

void funct_name(unsigned char* antwort)

1. <LF> erkennen
2. folgende Zeichen in anwort ablegen, solange das empfangene Zeichen != 
<CR>


Diese methode rufst du auf nachdem du das entspr. AT-Kommando an das 
Handy gesendet hast.

von Elektrolyt (Gast)


Lesenswert?

Danke für die Antwort, ist eine gute Idee, werds gleich mal probieren. 
Das ist dann dafür gedacht, dass die stözeichen nicht angezeigt 
werden??? Oder hat das auch was mit Speicheroptimierung zu tun, wenn die 
"unnötigen" Zeichen nicht gesendet werden???
Also zu dem Projekt, ich hatte es mir erstmal so vorgestellt, dass 
sobald ein ring ankommt, das handy abnimmt (da Flatrate) und dann würde 
ich ganz gern DTMF Töne senden und diese dann mit dem Handy und dem 
Controller auswerten und entsprechend schalten.
Ist das heute irgendwie eleganter zu lösen, als die Vorschläge hier im 
Forum vor 2-3Jahren???
Gibt es ne "relativ einfache" Möglichkeit DTMF Töne vom Handy zum 
Controller zu übertragen über die Tx oder Rx Leitung??? Also ne art UART 
für DTMF töne??? Oder was genau geschieht wenn DTMFs an ein Handy 
ankommen???
Vielen dank im Voraus
gruß Elko

von Elektrolyt (Gast)


Lesenswert?

Hmmm, bekomme nur bei Hterm und dem Simulationstool von AVR Workpad Plus 
ein "RING" angezeigt, aber leider nicht mit Realterm oder 
Hyperterminal... Woran kann das liegen??? Sind irgendwelche besonderen 
Einstellungen vorzunehmen (ausser die 19.2kBauds 8/n/1/n)????
Schönen gruß
Elko

von Elektrolyt (Gast)


Lesenswert?

Hallo Zusammen,

kann mir keiner auf die Sprünge helfen, bezüglich der Zeichen, die bei 
der Simualtion und in Hterm über eine serielle Verbindung angezeigt 
werden aber im Hyperterminal nicht, trotz der selben Einstellungen? Ich 
bekomms einfach nicht hin...

von Falk B. (falk)


Lesenswert?

@  Elektrolyt (Gast)

>werden aber im Hyperterminal nicht, trotz der selben Einstellungen? Ich
>bekomms einfach nicht hin...

Hyperterminal ist nicht sonderlich gut. Für einfache Sachen OK, wenns 
bissel mehr sein muss reicht es nicht mehr.

MFG
Falk

von Christian K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

RealTerm zeigt alle gesendeten Zeichen an... siehe Anhang

von Elektrolyt (Gast)


Lesenswert?

Klar macht realterm das, keine Frage... Aber nicht bei mir :-(
Ich nehme auch an, dass du das "Ring" durch eine direkte Verbindung 
zwischen handy und pc empfangen hast??? Oder hängt dein Controller auch 
dazwischen und du hörst die Leitung mit?
ich nehme mal ganz stark an, dass es bei mir daran liegt, dass ich die 
Verbindung zwischen uC und Handy mit dem MySmartUsb mithöre. HTerm 
machts auf jeden fall aber die anderen leider nicht. Handy mit dem 
Datenkabel am PC liefern alle Terminals ein "RING" "OK" "ERROR" etc. 
Liegt wahrscheinlich am MySmartUsb, denke nicht, dass es an den 
Terminalprogrammen oder am Code selber liegt, weil die Simualtion läuft.
Mir gehts eigentlich auch nur darum, nachvollziehen zu können, was die 
Leitungen sagen/antworten um programmierfehler auszuschliessen, daher 
ein Terminalprogramm. Später wird die ganze Sache eh nur noch über GSM 
bzw DTMF-Tönen gesteuert, da brauche ich kein Terminal.
MT8870 ist bestellt und sobald es weiter geht, halte ich euch auf dem 
laufenden oder stell weitere "unnötigen" Fragen :-(
MFG Elko

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.