Hi leute, ich bins schon wieder mit meiner BMA020 Klasse ich hab mich jetzt dazu entschieden die Interruptfunktionen weg zu lassen. Denn wenn man sie Wirklich braucht ist es besser sie sich selbst zu schreiben hab ich bemerckt. Denn da sind einfach zuviele Variabeln abzuwiegen als das "ich" das mit in die Klasse packen könnte. Und da das meine erste "richtige" Klasse ist. Wollte ich mal fragen ob ich irgent was einfacher machen könnte oder Rechenzeit einsparen könnte? Vielen dank schon mal im vorraus ;) Gruss Robin
Ok hab noch ein paar sachen geändert, wie zum Beispiel unötiges auslesen von Registern, und noch ein bisschen kommentiert. Fällt sonst wehm noch was auf? Und könnte jemand die Klasse vllt mal auf einem anderen AVR als nem m328p ausprobieren? Hab leider keinen anderen da. Wenn sonst alles in Ordnung ist werde ichs die Tage zur Codesammlung packen. Gruss Robin
Was stört dich daran? Die funktion vordert nen array und das muss bevor man was einträgt inizialisiert werden.
Ich würde es nicht als Klasse implementieren. Klassen bringen einen gewissen Overhead mit sich (sagt man, hab' ich nicht überprüft), den man bei Mikrocontrollern wegen dem bisschen Speicher vermeiden möchte.
Ja der Overhead kann vorkommen hab ich jetzt bei der Klasse aber nicht bemerckt. Und wenn doch was ist fügt man (bei eclipse) "${COMMAND} --cref -s -Os ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} -lm ${FLAGS}" mit ans avr-gcc im c++ linker menu das sollte auch die größe reduzieren. Aber man sollte erst ohne probieren. Das Beispiel hat zum Beispiel als hex datei 11,6KB. Ich find das geht oder?
> Und da das meine erste "richtige" Klasse ist. Wollte ich mal fragen ob > ich irgent was einfacher machen könnte oder Rechenzeit einsparen könnte? Nun, wenn es Deine erste "Klasse" ist, ist das ganz O.k. In einigen Jahren wirst Du das aus einem anderen Blickwinkel betrachten. Aber: Weiter so! Für die Zukunft drei "Nachdenk-Möglichkeiten": a.) Was ist der Sinn einer Klasse? Was ist der Sinn von Objekten (Instanzen einer Klasse)? Was ist, wenn man, warum auch immer, zwei BMA020 in einer Schaltung hat? b.) Für wen programmierst Du? Für den Compiler oder für jemanden der Dein Programm in einigen Wochen, Monaten oder Jahren liest? Macht es dem Compiler etwas aus, wenn ein Programm so geschrieben ist, dass es für einen menschlichen Leser möglichst einfach zu verstehen ist? c.) Was ist effizienter: 5 Euro mehr ausgeben für einen schnelleren/dicken Prozessor oder stundenlang einzelne Bits hin und herschieben um es in einen kleinen Mikrocontroller zu quetschen? Baust Du ein Massenprodukt wo es auf jeden Cent ankommt?
Erst mal danke, und da es zum lernen war/ist dachte ich mir lass ich es schon noch übersichtlich das ich es auch in 2,3 Jahren noch versteh. Ob es hier jetzt sinnvoll war als Klasse zu machen lässt sich auch bestimmt drüber streiten denk ich mal, aber zum lernen und im handling find ichs ganz gut ;) Achja so weit ich weis kann man nur einen BMA020 in der schaltung haben der hat nämlich ne feste adresse.
hier der nächste speicher überchreiber:
1 | uint8_t buffer[1]; |
2 | |
3 | buffer[0] = reg; |
4 | buffer[1] = value; |
Wie viele werte passen wohl in ein array mit der länge 1?
Hab noch nen fehler entdeckt "shadow_disable" muss bit 3 und nicht 2 gesetzt werden. Und hab noch nen bisschen drann rumgebastelt, z.B. die tmp Variabeln existieren werden nicht mehr benötigt und schon wieder 500byte weniger. Ferner hab ich noch die i2c_communicate in ne eigene Datei gepackt um die Funktion im selben Projeckt in verschieden libs haben kann ohne sie doppelt und dreifach einzubinden. @Stefan: Hab mal geguckt wie groß der unterschied zwischen Klasse und nicht Klasse ist er beträgt einen knappen KB. Wenn euch oder mir bis Morgen nix aufällt pack ichs zur Codesammlung wurde jetzt schon so oft gedownloaded und das obwohl noch Fehler drinn waren xD
@Peter II: Jo danke is mir nicht aufgefallen Compiler hat nix gesagt und ich bins von PHP und JavaScript gewohnt^^ Änder ich nacher noch
Hier die gleiche unsinn - wie schon oben von jemand geschrieben.
1 | uint8_t buffer[0]; |
2 | buffer[0] = reg; |
3 | i2c_communicate(BMA020_SLAVE, buffer, 1, buffer, 1); |
das sollte ohne variable auch gehen
1 | i2c_communicate(BMA020_SLAVE, ®, 1, ®, 1); |
und was soll das ganze rumgecaste?
1 | TWDR=*((uint8_t*)send_data); |
2 | *((uint8_t*)rcv_data)=TWDR; |
Du musst auf jeden Fall noch einmal alles ARRAY prüfen, das sind noch andere zu klein!
@Peter II: Vielen dank für die Tipps vor allem der hinweis mit den Arrays auf einmal spar ich 1KB ein (@Stefan: kein unterschied mehr ohne Klasse). Das ® funktioniert auch was mich freut. Und die typecast hab ich auch weg gemacht sonst noch hilfereiche Tipps für Anfänger?
Ja. SChau dein Header File noch mal durch. Welche der #define muss jemand kennen, der deine Klasse verwendet? Welche dieser #define sind nur für die Klasse selber interessant und müssen daher von niemandem ausserhalb der Klasse gewusst werden? Alle #define, die in letztere Kategorie gehören, gehören NICHT ins Header File sondern ins CPP selber. Das Headerfile ist in erster Linie eine Beschreibung für denjenigen, der die Klasse benutzen will. Dafür, wie das ganze intern funktioniert, soll er sich nach Möglichkeit nicht interessieren. Das geht in C++ nicht immer besonders gut, weil es keine saubere Trennung zwischen externer und interner Beschreibung auf File Ebene gibt (zumindest nicht ohne Aufwand, sprich zb PIMPL Idiom), trotzdem solltest du versuchen, es so gut es geht umzusetzen. Ein #define welches die Registernummer des Low-Bytes der Y-Achse beschreibt, ist für jemanden, der die Klasse benutzen möchte, völlig uninteressant. Daher hat das im Header File nichts verloren. Er kann daran sowieso nichts ändern und er gewinnt daraus keine Information. Ist ein Makro #define acc_10Bit(LSB,MSB) (((int8_t)MSB << 2) | LSB >> 6) wirklich für jemanden der ein BMA20 Objekt benutzt so interessant, dass es im Header File sein muss? Deine Klasse hat mir ein wenig zu viele statische Funktionalität! Das ist nicht wirklich der Sinn der Objektorientierung, dass man Klassen als eine Art Namensraum benutzt. In erster Linie möchte man Objekte haben, die eine Funktionalität kapseln. Und von diesen Objekten will man viele haben können! Soll es nur 1 derartiges Objekt geben können, dann macht man ein Singleton, wenn man sich selbst nicht über den Weg traut, das einzuhalten. Das hat den Vorteil, dass es dann auch einen Konstruktor gibt, der das Objekt zuverlässig als Ganzes in einen Defaultzustand bringt. Wenn du einfach nur alle Variablen, die du bisher hattest und alle Funktionen die du bisher hattest, als static in eine neue Klasse einfügst, dann kannst du Objektorientierung auch bleiben lassen. Denn das ist kein.
So habs jetzt in nen namespace gepackt und die defines sortiert. Siehts jetzt besser aus?
Für mehrere BMA Instanzen wäre es sinnvoll den I2C Bus als Klasse zu definieren. Auch wenn nur ein BMA am Bus hängen kann so kann man ja mehrere I2C Busse im Gerät haben. Im Kostruktor oder einer ConnectTo() Methode würde ich dann die Businstanz übergeben.
Nette idee aber da ich mich mit mehreren I2C Bus nicht auskenn wüsst ich net wie. xD
Na einen I2C Bus kann man durch evtl vorhandene Hardware Features im controller nutzen oder aber auch per Software an beliebigen Portpins implementieren. So wird die BMA Klasse auch universeller mit verschiedenen Controllern einsetzbar.
Ich glaub da muss ich erstmal noch ne ganze Menge lernen bis ich das hinbekomm^^ Kannst mir ja nen paar tuts posten wenn du lust und zeit hast, dann versuch ich mich bestimmt mal drann ;)
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.