Hallo Leute,
bin am Verzweifeln!
Ich Versuche mit einem AVR-Board (von http://www.mikrocontroller.com)
ein Siemens-Handy, über RS232, zu steuern. Leider erhalte ich keine
Rückmeldung vom Handy. Wenn ich jedoch das Handy an den PC anschließe
und mit dem Terminalprogramm vom Norton-Commander die Zeichenfolge sende
erhalte ich die gewünschte Rückmeldung. Hier ist ein Ausschnitt meines
Programmcodes:
$regfile = "4434def.dat"
$baud = 19200
$crystal = 8000000
Const Cmaxchar = 16 'number of
characters
Dim B As Bit 'a flag for
signalling a received character
Dim Bc As Byte 'byte
counter
Dim Buf As String * Cmaxchar 'serial
buffer
Dim Key As Byte 'Tasten auf
Board
' Initialisierung LC-Display
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 ,
Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Config Lcd = 16 * 2
Config Portc = Output
Reset Portc.1
Initlcd
Cursor On
Cls
Lcd "Start"
Wait 10
On Urxc Rec_isr 'define
serial receive ISR
Enable Urxc 'enable
receive isr
Enable Interrupts 'enable
interrupts to occur
'-----------------------------------------------------------
' Hauptprogramm
Do
'Tastaturabfrage
Key = Pina And &B11111000
Locate 1 , 1
If Key = 128 Then
Lcd "atz"
Print "atz";
Print Chr(13) ; Chr(10);
Wait 2
Elseif Key = 64 Then
Lcd "ate0"
Print "ate0";
Print Chr(13) ; Chr(10);
Wait 2
Elseif Key = 32 Then
Lcd "at+cmgw=140"
Print "at+cmgw=140";
Print Chr(13) ; Chr(10);
Wait 2
Elseif Key = 16 Then
Lcd "SMS PDU-Format"
Print "0001000c91947111440955000005c8329bfd06";
Print Chr(26);
Wait 2
Elseif Key = 8 Then
Lcd "at"
Print "at";
Print Chr(13) ; Chr(10);
Wait 2
Else
Lcd " "
End If
If B = 1 Then 'we received
something
Disable Serial
Locate 2 , 1
Lcd Buf 'print
buffer
'now check for buffer full
If Bc = Cmaxchar Then 'buffer full
Buf = "" 'clear
Bc = 0 'rest
character counter
End If
Reset B 'reset
receive flag
Enable Serial
End If
Loop
'-----------------------------------------------------------
Rec_isr:
If Bc < Cmaxchar Then 'does it fit
into the buffer?
Incr Bc 'increase
buffer counter
If Udr = 13 Then 'return?
Buf = Buf + Chr(0)
Bc = Cmaxchar
Else
Buf = Buf + Chr(udr) 'add to
buffer
End If
End If
B = 1 'set flag
Return
End 'end program
Im Terminalprogramm habe ich Makros mit den Gleichen Zeichenfolgen
belegt, wie ich sie auch vom AVR-Board sende.
Zur Kontrolle habe ich beide Zeichenfolgen aufgezeichnet - ich erhalte
auch die gleichen Ergebnisse.
Was mache ich falsch?
Gruß Micha
Hallo Mike,
ich bin mir nicht ganz sicher, aber Rx liegt an Pin 2 und Tx liegt an
Pin 3 - also wie eine normale RS232-Beschaltung.
Oder sehe ich das falsch?
Gruß Micha
Hallo Mike,
an das Board habe ich einen 9-poligen Stecker angeschlossen (Beschaltung
wie im Schaltplan angegeben (RX an Pin2 usw.)).
Das Handy schließe ich direkt an (sowohl Board, als auch PC).
Zum Mitschneiden der Daten habe ich einen Laptop, über ein
Nullmodem-Kabel, angeschlossen.
Da ich mir nicht 100%ig sicher bin möchte ich die Leitungen auch nicht
tauschen (wegen Ausgang auf Ausgang).
Was kann noch falsch sein?
Gruß Micha
Hallo Micha,
Also für den Anschluß eines Handy's am Pc oder am Mikrokontroller würde
ich generell ein Datenkabel für's Handy kaufen, und es darüber
anschließen.
schau mal hierzu auf www.handyzubehoer.de, da kriegst du die Kabel für 5
euro und'n paar kaputte.
dann habe ich in deinem quellcode kannst du dir das Print chr(10);print
chr(13) sparen, indem du dein smikolon hinter dem jeweiligen Befehl
einfach weglässt.
z.b. Print "AT"
fertig.
mit dem Befehl cmgw speicherst du nur eine SMS im memory des Handys
ab....
Sven
Hallo Sven,
natürlich habe ich ein Datenkabel.
Wenn ich ein Semikolon hinter dem Print platzier wird nur ein Linefeed
angehängt; ich brauche aber CR(0x0D) und LF(0x0A).
Mit dem "cmgw" ist schon richtig; ich will ja nicht bei jedem Versuch
eine SMS abschicken. Falls das Handy meine Befehle endlich mal annimmt,
werde ich es durch ein "cmgs" ersetzen.
Gruß Micha
Hi,
welches Modem verwendest Du?
Viele haben kein echtes Modem eingebaut, sondern verwenden ein
Softwaremodem über Windows (z.B. 3210).
Ein 6210 hat im Gegensatz dazu ein richtiges Modem integriert...
Bis dann,
Ingo
Hallo Ingo,
das Handy ist ein S35i. Was ich an der ganzen Sache nicht verstehe ist,
wenn ich die AT-Kommandos im Terminalprogramm eingebe zB. "ate0" bekomme
ich als Rückantwort das "OK".
Wenn ich dieses AT-Kommando vom AVR-Board absetze bekomme ich keine
Rückantwort.
Das Basic-Programm scheint aber richtig zu funktionieren, denn es sendet
die AT-Kommandos genau wie das Terminalprogramm und die
Interruptroutiene stellt auch die empfangenen Zeichen dar (die ich im
Terminalprogramm eingebe).
Die Belegung des Sub-D-Steckers (Rx Pin 2, Tx Pin 3) ist doch richtig?
Könnte es ein Timingproblem sein? (Was ich aber bezweifle, denn die
AT-Kommandos vom Terminalprogramm werden über Makroa abgesetzt)
Was kann ich noch testen bzw. überprüfen?
Gruß Micha
Hi
Hast du einen RS232 Treiber am AVR?(er negiert)
Baud im AVR OK?
RTS/CTS werden nicht benötigt?
Empfange doch deine AVR-Signale am besten mal am PC, da ist die
Kontrolle einfacher.(Antworten geht auch noch)
Gruss Uwe
Hallo an Alle,
ich habe ja schon Alles probiert.
Die vom AVR-Board abgehenden Daten habe ich in ein File geschrieben.
Diese stimmen exakt mit denen vom PC überein. Nur das Handy reagiert auf
die Daten vom PC, aber nicht auf die vom AVR-Board.
?????????????????????????????
Gruß Micha
Hallo,
Hast Du wenn Du das Handy anschließt RX und TX vertauscht?
uC<->PC<->Handy
RX<->TX<->RX
TX<->RX<->TX
so kann der PC mit dem uC und/oder dem Handy "sprechen".
Aber wenn man bei dem Gedankenspiel den PC wegläßt:
uC<->Handy
RX<->RX
TX<->TX
das past dann wohl nicht, also wenn der uC mit dem Handy "sprechen"
soll, RX und TX vertauschen.
Es kann auch sein, dass das Daten Kabel auf einem Pin (ich meine DTR)
noch 5V für die eigen Elektronik braucht. Mußte ich aber bei mir nicht
anschließen.
Ich habe das ganze mit anhängendem ASM Code getestet. Läßt das Handy die
zuletzt gewählte Nummer wieder anrufen.
Wenn Du den Fehler hast, poste es doch bitte hier. Interessiert mich
woran es lag.
Hallo Micha,
ich hatte genau das gleiche Problem. Allerdings reagierte das Handy auf
Kommandos vom Atmel. Der Atmel empfing aber auch keine Antwort.
sendstring1("atd1234;"); // wählt 1234
outp( 0x0D,UDR1); // CR
Es ging aber auch nur wenn ich statt LF und CR NUR CR (0x0D) angehängt
habe. Dann wählte das Handy (sorry verwende AVRGCC).
Habe damals quasi aufgegeben und nur gesendet.
Martin
Hallo,
habt ihr schon mal die Spannungspegel an der Schnittstelle gemessen?
Benutzt ihr einen Schnittstellentreiber zb. Max 232 oder so?
Denn die Pegel die das Handy sendet könnten zu klein sein.
Christian
Hallo,
die Pegel hab' ich nicht nachgemessen.
Aber das Handy sendet richtig (zumindest zum PC) und empfängt auch
richtig (vom PC).
Das AVR-Board zeigt im Zusammenspiel mit dem PC das gleiche Verhalten.
Am PC und am AVR-Board sind 9-polige SUB-D Stecker mit fast der gleichen
Belegung (am AVR-Board sind keine Steuersignale sonden nur die
Steuerleitungen gebrückt).
Zur Verbindung AVR-Board <---> PC verwende ich ein Nullmodem-Kabel, bei
dem alle Leitungen beschaltet sind.
Gruß Micha
Hallo Micha,
Bitte bedenke, das man für die Verbindung zwischen PC ein Buchse -
stecker kabel verwendet, daher
auf dem Controller board eine Buchse.
Das Datenkabel vom Handy , braucht aber einen Stecker....
du mußt dann also den Stecker auf dem Kontrollerboard komplett anders
anschließen, da ja dann alles Spiegelverkehrt ist....
Wenn du dein Kontrollerboard mit dem PC verbindest und dann Spannung
anlegst,siehst du denn dann im terminalprogram was der Atmel sendet ???
Sven
Hallo ME,
messe doch mal die Spannung an der Ladungspumpe vom MAX 232. Im
Schaltplan sind als C's 100n eingezeichnet. Wenn ich micht recht
erinnere müßten hier 10µ bestückt sein, eine Version des MAX kommt auch
mit 1µ aus. Möglicherweise haben die Sendepegel halt nicht wie
vorgeschrieben +/- 12V. Denkbar ist auch ein Pegelschwingen bei falscher
Bestückung der Ladungspumpe. Hatte ich in einer ähnlichen Beschaltung.
Der Fehler kann aber schnell mal mit einem Oszi lokalisiert werden. Du
weißt ja wo welche stehen.
Gruß Jörg
Hallo Leute,
Hurra ich hab's geschafft.
Mein AVR-Board kann nun eine SMS zum Handy schicken.
Das Problem bestand darin, das auf Pin 4 des Sub-D Steckers eine
positive Spannung liegen muß.
Diese Spannung wird für das Datenkabel benötigt.
Ich habe dazu von Pin 7 des MAX232 (zweiter TX-Ausgang) eine Brücke zum
Pin 7 des Steckverbinders JP1 gelötet. Der dazugehörende TX-Eingang
liegt schon auf Masse.
Jetzt muß ich noch die Auswertung der Handyrückmeldungen realisieren.
Dazu noch eine Frage:
Ich möchte die Rückmeldungen auf dem LC-Display ausgeben.
Wie muß der Interupt der seriellen Schnittstelle im Bascom-Basic
behandelt werden?
Danke an Alle die sich an dieser Diskusion beteiligt haben.
Gruß Micha
Hallo Micha,
Schön das du es endlich geschafft hast.
Also ich hab das bei mir nicht über nen interrupt gemacht, sondern frage
alle 3 sekunden, ob ne nachricht im handyspeicher liegt.
nach dem lesen, wird die nachricht dann gelöscht.
hoffe ich konnte dir helfen.
sven