Hallo zusammen,
ich habe ein kleines Problem... g ich probiere mal, mich so kurz und
knapp wie möglich auszudrücken ;-)
Mein Ziel:
Das Modem dazu zu bringen, eine Nummer zu wählen, die als ASCII im
Speicher des Mega8 ist (ab Adresse 0x60)
Problem: Modem wählt nicht.
Meine Hardware:
Atmega8 auf myAVR LPT-Experimentierboard (MAX232-Pegelwandler
integriert)
Clock 3,6864 MHz.
Bisherige Lichtblicke:
- im "myAvrQuickProg" (Software zum Flashen) îst ein Controlcenter
dabei, mit dem man auch mit dem Board seriell kommunizieren kann. Die
Daten kommen an.
- Die "Receive"-LED am Modem flackert kurz auf.
(- Unter Linux kann ich mit einem Usb2Serial-Konverter das Modem per
Minicom ansprechen. Ob ich Daten vom µC auf gleichem Wege bekomme, habe
ich noch nicht getestet.)
Ich weiß nicht genau ob folgendes richtig ist:
- RTS-Pineingang am Max232 habe ich konstant auf Low gelegt.
- Zeilenende: Dezimal 10 (LF), danach dezimal 10 (CR)
- Woher "weiß" das Modem überhaupt, mit welcher Geschwindigkeit der
Controller sendet?
Die interessanten Codestellen:
initSer: ; Bitrate setzen (9600) => 23(dec) = 17h
ldi temp,0x00
out UBRRH,temp
ldi temp,0x17
out UBRRL,temp
; sbi UCSRB,RXEN ; Receiver aktivieren
sbi UCSRB,TXEN ; Transmitter aktivieren
; Standardwerte (8bit, 1 Stopbit, Kein Parity) -> default
ret
outSer: sbis UCSRA,UDRE
rjmp outSer
out UDR,outbyte
ret
dialCmd: ldi XH,0x00
ldi XL,0x60
ldi outbyte,'A' ; Modem init (ATZ)
rcall outSer
ldi outbyte,'T'
rcall outSer
ldi outbyte,'Z'
rcall outSer
ldi outbyte,10
rcall outSer
ldi outbyte,13
rcall outSer
rcall w5ms ; kurze Warteschleife
rcall w5ms
ldi outbyte,'A'
rcall outSer
ldi outbyte,'T'
rcall outSer
ldi outbyte,'D'
rcall outSer
dialNumLp: ld outbyte,X+
cpi outbyte,0
breq dialEnd
rcall outSer
rjmp dialNumLp
dialEnd: ldi outbyte,10
rcall outSer
ldi outbyte,13
rcall outSer
ret
Noch ne kleine Anmerkung zum cpi-Befehl: Die "Endemarke" ist das
Nullbyte, deswegen der Vergleich.
Kann mit vielleicht jemand helfen bzw. Tipps zur Fehlersuche geben?
Danke schonmal im Voraus!
Liebe Grüße,
Michael
Hallo,
was sagt das Moden denn, wenn Du mit einem simplen Terminal-Programm ATZ
nach dem Modem-PowerOn schickst? Wenn die Baudrate stimmt, muß ja OK
zurückkommen. Damit kannst Du zumindest die Baudrate finden, auf der das
Modem nach PowerOn per default steht.
Normalerweise finden die Modems auch selber die Rate raus, das bedingt
aber sicher, daß erstmal mehr gesendet wird. Ich würde da lieber die
Standard-Rate des Modems ergründen.
Außerdem erwarten alle gängigen Modems Hardware-Handshake, da wirst Du
auch nicht drumrum kommen.
Kannst Du aber alles per Terminalprogramm rausfinden.
Damit irgendwelche Automatiken des Terminalprogramms beim Connect nicht
dazwischenfunken können, einfach das Modem mal aus- und einschalten,
wenn Du meinst, Du hast die Werte. Wenn es ann nicht sofort auf ATZ
antwortet, stimmt noch irgendwas nicht.
Gruß aus Berlin
Michael
Hallo Michael,
erstmal danke für deine schnelle Antwort!
Jetzt habe ich folgendes getestet:
1. Modem aus, Terminalprogramm (Minicom) an.
2. Modem an (9600 bps, 8 bits, No Parity, 1 Stopbit)
3. ATZ gesendet
4. OK kommt zurück
Das scheint also zu klappen, oder?
Nun habe ich
5. Minicom laufen lassen, Modemkabel ausgesteckt
6. Atmel-Controller angeschlossen
Anzeige:
ATZ
ATD012345
Die Übertragung zum Terminalprogramm geht also auch...
Mit dem Hardware-Handshake, da hast du recht, das habe ich mir noch
nicht wirklich angeschaut - muss das Handshake nur am Anfang oder vor
jedem Byte erneut erfolgen? Kennst du evtl ne gute Tutorial was das
Handshake angeht?
Dass der derzeitige Stand (Handshake) ne Notlösung ist ist klar... kann
das so überhaupt funktionieren? ;-)
Danke nochmal und liebe Grüße aus Stuttgart,
Michael
Hallo nochmal,
das Problem habe ich in den Griff bekommen. Es lag daran, dass am
DTR-Pin (Data Terminal Ready) logisch 0 anliegen muss. Nur zum Testen
hab ich den RTS-Pin-Ausgang mit dem DTR-Pin am Modem verbunden.
Hardware-Handshaking war übrigens im Terminalprogramm auch nicht aktiv,
daran lag es also nicht dass das Modem nicht reagiert hat.
Liebe Grüße,
Michi
Modems kann man eigentlich mit einem "primitiven" Modelkabel mit 3 Adern
betreiben: RXD, TXD und GND. Wenn das Modem wirklich die
Handshake-Leitungen betan haben möchte, kann man CTS mit RTS und die
anderen drei Leitungen auch miteinander verbinden. Dann ist das Modem
sein eigener Host für diese Signale. Das braucht man dann auch nur auf
der Modemseite machen.
Hi Michi
Das Ganze interessiert mich sehr, weil ich demnächst auch ein Modem an
einen ATmega (16) anschließen muß.
Könntest Du vielleicht mal den Hardware-Plan schicken oder ins Netz
stellen?
Wäre riesig nett.
Viele Grüße aus der Umgebung von Karlsruhe
Egon
Hallo Egon,
hardwaremäßg habe ich im Prinzip nichts gemacht, weil mein
Experimentierboard (myAVR Parallelboard) schon einen RS-232-Interface
hat. Die Verbindung AVR <--> PC habe ich mit einem Nullmodemkabel
realisiert, die Verbindung zum Modem mit einem einfachen Seriell-Kabel.
Auf der Platine ist ein Max232-Chip drauf, ein Pegelwandler, der die
TTL-kompatiblen Signale (+5V/0V) in RS-232 umwandelt (-10V / +10V) -
zumindest wenn ich das richtig verstanden habe ;-)
Konnte ich dir damit helfen, oder brauchst du nähere Infos?
@AVRli und Rahul: Danke für die Tipps, werde ich gleich probieren!
Damals ging es mir sowieso darum, das Ding überhaupt zum Laufen zu
bekommen ;-)
Liebe Grüße,
Michi