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
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
@ 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
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
@ 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
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
@ 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
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
<\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
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.
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
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
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...
@ 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
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