Datenempfang über RS232 am ATmega16

Gast #547620
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?
Gast #547628
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?
Gast #547648
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.
Gast #547658
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.
#547671
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
Gast #547695
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren