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.
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.
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.
Ein paar mehr Kondensatoren (100nF) solltest du schon spendieren.
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
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.
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 ?
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 ;)
Meinst du so ? Aber dan fehlt doch die Referenzspannung ?
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.
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 ?
WP darf nicht offen sein, mit GND verbunden kann man lesen und schreiben, mit VDD verbunden nur lesen.
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 ?
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 ?
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.