Forum: Mikrocontroller und Digitale Elektronik Datenempfang über RS232 am ATmega16


von Lenny (Gast)


Lesenswert?

Hallo,

ich möchte vom Telit GM862-GPS Modul nach dem Senden eines AT-Befehls 
die Zeichen im EEPROM speichern, die vom Modul ausgegeben werden.

Ich habe den Datenempfang über UART in einem Interrupt gemacht.
Leider kommen nicht alle Zeichen die das Modul ausgibt im EEPROM an.

Wenn ich Daten von Hand in das Modul eingebe werden diese korrekt 
gespeichert.

Die Verbindung zwischen dem Modul (welches auf einem Adapterboard ist) 
und der Mikrocontrollerplatine wird seriell über RS232 gemacht. Habe 
bereits diverse Kombinationen von Baudrate ausprobiert.

Wisst ihr warum die Daten nicht korrekt im EEPROM ankommen?

von Rolf Magnus (Gast)


Lesenswert?

Mittlerweile häufen sich die Fragen über RS232-Kommunikation an AVRs.
Standardfrage: Womit taktest du den Prozessor?

von Franz-Rainer (Gast)


Lesenswert?

Wieviel Datenbits versendet dein GPS-Modul den?
Mehr als 8?

von Joerg X. (Gast)


Lesenswert?

(... hier die klassische Frage-Post-Predigt einfügen (Code, Compiler, 
takt, Baudrate.....))

jetzt möchte ich mal mal mit meiner Glaskugel spielen:
Du schreibst die Zeichen direkt vom UDR in das interne EEPROM?
Du weißt wie 'schnell' das EEPROM-schreiben ist?

von Marvin (Gast)


Lesenswert?

"Wisst ihr warum die Daten nicht korrekt im EEPROM ankommen?"

Ja. Fehler in der Software.

von Karl H. (kbuchegg)


Lesenswert?

> Ich habe den Datenempfang über UART in einem Interrupt gemacht.
> Leider kommen nicht alle Zeichen die das Modul ausgibt im EEPROM an.
>
> Wenn ich Daten von Hand in das Modul eingebe werden diese korrekt
> gespeichert.

Das stinkt nach einem Handshake Problem.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Darf das Schreiben ins EEPROM durch den UART-Interrupt unterbrochen 
werden?

D.h. würgen vielleicht in deinem Programm über UART ankommende Daten ein 
noch laufendes EEPROM-Write ab?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

von Lenny (Gast)


Lesenswert?

Das Modul sendet im Format 8N1.

Der µC ist getaktet auf 8 MHz. Ich weiß das ein Bauratenquartz besser 
wäre. Die Kommunikation des µC mit dem PC klappt einwandfrei.

Kann es denn sein das der EEPROM die Daten nicht schnell genug 
abspeichert?

Die Interrupts habe ich nach dem Empfang eines Zeichens deaktiviert. Sie 
werden erst nach dem abspeichern wieder aktiviert.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Die Interrupts habe ich nach dem Empfang eines Zeichens deaktiviert. Sie
> werden erst nach dem abspeichern wieder aktiviert.

Und das GPS-Modul - sendet das inzwischen munter weiter oder besteht 
zwischen µC und GPS-Modul eine Handshake?


von Lenny (Gast)


Lesenswert?

Ja das sendet weiter aber ansonsten unterbricht sich der Interrupt ja 
ständig selber.

Das Modul stellt sich automatisch auf die Baudrate ein. Brauch ich da 
einen Handshake? Der gesendete AT-Befehl kommt ja auch am Modul an, da 
es ja die Daten ausgibt.

Hier mal der Code vom Interrupt zum Empfang:
1
int_uart:
2
    push r16
3
    in r16, UDR
4
    cli
5
6
int_uartSend:
7
    sbis UCSRA, UDRE
8
    rjmp int_uartSend
9
    out UDR, r16
10
    rjmp int_uart2
11
12
int_uart2:
13
    cpi r16, '%'
14
    breq int_uart1
15
    cpi r16, '$'
16
    breq int_dollar
17
    cpi r21, '1'
18
    brne int_parameter
19
    rjmp saveEEPROM
20
    
21
    ;Zurücksetzen der EEPROM Adressen bei Empfang eines $-Zeichens
22
int_dollar:
23
    ldi r17, 0x00
24
    ldi r21, '0'
25
    ldi r22, 0x00
26
    rjmp int_parameter
27
28
    ;Speichern der Werte im EEPROM
29
saveEEPROM:
30
    sbic EECR,EEWE
31
    rjmp saveEEPROM
32
    out EEARL, r17
33
    out EEARH, r18
34
    out EEDR, r16
35
    sbi EECR, EEMWE
36
    sbi EECR, EEWE
37
    inc r17
38
    rjmp int_parameter
39
40
int_parameter:
41
    cpi r22, 0x08
42
    breq int_r21set
43
    inc r22
44
    rjmp int_uartEnd
45
46
int_uartEnd:    
47
    pop r16
48
    sei
49
    reti

Die Unterscheidung des eingegeben Zeichens ist notwendig damit der 
Controller weiß wann er speichern muss.

von Falk B. (falk)


Lesenswert?

@ Lenny

>Das Modul sendet im Format 8N1.

Welche Baudrate?

>Der µC ist getaktet auf 8 MHz. Ich weiß das ein Bauratenquartz besser
>wäre. Die Kommunikation des µC mit dem PC klappt einwandfrei.

Das passt schon.

>Kann es denn sein das der EEPROM die Daten nicht schnell genug
>abspeichert?

Das kann sehr wohl sein. Schau mal ins Dateblatt wie lange das dauert. 
Beim 2313 z.B. dauert es 3.4ms fü Erase+Write. D.H. Die Baudrate darf 
hier nicht grösser als ~3000 Baud sein.

MFG
Falk

von Lenny (Gast)


Lesenswert?

Hatte es schon auf verschiendenen Baudraten laufen. Sogar runter bis 
2400 Baud.

Laut Datenblatt braucht des schreiben in den EEPROM sogar 8,5 ms
Das scheint ja eindeutig zu lange zu sein.

Habe ich die Möglichkeit die Daten in einem schnelleren Speichern 
abzulegen? Sie müssen nur kurz zwischengespeichert und dann zum 
versenden via GPRS wieder ausgelesen werden.

von Falk B. (falk)


Lesenswert?

@ Lenny

>Habe ich die Möglichkeit die Daten in einem schnelleren Speichern
>abzulegen? Sie müssen nur kurz zwischengespeichert und dann zum
>versenden via GPRS wieder ausgelesen werden.

SRAM.

MFG
Falk


von Lenny (Gast)


Lesenswert?

Wollte euch nochmal danken!

Es lag eindeutig am EEPROM. Das Einlesen in den SRAM geht einwandfrei

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.