Siemens S35 Kommunikation über RS232 (STK500)

OP #2096708
Lesenswert?

Ich versuche einen Atmega8, der in einem STK500 steckt, mit meinem S35 
reden zu lassen, was leider nicht so richtig funktioniert.
Benutzt wird ein billiges ebay Datenkabel (P5=GND, P2=TxD, P3=RxD), 
welches dann auch genau so an das STK500 verbunden wurde, also direkt an 
PD0 bzw PD1 und GND.
Spreche ich das Telefon via Hterm und aktiviertem DTR an funktioniert 
dies auch, nur über den Mikrocontroller kommt nichts an, was anscheinend 
an DTR liegt, da ich nicht verstehe, wie ich das im Programm 
"aktivieren" kann.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Hardware_Handshake
Hier habe ich gelesen, dass ich den Handshake mittels 0x11 herstellen 
kann, aber entweder habe ich das ganze nicht verstanden, es falsch 
eingesetzt oder (am ehesten) beides zusammen.
Ich benutzte die UART Bibliothek von Peter Fleury.

Um genau zu sein, wird zwar was auf dem LCD ausgegeben (Kommunikation 
scheint zu gehen), aber das Handy reagiert nicht auf die AT Befehle.
ZB ausschalten (AT^SMSO), was via Hterm funktioniert).

Eventuell kann mir ja jemand auf die Sprünge helfen.
Danke!
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <avr/pgmspace.h>
7
#include <util/delay.h>
8
#include "lcd-routines.h"
9
#include "includes.h"
10
#include "uart.h"
11
#define UART_BAUD_RATE      19200
12

13
int main () {
14

15
  unsigned int c;
16
  char buffer[7];
17
  DDRD  &= ~(1<<PD3);
18
  PORTD &= ~(1<<PD3);
19

20
  lcd_init();
21
  uart_init(UART_BAUD_SELECT(19200,4000000L));
22
  sei();
23

24
  while (1) {
25
    c = uart_getc();
26

27
    if ( c & UART_NO_DATA ) {
28
      /*
29
       * no data available from UART
30
       */
31
    }
32

33
    else {
34
      itoa( c, buffer, 10);
35
      lcd_string(buffer);
36
    }
37

38
    if (debounce( PIND, PD3 )) {
39
      uart_putc(0x11);
40
      uart_puts("AT^SMSO");
41
      uart_putc(13);
42
      uart_putc(10);
43
    }
44
  }
45
}
Persönliche Seite #2096911
Lesenswert?

Das "Datenkabel" des S35 benutzt eine parasitäre Spannungsversorgung für 
die im Kabel verbauten RS232-Pegelwandler. Daher genügt es nicht, dieses 
Kabel nur mit RxD/TxD und Masse zu verbinden, sondern es müssen zwingend 
die anderen Handshakeleitungen auf korrektes Potential gelegt werden, 
was für einen PC kein Problem darstellt.

Einfacher wäre es hier, auf das Datenkabel komplett zu verzichten und 
das Telephon komplett ohne Pegelwandler mit dem µC zu verbinden -- wenn 
ich mich recht erinnere, nutzt das Telephon 3V-TTL-Pegel, die direkt mit 
der UART eines µC verbunden werden können, wenn der auch mit 3V 
betrieben wird.
OP #2097368
Lesenswert?

Danke erstml für die Hinweise.
Ich dachte, da nur diese drei Leitungen am Handy ankommen, würde es auch 
reichen nur diese zu beschalten.
Na ja.
Da ich den Atmega mit 5V betreibe, kann ich das Handy ja nicht einfach 
so anschließen, sondern wohl so wie in der angehängten Schaltung.
Nur habe ich aber leider grade keine 2.7V Zenerdioden da.
Kann ich diese mit 3.6V Zenerdioden ersetzen (ansonsten habe ich noch 
1N4148 und 1N4001 da)?
Angehängte Dateien:
OP #2098174
Lesenswert?

Falls es jemanden interessieren sollte, so habe ich es nun erfolgreich 
hinbekommen:
1
                ____
2
AVR/RX o-------[____]--------o S35 Pin 5
3
                100ohm
4
                ____
5
AVR/TX o-------[____]----+---o S35 Pin 6
6
                100ohm   |
7
                        -+-
8
                        / \ 3.6V Z-Diode
9
                        -+-
10
                         |
11
AVR/GND o----------------+---o S35 Pin 1

Jetzt muss ich es nur noch hinkriegen, die Ausgabe vom Handy an das LCD 
in Klartext umzuwandeln...
OP #2098190
Lesenswert?

Bastian F. schrieb:
> Jetzt muss ich es nur noch hinkriegen, die Ausgabe vom Handy an das LCD
> in Klartext umzuwandeln...

Anstatt lcd_string und Variablen-/Arrayverwurschtelei einfach lcd_data 
verwenden hat was ;)

Nun gibt es aber folgendes Problem.
Das Handy reagiert brav auf uart_puts("AT^SMSO\r"); und geht aus, bei 
allen anderen Befehlen wie zB uart_puts("AT+CGMI\r");  bekomme ich immer 
einen ERROR ausgegeben. Woran liegt das denn nun?
Gast #2098737
Lesenswert?

Beim S25 antwortet das Telefon bei 19200 kBaud sauber, wie man es vom 
Hyperterminal etc. gewohnt ist. Bei anderen Baudraten mußte ich immer 
Byteweise mit einer wartezeit zw. den Bytes senden. Das Autobauding hat 
bei dem Handy wohl seine Grenzen.

Aber Du solltest besser \r\n (0x0D, 0x0A) beim Senden benutzen. Bei 
manchen Befehlen funktioniert die Akzeptanz auch bei mir nicht.

Mit dem S25 kodiere und dekodiere ich SMS, die im PDU-Format gesendet 
werden. Bei eine SMS von 160 Zeichentext, mußte der Controler schnell 
mal 500 Byte verarbeiten können. Deshalb habe ich mir dann einen Mega 
mit mehr RAM ausgesucht. Wenn Du mehr vorhaben solltest, könnte Dir der 
RAM im mega8 irgendwann zu eng werden.

Der ATmega644P (DIP) kann noch im STK500 betrieben werden, hat 4 k RAM, 
kostet ca. 6-7 Euro bei Reichelt und hat ein OCD zum Debuggen on Chip. 
Außerdem kannst Du den mit 20Mhz betreiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren