Forum: Mikrocontroller und Digitale Elektronik Datenlogger - Problem beim schreiben ins Eeprom


von Michael L. (nightflyer88)



Lesenswert?

Hallo Zusammen

Bin seit einiger Zeit an der Entwicklung eines Datenloggers für den 
Modellflug. Das ganze System basiert auf dem I2C-Bus. Also alle Sensoren 
und Eeprom hängen am I2C-Bus.

Der Logger liest die Messwerte von den Sensoren und legt diese 
anschliessend im Eeprom ab. Die Messwerte kann ich dann mit einer 
Software auslesen und werden in einem Diagram dargestellt.

Nun zum Problem:

Wie man im Diagram vom Logger sehen kann, gibt es drei Stellen, bei 
denen die Kurve massiv ausschlägt.

Messfehler vom Sensor kann ich ausschliessen, da die Peaks nicht in den 
MAX und MIN Werten Links in der Liste enthalten sind. Die MAX/MIN-Werte 
werden vom Logger separat im Eeprom abgelegt.

Übertragungsfehler per RS232 oder fehlerhaftes lesen des Eeproms würde 
ich ebenfalls zu 99% ausschliessen, da der Fehler auch nach mehrmaligem 
auslesen gleich bleibt.

So bleibt eigentlich nur noch das schreiben ins Eeprom als Fehlerquelle.

Programmieren tue ich mit Bascom. An folgender Stelle im Programm werden 
die Messwerte ins Eeprom geschrieben:

    Incr Eeprom_speicher_adres
    L_adr = Eeprom_speicher_adres            'Messwerte Speichern
    B = Eeprom_speicher_adres
    Shift B , Right , 8
    H_adr = B
    I2cstart
    I2cwbyte &HA0
    I2cwbyte H_adr                            'Speicher Adresse
    I2cwbyte L_adr
    Decr Eeprom_speicher_adres
    For G = 1 To Anzahl_messwerte
      L_adr = Messwert(g)
      B = Messwert(g)
      Shift B , Right , 8
      H_adr = B
      I2cwbyte H_adr
      I2cwbyte L_adr
      Eeprom_speicher_adres = Eeprom_speicher_adres + 2
    Next
    I2cstop
    Waitms 10


Als Eeprom verwende ich ein 24C1024.


Ich hoffe, dass mir da jemand weiter helfen kann.

von Karl H. (kbuchegg)


Lesenswert?

Vereinfache doch mal das Ganze.
Mit deinen ganzen INCR, DECR und Addition von 2 und sinnlosem Hin und 
Her kopieren von Werten zwischen den Variablen wird man doch ganz 
konfus.

von Michael L. (nightflyer88)


Lesenswert?

Ja da hast du recht. Ist nicht ganz so übersichtlich.

Also eine andere Stelle im Programm, die Übersichtlicher ist:

Beim initialisieren des Loggers werden alle Messwert-Namen von den 
Slaves gelesen und im Eeprom gespeichert.

An folgender Stelle im Programm wird der Name des internen 
Temperatursensors gespeichert, und da sind auch schon die gleichen 
Fehler entstanden, das die Daten nicht sauber gespeichert werden.



If Parameter(2) = 1 Then         'Name interne Temperatur speichern
  Incr Eeprom_speicher_adres
  L_adr = Eeprom_speicher_adres
  B = Eeprom_speicher_adres
  Shift B , Right , 8
  H_adr = B
  I2cstart
  I2cwbyte &HA0
  I2cwbyte H_adr                                'Speicher Adresse
  I2cwbyte L_adr
  I2cwbyte 84                                               'T
  I2cwbyte 101                                              'e
  I2cwbyte 109                                              'm
  I2cwbyte 112                                              'p
  I2cwbyte 32                                               'leer
  I2cwbyte 105                                              'i
  I2cwbyte 110                                              'n
  I2cwbyte 116                                              't
  I2cwbyte 114                                              'r
  I2cwbyte 110                                              'n
  I2cwbyte 67                                               'C
  I2cwbyte 32                                               'leer
  I2cwbyte 32                                               'leer
  I2cwbyte 3                                                'Faktor
  I2cstop
  Eeprom_speicher_adres = Eeprom_speicher_adres + 13
  Waitms 10
End If


Ist genau das gleiche Prinzip wie beim 1.Beispiel, auch mit Page Write.
Ich vermute das beim Page Write etwas falsch ist.

von Löti (Gast)


Lesenswert?

Ein paar mehr Kondensatoren (100nF) solltest du schon spendieren.

von Michael L. (nightflyer88)


Lesenswert?

wo genau meinst Du ? Am 24c1024 ?

von Löti (Gast)


Lesenswert?

Eigentlich an jedes IC, Vcc-GND.

von Troll (Gast)


Lesenswert?

Der Reset solte ein C haben, der ADC sol.te anders beschalten sein, 
siehe Datenblatt. Aref sollte nur ein C haben, Aref ein RC. Alles andere 
ist grober Murks

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Also wie ich gesehen habe, ist das Problem wohl Hardwareseitig und nicht 
bei der Software wie ich anfangs gedacht habe.

Ich habe mal am 24c1024 einen 100nf montiert, es ist jetzt schon einiges 
besser, aber trotzdem noch nicht optimal.

Ich probiere mal die anderen Vorschläge noch aus.

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt an jedem IC ein 100nF Kondensator montiert, aber die 
Übertragungsfehler auf dem I2C Bus bestehen weiterhin. Anfangs habe ich 
gedacht es wäre etwas besser geworden, aber das stimmt nicht.

Kann das Problem wirklich vom ADC kommen ? Die Beschaltung des ADC wie 
im Datenblatt beschrieben mit R und C nach GND ist doch einfach ein 
Tiefpassfilter nur für Schwingungen am ADC selber? Oder täusche ich mich 
?
Ist die Beschaltung am Aref richtig ?

Den I2C Port am ATmega328 mache ich Softwaremässig mit BASCOM, ist evtl. 
das das Problem ?

von STK500-Besitzer (Gast)


Lesenswert?

Michael L. schrieb:
> Ist die Beschaltung am Aref richtig ?

Nein.
ARef bekommt nur einen 100nF gegen GND.
Zumindest habe ich so die Beschaltung aus dem Datenblatt im Kopf (Wink 
mitm Zaunpfahl ;)

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Meinst du so ?

Aber dan fehlt doch die Referenzspannung ?

von STK500-Besitzer (Gast)


Lesenswert?

Michael L. schrieb:
> Meinst du so ?
>
> Aber dan fehlt doch die Referenzspannung ?

Guck dir mal Figure 23-1 im Datenblatt an.
AVCC liefert die Referenz-Spannung des ADC.

Ausm Datenblatt:

Internal reference voltages of nominally 1.1V or AVCC are provided 
On-chip. The voltage reference may be externally decoupled at the AREF 
pin by a capacitor for better noise performance.

Wenn du sowieso AVCC bzw. die Versorgunggspannung als Referenzspannung 
verwenden willst, benutzt du besser den controller-internen Schalter.

von Michael L. (nightflyer88)


Lesenswert?

So ich habe jetzt alles wie im Schema mit Aref und Kondensatoren 
angeschlossen, aber immer noch die gleichen Probleme !!

Ich habe jetzt sogar noch den BMP085 ausgelötet, da dieser irgend wie 
spinnt (Druck kann nicht gelesen werden), evtl. habe ich mal ausversehen 
mit 5V geflasht, statt mit 3.3V, aber auch ohne BMP085 bringt es nichts.

Was ist mit dem WP pin am 24c1024 ? ist das so in Ordnung ?

von tt4u (Gast)


Lesenswert?

WP darf nicht offen sein, mit GND verbunden kann man lesen und 
schreiben, mit VDD verbunden nur lesen.

