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 | }
|