Forum: Mikrocontroller und Digitale Elektronik AT Kommando an Handy senden


von Web Z. (web_z)


Lesenswert?

Hallo liebe Kolleginnen und Kollegen :-)

Nun, nachdem jetzt meine Schaltung (ATMEGA8 Grundschaltung mit MAX232) 
funktioniert möchte ich gerne einen Anruf mit Tastendruck annehmen. Mein 
Handy ist ein Siemens C45, kann nur PDU usw..

Über die serielle Verbindung vom PC zum Handy kann ich mit dem Befehl im 
Terminal ATA+CR einen Anruf annehmen. Dieser Befehl soll nun vom µC ans 
Handy gesendet werden. Dazu habe ich mir dieses kleine Programm 
gebastelt. Testweise sehe ich im COM-Terminal das der Befehl + Return 
ankommt. jedes ATA beginnt in einer neuen Zeile.


Nur wenn ich dann das Handy anschliesse tut sich rein garnichts.. außer 
das die LED  wie gewünscht toggelt.

Hat mir jemand einen Tip?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
6
#define F_CPU 3686411UL                   // processor clock frequency
7
8
#include <util/delay.h>
9
#define USART_BAUDRATE 19200UL
10
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
11
12
13
14
15
16
#define debounce( port, pin )            \
17
({                  \
18
  static uint8_t flag = 0;  /* new variable on every macro usage */  \
19
  uint8_t i = 0;              \
20
                  \
21
  if( flag ){      /* check for key release: */    \
22
    for(;;){      /* loop ... */        \
23
      if( !(port & 1<<pin) ){  /* ... until key pressed or ... */  \
24
  i = 0;      /* 0 = bounce */      \
25
  break;                \
26
      }                  \
27
      _delay_us( 98 );    /* * 256 = 25ms */      \
28
      if( --i == 0 ){    /* ... until key >25ms released */  \
29
  flag = 0;    /* clear press flag */      \
30
  i = 0;      /* 0 = key release debounced */    \
31
  break;                \
32
      }                  \
33
    }                  \
34
  }else{      /* else check for key press: */    \
35
    for(;;){      /* loop ... */        \
36
      if( (port & 1<<pin) ){  /* ... until key released or ... */  \
37
  i = 0;      /* 0 = bounce */      \
38
  break;                \
39
      }                  \
40
      _delay_us( 98 );    /* * 256 = 25ms */      \
41
      if( --i == 0 ){    /* ... until key >25ms pressed */  \
42
  flag = 1;    /* set press flag */      \
43
  i = 1;      /* 1 = key press debounced */    \
44
  break;                \
45
      }                  \
46
    }                  \
47
  }                  \
48
  i;        /* return value of Macro */    \
49
})
50
51
 
52
53
//############################################################################
54
//Routine für die Serielle Ausgabe
55
int uart_putchar (char c){
56
  if (c == '\n')
57
    uart_putchar('\r');
58
  //Warten solange bis Zeichen gesendet wurde
59
  while(!(UCSRA & (1<<UDRE)));
60
  //Ausgabe des Zeichens
61
  UDR = c;
62
  return (0);
63
};
64
//############################################################################
65
//Routine für die Serielle Ausgabe
66
int uart_getchar (void){
67
  while(!(UCSRA & (1<<RXC)));
68
  return(UDR);
69
};
70
//############################################################################
71
72
73
74
75
76
void uart_send_char(uint8_t byte) {
77
  while ((UCSRA & (1 << UDRE)) == 0);
78
  UDR = byte;
79
}
80
81
82
void uart_send_string(char * str) {
83
  while (*str) { // keep going until NULL terminator found
84
    uart_send_char(*str++);
85
  }
86
}
87
88
89
void long_delay(uint16_t ms) {
90
    for(; ms>0; ms--) _delay_ms(1);
91
}
92
93
int main (void)
94
{
95
   UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry
96
   UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes
97
98
   UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
99
   UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
100
101
   UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
102
   sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed
103
104
   DDRB  = 0x0F;  // PC0..PC7 as output
105
106
   PORTB = 0x00;  // all PORTC output pins Off
107
108
109
   //DDRA  = 0x00;  //all A port pins as input
110
   DDRD = 0b11100000;
111
112
   PORTD=(1<<PD5)|(1<<PD6)|(1<<PD7);  //Enable internal Pull-Up resistors
113
114
fdevopen (uart_putchar, uart_getchar);
115
116
117
   for (;;) // Loop forever
118
   {
119
  if( debounce( PIND, PD7 ) )
120
        {
121
  PORTB = PORTB ^ (1 << PB0);
122
        
123
  uart_send_string("ATA"); 
124
  long_delay(500);
125
  UDR = 0x0D;
126
  }
127
  
128
//printf("ATA\r\n");
129
//long_delay(1000);       // Eine Sekunde warten...
130
// Do nothing - echoing is handled by the ISR instead of in the main loop
131
  
132
        }
133
134
}
135
136
ISR(USART_RXC_vect)
137
{
138
   char ReceivedByte;
139
   ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
140
//   UDR = ReceivedByte; // Echo back the received byte back to the computer
141
//  UDR='S';  
142
}


