mikrocontroller.net

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


Autor: Lenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Franz-Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieviel Datenbits versendet dein GPS-Modul den?
Mehr als 8?

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marvin (Gast)
Datum:

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

Ja. Fehler in der Software.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Lenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?


Autor: Lenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int_uart:
    push r16
    in r16, UDR
    cli

int_uartSend:
    sbis UCSRA, UDRE
    rjmp int_uartSend
    out UDR, r16
    rjmp int_uart2

int_uart2:
    cpi r16, '%'
    breq int_uart1
    cpi r16, '$'
    breq int_dollar
    cpi r21, '1'
    brne int_parameter
    rjmp saveEEPROM
    
    ;Zurücksetzen der EEPROM Adressen bei Empfang eines $-Zeichens
int_dollar:
    ldi r17, 0x00
    ldi r21, '0'
    ldi r22, 0x00
    rjmp int_parameter

    ;Speichern der Werte im EEPROM
saveEEPROM:
    sbic EECR,EEWE
    rjmp saveEEPROM
    out EEARL, r17
    out EEARH, r18
    out EEDR, r16
    sbi EECR, EEMWE
    sbi EECR, EEWE
    inc r17
    rjmp int_parameter

int_parameter:
    cpi r22, 0x08
    breq int_r21set
    inc r22
    rjmp int_uartEnd

int_uartEnd:    
    pop r16
    sei
    reti

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Lenny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte euch nochmal danken!

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

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.