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?
Mittlerweile häufen sich die Fragen über RS232-Kommunikation an AVRs. Standardfrage: Womit taktest du den Prozessor?
(... 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?
"Wisst ihr warum die Daten nicht korrekt im EEPROM ankommen?" Ja. Fehler in der Software.
> 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.
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
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.
> 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?
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.
@ 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
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.
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.