Beim compilieren erhalte ich noch diese Hinweise, printf funktioniert 
trotzdem. Im BeispielCode wird es nicht verwendet.

make hex
avr-gcc -I.  -g -mmcu=atmega8 -Os -fpack-struct -fshort-enums 
-funsigned-bitfields -funsigned-char -Wall -Wstrict-prototypes 
-Wa,-ahlms=gsma2.lst -c gsma2.c
gsma2.c: In Funktion »main«:
gsma2.c:106: Warnung: Implizite Deklaration der Funktion »fdevopen«
avr-gcc -Wl,-Map,gsma2.out.map -mmcu=atmega8 -lm  -o gsma2.out gsma2.o
avr-objcopy -j .text                    \
    -j .data                       \
    -O ihex gsma2.out gsma2.hex

: Verschoben durch User
von Remote O. (remote1)


Lesenswert?

Ich hab mir jetzt nicht alles 100% angeschaut, aber das sieht schon mal 
falsch aus:
1
fdevopen (uart_putchar, uart_getchar);
Zumindest wenn ich mir anschaue wie uart_putchar und uart_getchar 
deklariert sind. Das müsste eher so ausschauen:
1
int uart_getchar(FILE *dummy);
2
int uart_putchar(char c, FILE *dummy);
#include <stdio.h> fehlt auch noch!!!
Zudem solltest du alles ein wenig besser strukturieren und die 
Möglichkeit verscheidener *.c files nutzen. Alles was UART ist kann z. 
B. in ein extra *.c/*.h file.
Evtl Hilft die auch der Artikel [[Versenden von SMS mittels 
Mobiltelefon]]

Hast du schon mal probiert ob dein UART funktioniert.
Also:
* µC an PC + Testen
* Mobiltelefon an PC + Testen
* hat das Datenkabel ein Pegelwandler mit drin --> Rx/Tx tauschen (siehe 
Artikel)

von Web Z. (web_z)


Lesenswert?

Danke für die Hinweise... printf funktioniert dank deiner Hinweise noch 
besser! ATA ging zwar raus aber \r\n nicht!

Die Frage nach dem Pegelwandler brachte die Erleuchtung.

Irgendwo, ich glaube im Ulrich Radig Forum fand ich dann doch noch den 
entscheidenden Tip....

PIN4 von SubD muss noch auf +5V

sonst macht der Pegelwander, auch ein Max232, nix... total logisch hehe

wasn abend, 8 bierchen, 3:0 für GER und die Schaltung läuft :-)



habe mit Taster Anruf angenommen, jipieeeeaaaaahhhh!!!

Gruß Stefan

von Web Z. (web_z)


Lesenswert?

Leider habe ich mich etwas zu früh gefreut, ich dachte sofern es in die 
eine Richtung funktioniert, ist die andere auch kein Problem.


Das C45 sendet nur ein 'RING' wenn es an den PC angeschlossen ist. Hängt 
es am µC kommt leider nichts an.

Vermutlich ist der Pegel des seriellen Signals vom Handy ungeeignet. Was 
kann ich dagegen tun?

Ich habe schon etliche Beiträge durchforstet, jedoch keinen Hinweis 
gefunden.

Testweise habe ich den MAX aus dem Datenkabel entfernt und nur den von 
meiner Schaltung verwendet, da funktionierte dann wieder gar nichts.

Ich hoffe es kann mir jemand helfen.

mfG Stefan

von Tilman S. (killerfaultier)


Lesenswert?

Wenn hier schon so ein Thread existiert hätte ich eine kleine Frage: Ist 
(und wenn ja wie) es möglich, ein Sony-Ericsson Handy an einen uC 
anzuschließen? Im Prinzip hat es ja auch einen seriellen-Anschluss sowie 
AT-Befehle.

von sven (Gast)


Lesenswert?

@ Web Z.

> Vermutlich ist der Pegel des seriellen Signals vom Handy ungeeignet. Was
> kann ich dagegen tun?

Wenn dein AVR mit 3,3V läuft, brauchst du gar keinen Pegelwandler wenn 
du direkt an die Kontakte vom C45 gehst.
Aus dem C45 kommen die Daten mit dem Pegel der Akkuspannung (ca. 3,6V) 
raus.

Gruß,
  Sven

von Web Z. (web_z)


Lesenswert?

Testweise habe es ohne Pegelwander, also direkt und einem 3,7V Akku aus 
einem anderen Handy genommen, das hat auch funktioniert. Ich konnte 
einen Anruf mit dem Taster annehmen. Das RING kam leider aber nicht an.

Hätte es so gehen müssen? oder sind genau 3,3V Pflicht?

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.