Immer wieder habe ich die ein oder andere Idee, wie ich ein aktuelles Problem mit einem Controller (vornehmlich aus der ATmega Serie) loesen moechte. Wenn ich dann aber loslege und in losem Zusammenhang hier ein wenig Code schreibe, da ein wenig mit der Hardware bastel und nebenbei dann auch noch nach Teilen in der Bucht und im restlichen Internet suche, verzettel ich mich immer und nach einer Weile geht mir der Ueberblick verloren und ich lasse die Bastelei sein. Genauso ist es dann beim Programmieren ... Mir faellt immer wieder ein neuer Weg zur Loesung ein, aber nach einer Weile steht da so viel Code mit so viel Kommentar, das es einem schwindelig wird. Auch hier ist nach einer Weile das Project beendet und ich aergere mich ueber mich selbst, weil ich wieder einmal z.B. eine Woche "verheizt" habe ohne nachher etwas vorweisen zu koennen. Weil ich hier im Forum schon eine Menge sehr aufwendige und auch aufwendig recherchierte Projekte gesehen (und zum Teil auch nachgebaut) habe, wuerde mich einmal interessieren, wie Ihr denn so an die Sache herangeht, wenn Ihr eine Idee habt. Besonders wuerde mich interessieren, wie Ihr die Software in schreibt. Also wie Ihr da vorgeht, ohne nach einer Weile die Uebersicht zu verlieren. Danke schon einmal. Gruss vom Gast.
Doku ist alles z.B Pflichtenheft oder auch Neudeutsch Spec. Aufzählen der W's. Blockschaltbild u.s.w. Solche Hilfen leben mit dem Projekt.
Das wichtigste ist IMHO eine ziemlich genaue Vorstellung davon zu haben, wie sich die Funktionalität in einzelne Funktionsbereiche aufschlüsselt, welche Techniken verwendet werden sollen etc. Wenn man das nicht im Kopf kann, dann muss man sich eben Notizen machen. Das ist sowieso eine gute Idee, denn wenn du das Profimässig machen willst, musst du deinem Auftraggeber im Vorfeld schon sagen, was das Zeugs kosten wird und da musst du dann schon sehr genau wissen, was du eigentlich machen willst und wie du es machen wirst, abgeleitet vom Pflichtenheft (das eigentlich vom Auftraggeber kommen sollte, aber na ja, lassen wir dieses Thema mal) Wenn einzelne Teilbereiche nicht klar sind, oder man sich nicht im Klaren ist, welche Technik gut funktioniert, dann ist ein seperates Hilfsprogram immer ein gute Idee. Aufgabe dieses Hilfsprogramms ist es spezielle Technikfragen abzuklären. Ein Hilfsprogram für solche Dinge ist meistens eine gute Idee, weil man da losgelöst vom eigentlichen Problem ein Detail abklären und abklopfen kann bzw. verschiedene Alternativen durchprobieren kann und so rauskriegt wo die Stärken und Schwächen einer bestimmmten Technik liegen.
> Wie fangt Ihr an, ein Project auf dem Controller umzusetzen ? Na, abgesehen von Kinderkacke ist es erst mal notwendig, die physikalischen Gegebenheiten zusammenzusammeln, unter denen das Projekt funktionieren soll. Welche Kenndaten haben die Sensoren, welche Aktoren braucht man, welche Algorithmen führen zur Lösung. Hat man alle Informationen zusammen, probiert man aus, ob die einzelnen Dinge funktionieren wie versprochen, man realisiert also kleine Funktionsblöcke die man testen kann. Erst zu Schluss, nach Auswahl der Plattform, wirft man alles zusammen. > vornehmlich aus der ATmega Serie loesen moechte. Wer mit so einem "möchten" beginnt, hat ein gewaltiges Problem mit der Organisation. Man wählt natürlich den uC der die Aufgabe zum vermutlich niedrigsten Preis löst, wobei der Gesamtpreis zählt, also Beschaffung, Entwicklung, nötige Peripherie, Stromquelle und Gehäuse. Ob dazu ein ATmega optimal ist, stellt sich erst raus, wenn man weiß, was alles notwendig ist. > Besonders wuerde mich interessieren, wie Ihr die Software in schreibt. Programmieren können heisst nicht, die 50 Schlüsselworte der Programmiersprache auswendig zu konnen die gerade en-vouge ist, sondern ob man 300, 30000 oder 3 Mio Quelltextzeilen überblickt. Und ich glaube, ja, es hängt von der Anzahl der Zeilen ab, je weniger man braucht, um so komplexer können die Programme werden, bevor man den Überblick verliert.
Ich habe mir auch angewöhnt ein Lastenheft bzw. eine Liste der gewünschten Funktionen zu erstellen. Dann Arbeite ich eine Funtkion nach der anderen ab. Wenn ich also ein Projekt mit 3 Funktionen habe, programmiere ich 3 theoretisch weitgehend unabhängige Programme, definiere dabei die Schnittstellen und binde jede Funktion als Unterprogramm ein. Das hat den Vorteil das ich mit ein paar Testfunktionen (und wenn es nur eine UART-Ausgabe ist) die einzelnen Funktionen prüfen kann. So hab ich noch halbwegs übersichtliche Programmteile die ich alle extra testen kann. Und dein Problem, das einem während des Programmierens ein besserer Weg einfällt, habe ich auch öfters. Dann überlege ich, mit welchem Aufwand ich mein bestehendes Programm ändern kann und ob es sich überhaupt lohnt, bzw. ob es nötig ist es anders zu machen. So kann ich auch im Nachhinen komplette Funktionen neu schreiben, mit den alten Schnittstellen, und im Hauptptogramm die neue Version einbinden. Gruss Stefan
Um mmal ein wenig Klarheit zu bringen: Lastenheft kommt normalerweise vom Auftraggeber, da schreibt er rein, was er gerne hätte, das ist ne Art Wunschliste. Das Pflichtenheft kommt vom Dienstleister/Entwickler und und beschreibt, was geliefert werden soll und unter welchen Bedingungen es funktioniert. Irgendwo muss man sich dann halt treffen, so dass beide zufrieden sind. Letztendlich ist das Pflichtenheft der Arbeitsvertrag.
Hallo Gast, Dein Problem kenn ich auch. Wenn Du weißt, dass Du nur eine Woche daran arbeiten willst, dann musst Du eben das Projekt so zurechtstutzen, dass es in einer Woche fertig ist. Lösungsmöglichkeiten: - Fertigen Code/Libs von anderen Leuten verwenden. Auch wenn Du glaubst, Du könntest das besser machen oder die externe Hardware besser nutzen - es kostet einfach Zeit. - Fertige Hardware verwenden (Prototypenboards oder dergleichen). Statt einem USB-Interface das SMD-Chips braucht was wiederum eine geäzte Platine verlangt einfach RS232 nehmen und einen fertigen RS232-nach-USB-Umsetzer benutzen. - Geringere Ansprüche, z.B. Textdisplay statt Grafikdisplay, denn dann muss man sich weder um Fonts kümmern noch Bilder malen. - Besser vorbereiten. Also nicht nur einfach mal das Datenblatt querlesen, sondern genau anschauen und Beispielcode auch verstehen. - Projekt in mehrere Teile aufspalten. Wenn Du einen MP3-Player bauen möchtest, dann könntest Du das aufspalten in a) SD-Card lesen schreiben, Daten kommen per RS232 b) MP3-Decoder ansteuern, Daten kommen per RS232 c) USB-Interface testen. Erst danach das Gesamtprojekt in Angriff nehmen. Was die Software angeht: Da hilft meiner Erfahrung nach insbesondere, wenn man regelmäßig aufräumt. Am Anfang fehlt einem ja noch der Überblick, deswegen wird das Design schlecht sein. Wenn man aber regelmäßig lange Funktionen in mehrere kleine aufteilt und Variablennamen bessere Namen verpasst ist schon viel gewonnen. Dann noch einige quick hacks durch saubere Lösungen ersetzen und gut ist.
Zum Thema Code-Aufteilung: Auf uCs mag ich die Bottom-Up-Methode mit frühem Testen und reichlich Abstraktion. Gnadenlos übertriebenes Beispiel: Ein Board, das mit einem Servo eine schwarze Platte in die Sonne dreht, die Temperatur der Platte misst und im Minutentakt auf externem Datenflash speichert und auf Tastendruck über RS232 an den PC sendet. Status-LEDs braucht man immer, einen Taster auch, Sonneneinstrahlung koennte man mit einem Fototransistor an der Platte messen, für die Temperatur habe ich irgendwo mal den KTY81 erwaehnt gesehen. Also zuerst eine Funktion, die die Status-LEDs kapselt, schreiben und testen:
1 | ...
|
2 | int main(void) |
3 | {
|
4 | PortInit(); |
5 | SetLED(GREEN_OK, ON); |
6 | SetLED(RED_ERROR, ON); |
7 | while (1) |
8 | {
|
9 | ;
|
10 | }
|
11 | return 0; |
12 | }
|
Danach gleich klären, ob die Timer tun und in main() die LEDs blinken lassen:
1 | ...
|
2 | while (1) |
3 | {
|
4 | if (g_u8Timer0Triggered_300ms) |
5 | {
|
6 | g_u8Timer0Triggered_300ms = 0; |
7 | SetLED(GREEN_OK, TOGGLE); |
8 | }
|
9 | }
|
10 | ...
|
Dann Tasterabfrage:
1 | ...
|
2 | while (1) |
3 | {
|
4 | if (g_u8Timer0Triggered_300ms) |
5 | {
|
6 | g_u8Timer0Triggered_300ms = 0; |
7 | SetLED(GREEN_OK, TOGGLE); |
8 | }
|
9 | unsigned char u8KeyStatus = GetKeyStatus(); |
10 | if (u8KeyStatus == KEY_PRESSED) |
11 | {
|
12 | SetLED(RED_ERROR, TOGGLE); |
13 | }
|
14 | }
|
15 | ...
|
Dann die Servo-Ansteuerung einbauen (Servo haengt direkt an einem PWM-Ausgang und wird mit passender Frequenz und Tastverhaeltnis angesteuert) und testen:
1 | ...
|
2 | unsigned char u8ServoAngle = 0; |
3 | while (1) |
4 | {
|
5 | if (g_u8Timer0Triggered_300ms) |
6 | {
|
7 | g_u8Timer0Triggered_300ms = 0; |
8 | SetLED(GREEN_OK, TOGGLE); |
9 | u8ServoAngle++; |
10 | u8ServoAngle %= MAX_SERVO_ANGLE; |
11 | SetServo(u8ServoAngle); |
12 | }
|
13 | unsigned char u8KeyStatus = GetKeyStatus(); |
14 | if (u8KeyStatus == KEY_PRESSED) |
15 | {
|
16 | SetLED(RED_ERROR, TOGGLE); |
17 | }
|
18 | }
|
19 | ...
|
Danach RS232-Ausgabe testen (z.B. u8ServoAngle ausgeben), ADC testen (Poti, Rohwert auf RS232 ausgeben). Jetzt ist es interessant, welche Spannungen der Fototransistor liefert. Schaltung aufbauen, messen, evtl. ein OPV dazu etc., so dass etwas messbares wie Nacht=1V, Mittagssonne=3V herauskommt. Dann gleich den ADC+Fototransistor in einer Funktion mit passender Umrechnung kapseln (auch auf RS232 ausgeben). Dann könnte man eine Methode überlegen, die Richtung der maximalen Sonneneinstrahlung zu bestimmen. Z.B. alle 10 Minuten die Platte ganz herumdrehen und den Winkel mit der höchsten Lichtintensität merken. Also in main() alle 10 Minuten OptimumPlatePosition() aufrufen, die das Drehen, Messen und Vergleichen erledigt. Ziel ist es, dass die aufrufende Funktion nicht wissen muss, was eine aufgerufene Funktion intern tut, nur der Rückgabewert ist interessant. Dazu ist es wichtig, dass alles ueber definierte Schnittstellen (Parameter, Rückgabewerte und Referenzparameter) passiert, unsichtbare Seiteneffekte sind extrem schlechter Stil. main() weiss nicht, was genau in OptimumPlatePosition() passiert, OptimumPlatePosition() weiß nicht, was SetServo() und GetLightIntensity() intern tun, GetLightIntensity() weiss nicht, welche Register GetADC() anspricht, usw. Man koennte auch, statt in OptimumPlatePosition() SetServo() direkt aufzurufen, eine Funktion SetPlateAngle() aufrufen, die ihrerseits SetServoAngle() (oder nach einem Hardware-Umbau stattdessen TurnStepperMotor()) aufruft. Grüße, Thomas PS: Keine Angst haben, Code wegzuwerfen und neuzuschreiben. Nach der ersten umstaendlichen und unlesbaren Version, in der viel Arbeit steckt, hat man immerhin das Problem verstanden, die neue, richtige Lösung geht dann schneller von der Hand.
N'abend, > verzettel ich mich immer und nach einer Weile geht mir der Ueberblick > verloren und ich lasse die Bastelei sein. [...] > Genauso ist es dann beim Programmieren ... Mir faellt immer wieder ein > neuer Weg zur Loesung ein, aber nach einer Weile steht da so viel Code > mit so viel Kommentar, das es einem schwindelig wird. Auch hier ist nach > einer Weile das Project beendet und ich aergere mich ueber mich selbst, > weil ich wieder einmal z.B. eine Woche "verheizt" habe ohne nachher > etwas vorweisen zu koennen. Ist bei mir genauso. Meine Strategien: Ich habe den Luxus ein eigens "Bastelzimmer" zu haben. Wenn mal nix geht, dann geht eben nix. Es kommt öfters vor, dass mein Projekt mal 2 Wochen liegen bleibt. Der Vorteil des eigenen Zimmers: Ich kann alles liegen lassen und mache nach 2 Wochen genau da weiter wo ich aufgehört habe. Wenn mir während des HW-Basteln was neues, besseres etc. einfällt, dann schreibe ich es mir auf und lege den Zettel für die Version 2 auf die Seite... Viel schlimmer ist es beim Programmieren. Mir fallen ständig Wege ein, wie man das noch besser/kürzer/schöner machen könnte -> aufschreiben und zur Seite legen. Wenn dann mein Gerät fertig ist, wird es erstmal "produktiv" benutzt. Dabei fallen dann die Unzulänglichkeiten zum Beispiel bei der Usability auf. Na? was passiert wohl -> aufschreiben und zur Seite legen. Auf diese Art sind schon entstanden: - Uboot-X-Ruder-Steurung - Pressluft-Steuerung für UBoot - Wecker - Rolladensteuerung - Bewässerungscomputer Wenn ich dann Zeit und Lust habe wird die Version 2 gebaut. Im Moment plane ich welche Features der Bewässerungscomputer V2 haben soll - Nach der Gartensaison gehts los ... Parallel plane ich eine Wetterstation ... Gruß Andreas
Hallo, ich schließe mich da mal (als Hobbyprogrammierer) Thomas (Gast) an. Komponenten bekommen an die Hardware gebundene einzelen Dateien, in Assembler als .inc, in C eben als .h und .c Die lege ich nacheienander an bzw. kopiere sie aus anderen Projekten rein. Erste Handlung ist bei mir immer den AVR auf ein Steckbrett, ISP fertig machen, Quarz ran, wenn nötig und Programmer ran, ob er sich meldet. Fuses für Takt gleich gesetzt und erstmal als ok abgehakt. Dann erstmal einen Debug-UART rauf, als Hard- oder Softuart, je nach AVR. Der enthält nur Senderoutinen für send_byte, send_byte_hex, send_byte_bin und läuft meist mit 38400. Daran ein RS232 oder FTDI-Adapter (liegen Steckbrett fertig rum). UART testen und dann kann es losgehen. Mein momentanes Projekt ist genau in diesem Zustand: Empfänger-IC SI4735 soll rauf, ist auch schonmal getestet am PC mir der Demosoftware. Jetzt erstmal das Pollin-Display mit Touchscreen an den AVR gehangen, im Forum etwas Code-Anleihe gemacht und an den Mega16 hier angepasst, meldet sich. Die Display-Routinen passten nicht in meinen privaten Standard, also .h Datei angepasst, Kleinigkeiten in den Funktionen verändert. Das hat jetzt erstmal die nötigsten Funktionen und spielt. meist werfe ich auch rigoros alle Funktionen raus, die ich vermutlich nicht brauche. Kann ich hinterher wieder reinkopieren. ;-) Das verschafft mir aber das nötige Verständnis für den übernommenen Code und zeigt mir rechtzeitig Abhängigkeiten oder auch Fehler. Ich benutze selten fertige Bibliotheken (LCD, UART usw.), ich will möglichst genau wissen, was da passiert und es macht mir mehr Spaß, selber zu schreiben. Es ist Hobby, also Zeitvertreib weil es mir Spaß macht. Da kann man sich durchaus ein anderes Herangehen zusammenbasteln als im Beruf. Wichtig ist, was Thomas schon schrieb: der Kram muß sauber gekapselt sein, Meine "Bibliotheken" sind schnell austauschbar, Grundfunktionen sind einheitlich. Ein LCD muß erstmal einzelne Zeichen und Text aus Ram und Flash ausgeben können und die Zeile/Spalte ansteuern können. Dann ist es schon beim Test egal, wenn ich mich entscheide, statt des 2x16 44780 Displays doch ein Grafikdisplay mit T6369C zu nehmen, die Anzeigen gehen ohne sonstige Änderungen trotzdem erstmal. Gruß aus Berlin Michael
Thomas schrieb: > PS: Keine Angst haben, Code wegzuwerfen und neuzuschreiben. Nach der > ersten umstaendlichen und unlesbaren Version, in der viel Arbeit steckt, > hat man immerhin das Problem verstanden, die neue, richtige Lösung geht > dann schneller von der Hand. Bestätige ich! Dass man ab und zu sieht, dass es anders besser geht ist eigentlich unumgänglich und, wie gesagt, sollte man dann abwägen ob es sich lohnt. Man kann auch mal einen Tag ne Rework Phase einlegen, wo man den Code überarbeitet, vereinfacht, aussondiert, überflüssige Variablen eliminiert. Aber stimmt, habe letztens Code zum einlesen eines PPM Signals und Erkennung, wann das Signal verloren wurde, bzw. wieder da ist 3 mal neu geschrieben. Beim letzten mal hat es mit Testen und debuggen fast nur noch ein, zwei Stunden gedauert. Die erste vermurkste Version zog sich da schon länger hin ;)
Uboot- Stocki schrieb: > Viel schlimmer ist es beim Programmieren. Mir fallen ständig Wege ein, > wie man das noch besser/kürzer/schöner machen könnte -> aufschreiben und > zur Seite legen. Ich benutze Eclipse, der hat einen TODO-Parser. Den benutze ich sehr oft. Das heißt, man schreibt in den Code innerhalb eines Kommentars zum Beispiel
1 | /* TODO: Schleife muss noch optimiert werden */ |
Und dann taucht das in einer Liste auf. Dann kann man darauf Doppelklicken und kommt direkt an die Stelle. Das ist ziemlich praktisch, da man da nicht beim Fluss des Programmierens unterbrochen wird. Weil genau dann kommen einem ja die besten Ideen. Ich hab mir angewöhnt, die Idee sofort niederzuschreiben. Ansonsten vergisst man es und schreibt es später u.U. auch nicht mehr auf.
Hallo, das tolle in unserer Firma ist, dass ich schon seit Jahren versuche das Chaos zu reduzieren, indem die Erstellung von Pflichtenheften zur Pflicht wird. Bekomme immer wieder zu hören "Da haben wir keine Zeit für!", um dann am Ende des Projekts die vermeintlich gesparte Zeit dann doch reinstecken zu müssen, weil das Pflichtenheft am Anfang gefehlt hat. Wiederholung folgt. Mache es dann meist für mich persönlich und mit Erfolg bei der Umsetzung. Nur traurig, wenn's woanders auf taube Ohren stösst. Also, Pflichtenheft ist Pflicht.
Ich kann da ne Versionsverwaltung für Quellcode auch nur wärmstens empfehlen. Man hat immer Zugriff auf frühere Versionen und kann wenn man mal ne neue Funktionalität programmiert hat und es funktioniert nichts mehr einfach zurückgehen oder genau nachverfolgen "wo man warum was geändert hat". Im Hinblick auf größere Zusammenarbeit später in Teams ist es sowieso sinnvoll sich damit zu befassen. Insbesondere dir sollte das helfen wenn du den Überblick verliert und auch mehr motivieren immer Teilprobleme zu löschen und diese dann "einzuchecken". TortoiseHG für Windows ist echt super einfach und schnell zu handhaben und braucht keinen Server oder so arbeitet auch lokal. http://bitbucket.org/tortoisehg/stable/wiki/Home Für private Projekte schreibe ich mir einfach in einer Textdatei auf was so etwa alles rein soll, dann werden die einzelnen Teilkomponenten einzeln als Prototyp gebaut und ausprobiert bis alles klappt und dann schrittweise zusammengefügt. Das praktisch ist wenn man so eine funktionierende Teilkomponente hat kann man die auch recht einfach später in anderen Projekten weiterverwenden. Wenn es schön werden soll und/oder für ne Freund ist kommt uU später ne Platine, sonst funktioniert Lockraster auch immer sehr gut.
Wichtig ist vor allem, sich nicht zu verzetteln. Immer nur an einer Stelle des Programms arbeiten. Immer nur in kleinen Schritten vorgehen. Teile das Programm in mehrere Blöcke/Dateien auf. Solch eine Datei läßt sich auch einzeln testen. Wenn sie fertig ist, zur Seite damit. Ich arbeite mich gerne langsam von den IO-nahen zu den IO-fernen Funktionen durch. Viel kommentieren (Verhältnis Kommentar:Code > 2:1). Falls mir auffällt, dass irgendeine Funktion, an der ich gerade nicht bin, besser zu machen ist, aber funktioniert, kommentiere ich die Region (siehe Simon K.) und hebe sie mir für später auf. Vorerst gehe ich immer nach dem Motto "never touch a running code" vor. Verbesserungen sind später noch in einer neuen Version drin (Versionsverwaltung ist Pflicht!). Was ich mir aus meinem Studium (Eiffen und extream programming) mitgenommen habe, sind Vor-, Zwischen- und Nachbedingungen sowie automatische Tests. Das sind per #if/#define auskommentierbare Programmteile, die die aktuellen Zustände mit einem Sollwert vergleicht. Ich weiß ja, was eine Funktion als Eingabewerte(-bereiche) bekommen darf und was rauskommen soll. Sowas kann man auch überprüfen. Im Fehlerfall gibt es eine Meldung per RS232 (benötigt nur einen Pin plus Masse; das wird bereits bei der Prozessorauswahl berücksichtigt). Wenn man eine Funktion verbessert werden muss, kann ich so sehr schnell sehen, wo etwas nicht stimmt. Am besten keine Seiteneffekte verwenden. Ein Funktionsergebnis wird niemals in eine globale Variable geschrieben (außer es geht wirklich nicht anders). Eine Funktion, wie auch eine Codedatei ist als Black-Box zu sehen. Was drin steckt, ist egal. Es ist nur wichtig, dass genau das raus kommt, was ich erwarte/zulase. Das war's ersmal. Später eventuell mehr.
Vielleicht ist Entwicklung auch nicht das richtige für Dich. Es könnte sein, dass Du dafür einfach nicht geboren wurdest. Eventuell liegt Deine Stärke in der Ideenfindung und nicht in der Umsetzung. Man sollte immer das machen, was man am besten kann.
Hallo vom Threadopener. Da bin ich ja erst einmal froh, das ich als Hobbybastler nicht allein mit meinem Problem dastehe ... @MaWin Ich gebe Dir vollkommen recht, das dieses "moechte" mich schon oft in die falsche Richtung gelotst hat. Allerdings mache ich die Mikrocontroller-Bastelei nur als Hobby und da kann ich mir leider nicht den Luxus leisten, Entwicklungswerkzeuge fuer eine Bandbreite an Controllern zuzulegen. Deiner Definition von "programmieren koennen" stimme iich voll zu. Meine Erfahrung im Programmieren waechst derzeit noch mit jedem Projekt und die Anzahl der Codezeilen wird immer mehr zu meinem Problem. Meist fange ich an und die Probleme sind mit z. B. 30 Zeilen Code geloest. Ein Teilproblem weiter kommt mir eine Idee, wie ich das Teilproblem von vorhin anders besser loesen kann. Dann wird aus 30 Zeilen eine Loesung mit 10 Zeilen. Ein paar Tage spaeter dann beim Test kommt es zu einem Problem / Falscher Funktion / ... und genau dann verliere ich den Ueberblick wegen der vielen Optimierungen. @Thomas (Gast) Genau so wie Du mit dem Servo habe ich mein letztes Projekt auch versucht auf die Beine zu stellen. Es sollten Temperatur, Drehzahl, Spannung des Empfaengerakku und Lenkwinkel (Aus der Lenkservostellung) eines 1:5 R/C Car mit einem RFM-12 Modul uebertragen werden. Nach dem Test der einfachen Funktionen (Ausgabe auf RS 232, statt auf RFM 12) klappte dann nach dem Einbinden der RFM 12 Programmteile nix mehr. Wenn man dann eine Woche oder mehr kaempft und keine Loesung findet, dann frustet das schon. @alle Danke fuer die vielen nuetzlichen Tipps und Hinweise. Besonders wichtig scheint es danach zu sein, das man sich vor dem Arbeiten erst einmal nacheinander Aufschreibt, was man machen will. Das habe ich bisher nie gemacht, sondern es wurde immer gleich "Hardware" und Software geschaffen. Vielen Dank bis hierher von Einem, der nun sicher oefter mal ein verwertbares Projekt hinbekommt.
Es gibt ja auch einige Hilfsmittel, um die Struktur und das Design einer Software zu planen und später auch besser zu überblicken. Das einfachste Hilfsmittel wäre der Programmablaufplan: http://de.wikipedia.org/wiki/Programmablaufplan oder für strukturierte Programmierung: http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm Für Softwaredesign gibt es je nach Paradigma (strukturiert, objektorientiert, modulbasiert ...) genügend Fachliteratur, wo man sich einlesen kann. Meine Erfahrung ist: Viel zu oft wird einfach drauf losprogrammiert, anstatt erstmal mit solchen Werkzeugen eine vernünftige Struktur zu finden. Das ist wie Haus bauen ohne Architekt und Bauplan. Das geht bei kleinen überschaubaren Projekten noch gut, führt aber oft auch zu Code, der an vielen Stellen so wirkt wie: "Ups, da hab ich gar nicht dran gedacht, muss ich jetzt irgendwie notdürftig zurechtflicken." Was ich auch ganz wichtig finde: Man muss eine geistige Fähigkeit entwickeln, seine Handlungsimpulse erstmal wahrzunehmen, um dann genau zu schauen, welchen Impulsen man wirklich nachgeht. Das erfordert auch Disziplin. Man muss nicht jede Optimierung sofort machen, nicht jedes Feature, was einem einfällt sofort einbauen. Aber genau hier liegt das Problem, manche haben keinerlei Kontrolle über ihre Impulse, müssen alles sofort umsetzen. Und das führt zum typischen "verzetteln". Wenn ein Projekt schon ziemlich fertig ist, sage ich irgendwann: "Ab jetzt kommen keine neuen Features mehr rein, nur noch Fehlersuche und Stabilisierung." Man kann das ja auch aus größeren Projekten wie Debian, wo irgendwann ein Freeze gemacht wird. Das ist wirklich manchmal schwer, sich diese Selbstdisziplin aufzuerlegen, keinerlei neue Features mehr einzufügen, sondern nur noch dafür zu sorgen, dass der Code sich stabilisiert. Übrigens: Im Schreiben von Software spiegelt sich sehr viel der Charakter desjenigen wieder, der sie schreibt. Da kann man sich wirklich gut kennenlernen. Mit dem, was einem wichtig ist und was auch die eigenen Schwachpunkte sind. Man kann schon sagen: Zeig mir deine Software und ich sag dir, wer du bist.
Was ich hier vielleicht noch dazufügen möchte, bei einem Projekt mache ich mir 3 Listen, eine Featur list, ähnlich Pflichtenheft, nur als Liste. Dann eine nice to have feature list und eine HW-Liste, wo pins, externe HW und so drauf sind. Darauf basierend entscheide ich dann den Controller usw. inkl Programmierung. Die nice to have featurelist wird dann noch priorisiert, und wenn es einfach zu programmieren ist, dann kommen auch die Teile in die Programmierung rein. In der Programmierung werden dann noch die später zu optimierenden oder zu vervollständigen Teile mit TODO sowie eine Zeile Kurzbeschreibung gekennzeichnet, sodaß ein Grep die ganzen TODO´s rausholen kann. Weiters werden auch Teile, welche fehlerhaft, nur Ansatzweise, oder auch nur als Dummy-Funktion implementiert sind, mit einem XXX gekennzeichnet, ähnlich wie die TODO. Dies ist ganz nützlich, um schnell ein Gesamtwerk zu haben, wo nicht wichtige Sachen oder eine nicht volle Implementierung nicht erforderlich ist, und dann ev. vor Fertigstellung dann nochmals das Pflichtenheft sowie die Featurlisten nochmals durchgesehen werden, um dann ev. noch Änderungen reinzumachen, oder ev um eventuelle Denkfehler auszuräumen. Diese XXX Stellen müssten dann prioritisiert eliminiert werden, vor den TODO. Weiters gibt es noch ein HINT marker, welche auf eventuelle Nebeneffekte oder auf Sachen die aufzupassen sind hinweist, oder auch nur auf Sachen, welche das nächste Mal besser zu machen wären oder so.
Das Thema interessiert mich auch, mal ein wenig drüber nachgedacht komme ich zu folgender Methode: - Zunächst wird eine Art Bedienungsanleitung geschrieben. Dabei entsteht auch die Information, welche Schnittstellen, also Ein- und Ausgabeelemente benötigt werden. - Anhand dieser werden Ein-und Ausgabeelemente der Hardware festgelegt und die Hardware designed. Je nach Größenordnung kann man das ganze dann eventuell zunächst modular oder auf dem Steckbrett aufbauen. - Jede Schnittstelle bekommt eine Funktion, es entstehen zunächst nur die Funktionsnamen, Über- und Rückgabewerte sowie eine Beschreibung - Umsetzung in möglichst kompaktem Pseudocode, weitere Abstraktion durch Auslagern von weiterverarbeitenden Teilen in Funktionen, wiederum nur Name, Übergabe- und Rückgabewerte sowie Beschreibung Es bleibt ein einfacher Pseudocode stehen, der das Zusammenspiel der Funktionen beschreibt. - Umsetzung der Funktionen, angefangen bei den Hardwarenahen, in ein Programm, Tests, wenn Zufrieden keine Änderungen mehr. - Nebenbei: Todo-Listen führen über neue Featureideen, mögliche bessere programmiertechnische Umsetzung u.s.w. --- Wenn das Gerät nun wie in der "Bedienungsanleitung" angegeben funktioniert die nächste Version unter Berücksichtigung der gemachten Todo-Listen beginnen. Passt das so ? Weitere Anregungen ? Standardisierte Diagramme, die einen dabei unterstützen ? Hilfsoftware-Vorschläge ?
...und bei aller Strukturierung der Arbeit auch immer noch dran denken, dass es Spaß machen soll. Bei großen Projekten z.B. motiviert unglaublich, wenn schonmal ein Einfachst-Prototype irgendwas tut. Anstatt erstmal 2 Monate nur Planung und Design zu machen. Auch sogenannte "Meilensteine" festzulegen, verschafft einem irgendwie ein gutes Gefühl, weiter zu kommen. Bescheiden zu werden, scheint mir auch eine Tugend. Viele haben tausenden Einfälle und verschätzen sich gnadenlos, wie viel Arbeit das alles bedeutet. Dann lieber erstmal die Minimalvariante fertig bekommen, als die eierlegende Wollmilchsau im ersten Anlauf machen zu wollen. Ich möchte nicht wissen, wieviele halbfertige Projekte jeder in der Ecke rumliegen hat. Ich auch ;-)
Hallo, Winfried schrieb: > ...und bei aller Strukturierung der Arbeit auch immer noch dran denken, > dass es Spaß machen soll. Bei großen Projekten z.B. motiviert > unglaublich, wenn schonmal ein Einfachst-Prototype irgendwas tut. > Anstatt erstmal 2 Monate nur Planung und Design zu machen. Auch > sogenannte "Meilensteine" festzulegen, verschafft einem irgendwie ein > gutes Gefühl, weiter zu kommen. Da kann ich nur zustimmen. Lochraster ist deshalb bei mir da immernoch angesagt. Kann ich schnell ändern, wenn es Probleme gibt und hält trotzdem zusammen. ;-) > Bescheiden zu werden, scheint mir auch eine Tugend. Viele haben > tausenden Einfälle und verschätzen sich gnadenlos, wie viel Arbeit das > alles bedeutet. Dann lieber erstmal die Minimalvariante fertig bekommen, > als die eierlegende Wollmilchsau im ersten Anlauf machen zu wollen. Auch da geht es mir nicht anders. Um(neu)bauen kann man dann immernoch, wenn nicht, auch gut. Man hat aber erstmal was. > > Ich möchte nicht wissen, wieviele halbfertige Projekte jeder in der Ecke > rumliegen hat. Ich auch ;-) Ja........ Bei manche Sachen ist aber bei mir auch der Weg das Ziel. Da liegt eine Lochrasterplatine mit einem AVR und dem C64-SID rum. Nur, weil es mal eine Diskussion gab, ob man den 6502 mit einem ATMega emulieren kann. Jetzt weiß ich: man kann, auch Zyklen-genau (naja, fast ;)). Nun spielt der SID dort einen Titel aus einem alten Game fehlerfrei. Allerdings brauch ich garkeinen SID-Player..... Gruß aus Berlin Michael
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.