mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART - Atmega48 - Timingproblem? Datenmüll


Autor: Claudio H. (hedie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Ich versuche nun seit mehreren Stunden, ein GSM Modem mittels RS232 
anzusprechen.

Per PC-Terminalprogramm (direkt ohne über den AVR) gehts problemlos.

Das Modul hat 3V Pegel am RS232 also habe ich mir einen Pegelwandler 
Entworfen...

Dieser ist im Anhang


Der Pegelwandler arbeitet meiner meinung nach, einwandfrein.
Ich habe mit dem Oszilloskop gemessen! Die Pegel haben schöne 3V auf der 
Modemseite und schöne 5V Pegel auf der AVR Seite...

Mein aktueller Aufbau:
AVR mit 4.915MHz Quarz, 27p Kondensatoren
Baudrate: 9600
RX und TX des AVRS gehen direkt zu meinem Pegelwandler.
Am empfangenden Pin des AVR's also RX habe ich noch RX des STK500
angehängt. Damit ich sehen kann, was das Modem dem AVR Sendet.


Das Problem:
Wenn ich nun vom AVR den Befehl AT sende, so antwortet das Modem Korrekt 
mit AT\r\nOK\r\n

Dies ist auch reproduzierbar.

Wenn ich nun jedoch wie im Code ersichtlich
zb den Befehl AT+CPIN=7777 sende, so antwortet das modem nur mit Müll
also das Echo des modems beinhaltet irgendwelche Zeichen, gefollgt von 
ERROR

Hat jemand eine idee woran das liegen könnte?

Danke schonmal


##################QUELLCODE#####################

#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <util/delay.h>
#include <avr/interrupt.h> 
#include <avr/iom48.h>

#define F_CPU       4915000
#define BAUD         9600UL      // Baudrate
#define UBRR_VAL     ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL   (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR   ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#define uart_maxstrlen 20

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif
 
volatile uint8_t uart_str_complete=0;
volatile uint8_t uart_str_count=0;
char uart_string[uart_maxstrlen+1]="";

void uart_putc( char c )
{
  while (!(UCSR0A & (1<<UDRE0)));
  UDR0 = c;
}

void uart_puts( const char* string )
{
  while( *string )
  uart_putc( *string++ );
}

void uart_init(unsigned int baudrate)
{
  UBRR0H = ((unsigned char)(baudrate>>8))&0x80;
  UBRR0L = (unsigned char) baudrate;
  UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
  UCSR0C = (3<<UCSZ00);
}

ISR(USART_RX_vect)
{
    unsigned char buffer;
    
    // Daten aus dem Puffer lesen
    buffer = UDR0;
  if ( uart_str_complete==0 ){  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
    if (buffer!='\r' && buffer!='\n' && uart_str_count<uart_maxstrlen-1){
      uart_string[uart_str_count]=buffer;
      uart_str_count++;
    } 
    else {
      uart_string[uart_str_count]='\0';
      uart_str_count=0;
      uart_str_complete=1;
    }
  }
}


void main(void)
{

  DDRC = 0x1C;                    //Taster Matrix
  DDRB = 0x01;                    //LED
  DDRD = 0x00;                  
  uart_init(F_CPU/BAUD/16-1);    //UART initialisiseren
  
  sei();    //Interrupts Aktivieren
  
  
  while(1)
  {
          uart_puts("AT+CPIN=7777");
          uart_putc('\r');
    uart_putc('\n');
  }


}


Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
darf ich mal pushen? :)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine, das wäre ein "alter Hut". Wenn ich mich recht erinnere, dann 
wird das Modem "überfahren". Entweder du wartest nach jedem Zeichen 
etwas, oder du wartest jeweils das Echo ab bevor du das nächste Zeichen 
sendest, oder (wohl am besten) du schaltest gleich als erstes das Echo 
aus.

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Wenn ich mich recht erinnere, dann
> wird das Modem "überfahren". Entweder du wartest nach jedem Zeichen
> etwas, oder du wartest jeweils das Echo ab

Hmmm

Also Ich habe auch versucht nur auf tastendruck den befehl zu senden...
Zeigt keine wirkung... Genau das selbe Problem

Stefan Ernst schrieb:
> oder (wohl am besten) du schaltest gleich als erstes das Echo
> aus.

Das habe ich bereits getan... Leider das Selbe Problem...
Merkwürdigerweise gehts mit AT.... zwei zeichen gehen gerade noch.

Ich habe am modem eingang "gelauscht" (STK RX Angehängt) am 
Terminalprogramm werden die Richtigen befehle angezeigt... Also liegt es 
an den Pegeln?

Hier eine rückmeldung des Modem ECHO

AT?A%97777<\r><\r><\n>ERROR<\r><\n>
Die sollte AT+CPIN=7777 lauten.

irgendwo ist da der wurm drinn :(

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geiiillll

Problem gelöööst :)


Vielen Dank stefan :)


Du hattest recht... Ich warte nun nach jedem zeichen 10ms
und es klappt absolut perfekt :)

Man lernt eben nie aus :)

Danke danke danke :)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio Hediger schrieb:
> Also Ich habe auch versucht nur auf tastendruck den befehl zu senden...

Ne, es ging irgendwie darum, nicht zu viele Zeichen "am Stück" zu 
senden. Platziere doch mal probehalber ein schön großes Delay in 
uart_putc.

PS: Die ganz grundsätzlichen Dinge, wie z.B. die Anzahl der Stopp-Bits, 
hast du doch hoffentlich überprüft, oder?

Edit: Ups, zu langsam, hat sich wohl erledigt. ;-)

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Claudio Hediger schrieb:
>> Also Ich habe auch versucht nur auf tastendruck den befehl zu senden...
>
> Ne, es ging irgendwie darum, nicht zu viele Zeichen "am Stück" zu
> senden. Platziere doch mal probehalber ein schön großes Delay in
> uart_putc.
>
> PS: Die ganz grundsätzlichen Dinge, wie z.B. die Anzahl der Stopp-Bits,
> hast du doch hoffentlich überprüft, oder?

Man beachte meinen obigen Post :)

Perfekt :)

Bekomme nun jedoch einen

CMS ERROR 513 zurück...
Da ich jedoch weiss das es bereits geklappt hat mit dem Modem
weiss ich, das es nun nicht mehr an der kommunikation sondern am modem 
liegt :)

1000 Dank nochmal :)

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.