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


von C. H. (hedie)


Angehängte Dateien:

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#####################
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include <math.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h> 
7
#include <avr/iom48.h>
8
9
#define F_CPU       4915000
10
#define BAUD         9600UL      // Baudrate
11
#define UBRR_VAL     ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
12
#define BAUD_REAL   (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
13
#define BAUD_ERROR   ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
14
#define uart_maxstrlen 20
15
16
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
17
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
18
#endif
19
 
20
volatile uint8_t uart_str_complete=0;
21
volatile uint8_t uart_str_count=0;
22
char uart_string[uart_maxstrlen+1]="";
23
24
void uart_putc( char c )
25
{
26
  while (!(UCSR0A & (1<<UDRE0)));
27
  UDR0 = c;
28
}
29
30
void uart_puts( const char* string )
31
{
32
  while( *string )
33
  uart_putc( *string++ );
34
}
35
36
void uart_init(unsigned int baudrate)
37
{
38
  UBRR0H = ((unsigned char)(baudrate>>8))&0x80;
39
  UBRR0L = (unsigned char) baudrate;
40
  UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
41
  UCSR0C = (3<<UCSZ00);
42
}
43
44
ISR(USART_RX_vect)
45
{
46
    unsigned char buffer;
47
    
48
    // Daten aus dem Puffer lesen
49
    buffer = UDR0;
50
  if ( uart_str_complete==0 ){  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
51
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
52
    if (buffer!='\r' && buffer!='\n' && uart_str_count<uart_maxstrlen-1){
53
      uart_string[uart_str_count]=buffer;
54
      uart_str_count++;
55
    } 
56
    else {
57
      uart_string[uart_str_count]='\0';
58
      uart_str_count=0;
59
      uart_str_complete=1;
60
    }
61
  }
62
}
63
64
65
void main(void)
66
{
67
68
  DDRC = 0x1C;                    //Taster Matrix
69
  DDRB = 0x01;                    //LED
70
  DDRD = 0x00;                  
71
  uart_init(F_CPU/BAUD/16-1);    //UART initialisiseren
72
  
73
  sei();    //Interrupts Aktivieren
74
  
75
  
76
  while(1)
77
  {
78
          uart_puts("AT+CPIN=7777");
79
          uart_putc('\r');
80
    uart_putc('\n');
81
  }
82
83
84
}

von C. H. (hedie)


Lesenswert?

darf ich mal pushen? :)

von Stefan E. (sternst)


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.

von C. H. (hedie)


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 :(

von C. H. (hedie)


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 :)

von Stefan E. (sternst)


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. ;-)

von C. H. (hedie)


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 :)

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.