mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT Kommando an Handy senden


Autor: Web Z. (web_z)
Datum:

Bewertung
0 lesenswert
nicht 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?


#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>


#define F_CPU 3686411UL                   // processor clock frequency

#include <util/delay.h>
#define USART_BAUDRATE 19200UL
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)





#define debounce( port, pin )            \
({                  \
  static uint8_t flag = 0;  /* new variable on every macro usage */  \
  uint8_t i = 0;              \
                  \
  if( flag ){      /* check for key release: */    \
    for(;;){      /* loop ... */        \
      if( !(port & 1<<pin) ){  /* ... until key pressed or ... */  \
  i = 0;      /* 0 = bounce */      \
  break;                \
      }                  \
      _delay_us( 98 );    /* * 256 = 25ms */      \
      if( --i == 0 ){    /* ... until key >25ms released */  \
  flag = 0;    /* clear press flag */      \
  i = 0;      /* 0 = key release debounced */    \
  break;                \
      }                  \
    }                  \
  }else{      /* else check for key press: */    \
    for(;;){      /* loop ... */        \
      if( (port & 1<<pin) ){  /* ... until key released or ... */  \
  i = 0;      /* 0 = bounce */      \
  break;                \
      }                  \
      _delay_us( 98 );    /* * 256 = 25ms */      \
      if( --i == 0 ){    /* ... until key >25ms pressed */  \
  flag = 1;    /* set press flag */      \
  i = 1;      /* 1 = key press debounced */    \
  break;                \
      }                  \
    }                  \
  }                  \
  i;        /* return value of Macro */    \
})

 

//############################################################################
//Routine für die Serielle Ausgabe
int uart_putchar (char c){
  if (c == '\n')
    uart_putchar('\r');
  //Warten solange bis Zeichen gesendet wurde
  while(!(UCSRA & (1<<UDRE)));
  //Ausgabe des Zeichens
  UDR = c;
  return (0);
};
//############################################################################
//Routine für die Serielle Ausgabe
int uart_getchar (void){
  while(!(UCSRA & (1<<RXC)));
  return(UDR);
};
//############################################################################





void uart_send_char(uint8_t byte) {
  while ((UCSRA & (1 << UDRE)) == 0);
  UDR = byte;
}


void uart_send_string(char * str) {
  while (*str) { // keep going until NULL terminator found
    uart_send_char(*str++);
  }
}


void long_delay(uint16_t ms) {
    for(; ms>0; ms--) _delay_ms(1);
}

int main (void)
{
   UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry
   UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes

   UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
   UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register

   UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
   sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed

   DDRB  = 0x0F;  // PC0..PC7 as output

   PORTB = 0x00;  // all PORTC output pins Off


   //DDRA  = 0x00;  //all A port pins as input
   DDRD = 0b11100000;

   PORTD=(1<<PD5)|(1<<PD6)|(1<<PD7);  //Enable internal Pull-Up resistors

fdevopen (uart_putchar, uart_getchar);


   for (;;) // Loop forever
   {
  if( debounce( PIND, PD7 ) )
        {
  PORTB = PORTB ^ (1 << PB0);
        
  uart_send_string("ATA"); 
  long_delay(500);
  UDR = 0x0D;
  }
  
//printf("ATA\r\n");
//long_delay(1000);       // Eine Sekunde warten...
// Do nothing - echoing is handled by the ISR instead of in the main loop
  
        }

}

ISR(USART_RXC_vect)
{
   char ReceivedByte;
   ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
//   UDR = ReceivedByte; // Echo back the received byte back to the computer
//  UDR='S';  
}



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
Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mir jetzt nicht alles 100% angeschaut, aber das sieht schon mal 
falsch aus:
fdevopen (uart_putchar, uart_getchar);
Zumindest wenn ich mir anschaue wie uart_putchar und uart_getchar 
deklariert sind. Das müsste eher so ausschauen:
int uart_getchar(FILE *dummy);
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)

Autor: Web Z. (web_z)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Web Z. (web_z)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tilman Stremlau (killerfaultier)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Web Z. (web_z)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.