Forum: Mikrocontroller und Digitale Elektronik Modem mit Mega8 ansteuern klappt nicht :-(


von Michael (Gast)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

Hallo nochmal,

ich habe mein Programm nun etwas erweitert, sodass die vom Modem 
empfangenen Daten auf einem LCD-Display ausgegeben werden.

Ergebnis: Das was ich sende, bekomme ich zurück, aber von einem "OK" - 
keine Spur.

Testweise habe ich das RTS-Bit vor dem Senden eines Bytes auf Low 
gesetzt,
nachher auf High. Hat aber nichts verändert an der Kommunikation mit dem 
Modem (mit PC hab ichs noch nicht probiert).

--- schnipp ---
initSer:  sbi  DDRWAEHL,rtsBit
    sbi  WAEHLPORT,rtsBit

        ; 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:  cbi  WAEHLPORT,rtsBit
    rcall  w5ms
    rcall  w5ms
    sbis  UCSRA,UDRE
    rjmp  outSer
    out  UDR,outbyte
    rcall  w5ms
    rcall  w5ms
    sbi  WAEHLPORT,rtsBit
    rcall  serToLcd
    ret

serToLcd:  sbis  UCSRA,RXC
    ret
    in  outbyte,UDR
    rcall  outLcd
    rcall  w5ms
    rcall  w5ms
    rjmp  serToLcd





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

    ldi  temp,0xFF      ; kurze Warteschleife
dialWt1:  rcall  w5ms
    dec  temp
    brne  dialWt1


    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
--- schnapp ---

Danke nochmals für die Hilfe!

liebe Grüße,
Michi

von Michael (Gast)


Lesenswert?

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

von AVRli (Gast)


Lesenswert?

Hi Michi,

die DTR Überprüfung kann man im Modem mit einem Parameter deaktivieren.

Ich glaube "AT&D0" muste mal probieren...

MfG AVRli...

von Rahul D. (rahul)


Lesenswert?

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.

von Egon M. (kpc)


Lesenswert?


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

von Michael (Gast)


Lesenswert?

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

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.