von Michael L. (nightflyer88)


Lesenswert?

Der WP Pin habe ich jetzt mit GND verbunden, aber auch das löst das 
Problem nicht.


  I2cstart
  I2cwbyte &HA0
  I2cwbyte H_adr                                'Speicher Adresse
  I2cwbyte L_adr
  I2cwbyte 84                                               'T
  I2cwbyte 101                                              'e
  I2cwbyte 109                                              'm
  I2cwbyte 112                                              'p
  I2cwbyte 32                                               'leer
  I2cwbyte 105                                              'i
  I2cwbyte 110                                              'n
  I2cwbyte 116                                              't
  I2cwbyte 114                                              'r
  I2cwbyte 110                                              'n
  I2cwbyte 67                                               'C
  I2cwbyte 32                                               'leer
  I2cwbyte 32                                               'leer
  I2cwbyte 3                                                'Faktor
  I2cstop


Ist das Page Write so richtig ? Adressierung ? Das Problem ist immer 
beim schreiben ins eeprom, manchmal werden nicht alle Bytes richtig 
übertragen, oder abgelegt.

Oder hat sonst noch jemand eine Idee wo das Problem liegt ?

von Michael L. (nightflyer88)


Lesenswert?

habe noch was anderes gefunden: Am Spannungsregler MCP1703 habe ich 
ELKOs montiert, laut Datenblatt soll man Keramikkondensatoren verwenden. 
Kann es sein das ich mit den ELKOs Störungen oder ein Rauschen in der 
Betriebsspannung habe ?

von tt2t (Gast)


Lesenswert?

Keramik-C haben einen niedrigeren ESR als Elkos

von tt2t (Gast)


Lesenswert?

Noch was wichtiges: Du darfst beim fortlaufenden Page-Write keine 
Seitengrenze überschreiten, sonst schreibt er die Daten beim Überlauf 
nicht auf die nächste Seite, sondern auf die gerade benutzte.

von visitor (Gast)


Lesenswert?

Da Du dir anscheinend nicht sicher bist, ob es an der HW liegt probiere 
doch mal folgendes:

Speicher einfach nur die gefilterten Roh-Werte des Sensors, ohne sich 
iregendwie umzurechnen, ins Eeprom. Sind dort dann auch Sprünge zu sehen 
liegt es möglicherweise an der HW. Sind dort keine Sprünge sichtbar, 
dann sind es deine Umrechnungsroutinen, welche die Sprünge verursachen.

von Michael L. (nightflyer88)


Lesenswert?

Vielen Dank für eure tips.

Folgendes habe ich auch schon versucht: Statt den Wert vom Sensor zu 
lesen, habe ich immer den Wert "100" ins eeprom geschrieben, und der 
Fehler trat trotzdem auf. Demzufolge kann der Fehler nicht von den 
Sensoren kommen.

Das mit der Seitengrenze überschreiten wusste ich nicht, ist natürlich 
sehr gut möglich, dass das die Ursache ist. Manchmal siehts nämlich aus, 
als ob die Daten durcheinander wären, vor allem bei längeren 
Aufzeichnungen.

Ich versuche das ganze mal ohne Page Write und schreibe jedes einzelne 
Byte separat.

von Michael L. (nightflyer88)


Lesenswert?

Jetzt scheint es zu funktionieren !!

Habe mal ohne Page Write probiert, und es funktionierte auf anhieb.

Nun habe ich das Page Write angepasst damit die Seitengrenze nicht 
überschritten wird, und es funktioniert immer noch ;-)

Vielen Dank für eure Hilfe.

von Michael L. (nightflyer88)


Lesenswert?

Noch was anderes: muss auf dem I2C Bus zwischen einem Stop-Start Befehl 
immer 10ms gewartet werden, oder kann ich ohne Verzögerung gleich den 
nächsten Slave ansprechen ?

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.