Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| microcontrollertechnik:vorgaben_fuer_die_softwareentwicklung [2022/02/24 14:33] – [Bewertung] tfischer | microcontrollertechnik:vorgaben_fuer_die_softwareentwicklung [2024/09/24 13:51] (current) – mexleadmin | ||
|---|---|---|---|
| Line 34: | Line 34: | ||
| | | ||
| - | Software: | + | Software: |
| Funktion: | Funktion: | ||
| Line 61: | Line 61: | ||
| =============================================================================*/ | =============================================================================*/ | ||
| - | </code> | + | </sxh> |
| ++++ | ++++ | ||
| Line 156: | Line 156: | ||
| ++++Beispiel für Konstanten| | ++++Beispiel für Konstanten| | ||
| + | {{tablelayout? | ||
| |<fc # | |<fc # | ||
| // Konstanten | // Konstanten | ||
| Line 203: | Line 204: | ||
| * Variablen beginnen mit Kleinbuchstaben. | * Variablen beginnen mit Kleinbuchstaben. | ||
| * Falls Sie aus mehreren Wörtern zusammengefügt sind, so werden die folgenden Wörter **ohne Unterstrich** | * Falls Sie aus mehreren Wörtern zusammengefügt sind, so werden die folgenden Wörter **ohne Unterstrich** | ||
| - | * Vermeiden Sie zu allgemeine Namen, wie anzahl, uebergabewert oder string. Sinnvoller sind Namen, wie anzahlBuchstaben, | + | * Vermeiden Sie zu allgemeine Namen, wie anzahl, uebergabewert oder string. Sinnvoller sind Namen, wie '' |
| * Nutzen sie auch bei Zählvariablen aussagekräftige Namen. | * Nutzen sie auch bei Zählvariablen aussagekräftige Namen. | ||
| - | * Auch kann eine zu allgemeine Deklaration kann zu Problemen führen. Schlecht ist z.B. "int a;". | + | * Auch kann eine zu allgemeine Deklaration kann zu Problemen führen. Schlecht ist z.B. '' |
| - | * Es bietet sich an bei der Definition bereits zu initialisieren. Gut ist also "bool a=1;". | + | * Es bietet sich an bei der Definition bereits zu initialisieren. Gut ist also '' |
| ++++Beispiel für Variablen| | ++++Beispiel für Variablen| | ||
| Line 224: | Line 225: | ||
| // Variablen | // Variablen | ||
| - | const int maxAnzSpieler | + | const uint8_t |
| - | uint8_t | + | uint16_t |
| - | unsigned char gemesseneBreite = 0; // gemessene Breite in Meter | + | uint8_t |
| bool zeichenAusgabe | bool zeichenAusgabe | ||
| // ein Zeichen ausgegeben werden darf | // ein Zeichen ausgegeben werden darf | ||
| Line 236: | Line 237: | ||
| * Teilen Sie Ihr Projekt in sinnvolle Unterstrukturen. Diese sind meist Funktionen. Die Unterstrukturen sollten nicht zu groß werden, um die Übersichtlichkeit zu bewahren. | * Teilen Sie Ihr Projekt in sinnvolle Unterstrukturen. Diese sind meist Funktionen. Die Unterstrukturen sollten nicht zu groß werden, um die Übersichtlichkeit zu bewahren. | ||
| - | * Bei größeren Programmen ist auch die Aufteilung in mehrere Dateien sinnvoll, also z.b. main.c, LED.c, motorDriver.c. Dabei sollte darauf geachtet werden, dass globalen Variablen und Konstanten jeweils nur im Kontext der einzelnen Dateien genutzt werden und, dass header-Dateien angelegt werden. Das ermöglicht ein separates Testen der unterschiedlichen Dateien (z.B. mit einer Datei testLED.c, welche LED.h inlcude't). | + | * Bei größeren Programmen ist auch die Aufteilung in mehrere Dateien sinnvoll, also z.b. '' |
| - | * Nutzen Sie den Zeileneinschub den AtmelStudio | + | * Nutzen Sie den Zeileneinschub den Microchip Studio |
| - | * Für die Benennung von Funktionen bietet sich - wie bei Variablen - camelCase an. Zum leichteren Verständnis sollten die Funktionsnamen aus Objekt(e) und Verb zusammengesetzt werden (z.B. bool isI2cMessageNotSent() oder void sentI2cMessage()). Damit wird der Code besser lesbar, Z.B. '' | + | * Für die Benennung von Funktionen bietet sich - wie bei Variablen - camelCase an. Zum leichteren Verständnis sollten die Funktionsnamen aus Objekt(e) und Verb zusammengesetzt werden (z.B. '' |
| * Vermeiden Sie zu viele Leerzeilen. | * Vermeiden Sie zu viele Leerzeilen. | ||
| * Stellen Sie auch jeder Funktion eine kurze Beschreibung voran. Aus dieser sollte hervorgehen, | * Stellen Sie auch jeder Funktion eine kurze Beschreibung voran. Aus dieser sollte hervorgehen, | ||
| Line 267: | Line 268: | ||
| */ | */ | ||
| { | { | ||
| - | for( int aktuelleSchluesselPosition=ERSTE_SCHLUESSEL_POSITION; | + | for( uint8_t |
| { // durchlaufe alle Schlüsselpositionen | { // durchlaufe alle Schlüsselpositionen | ||
| if(schluesselArray[aktuelleSchluesselPosition]==schluessel) return aktuelleSchluesselPosition; | if(schluesselArray[aktuelleSchluesselPosition]==schluessel) return aktuelleSchluesselPosition; | ||
| Line 274: | Line 275: | ||
| return 0; | return 0; | ||
| } | } | ||
| - | </ | + | </ |
| ++++ | ++++ | ||
| Line 397: | Line 398: | ||
| |<fc # | |<fc # | ||
| ... | ... | ||
| - | if (i==0) doZero; | + | if (i==0) doZero(); // wenn 0 dann null |
| - | if (i==1) doOne; | + | if (i==1) doOne(); // wenn 1 dann eins |
| - | if (i==2) doTwo; | + | if (i==2) doTwo(); // wenn 2 dann zwei |
| - | if (i==3) doThree; | + | if (i==3) doThree(); // wenn 3 dann drei |
| - | if (i==4) doFour; | + | if (i==4) doFour(); // wenn 4 dann vier |
| - | if (i==5) doFive; | + | if (i==5) doFive(); // wenn 5 dann fünf |
| ... | ... | ||
| Line 409: | Line 410: | ||
| ... | ... | ||
| switch(i) { | switch(i) { | ||
| - | case 1: doOne; | + | case 1: doOne(); |
| - | case 2: doTwo; | + | case 2: doTwo(); |
| - | case 3: doThree; break; | + | case 3: doThree(); break; |
| - | case 4: doFour; | + | case 4: doFour(); break; |
| - | case 5: doFive; | + | case 5: doFive(); break; |
| default: break; | default: break; | ||
| }; | }; | ||
| Line 424: | Line 425: | ||
| ... | ... | ||
| switch(i) { | switch(i) { | ||
| - | case 1: doOne; | + | case 1: doOne(); |
| - | case 2: doOne; | + | case 2: doOne(); |
| - | case 3: doThree; | + | case 3: doThree();doFour();doFive(); break; |
| - | case 4: doFour; | + | case 4: doFour();doFive(); |
| - | case 5: doFive; | + | case 5: doFive(); break; |
| - | case 6: doOne; | + | case 6: doOne(); |
| - | case 7: doOne; | + | case 7: doOne(); |
| - | case 8: doOne; | + | case 8: doOne(); |
| - | case 9: doOne; | + | case 9: doOne(); |
| default: break; | default: break; | ||
| }; | }; | ||
| Line 441: | Line 442: | ||
| ... | ... | ||
| switch(i) { | switch(i) { | ||
| - | case 1, 2, 6...9 : doOne; | + | case 1: |
| - | case 3: doThree; | + | case 2: // Einzelne Zahlen können mit case's untereinander ... |
| - | case 4: doFour; | + | case 6 ... 9: doOne(); |
| - | case 5: doFive; | + | case 3: doThree(); // |
| + | case 4: doFour(); | ||
| + | case 5: doFive(); | ||
| default: | default: | ||
| }; | }; | ||
| Line 465: | Line 468: | ||
| |<fc # | |<fc # | ||
| ... | ... | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | for(int steps; steps< | + | for(uint8_t |
| if( (Grenze[steps] < i) && (i <= Grenze[steps+1]) ) j = j + jSummand[steps]; | if( (Grenze[steps] < i) && (i <= Grenze[steps+1]) ) j = j + jSummand[steps]; | ||
| }; | }; | ||
| Line 485: | Line 488: | ||
| if (( 7<i) && (i<=12)) { | if (( 7<i) && (i<=12)) { | ||
| j=j+5; | j=j+5; | ||
| - | DoOne; | + | DoOne(); |
| } | } | ||
| if ((12<i) && (i<=20)) j=j+3; | if ((12<i) && (i<=20)) j=j+3; | ||
| Line 496: | Line 499: | ||
| else if (( 7<i) && (i<=12)) { | else if (( 7<i) && (i<=12)) { | ||
| j=j+5; | j=j+5; | ||
| - | DoOne; | + | DoOne(); |
| } | } | ||
| else if ((12<i) && (i<=20)) { j = j + 3;}; | else if ((12<i) && (i<=20)) { j = j + 3;}; | ||
| Line 508: | Line 511: | ||
| if (i<=7) { | if (i<=7) { | ||
| j=j+2; | j=j+2; | ||
| - | DoOne; | + | DoOne(); |
| } | } | ||
| else if (( 7<i) && (i<=12)) { | else if (( 7<i) && (i<=12)) { | ||
| j=j+5; | j=j+5; | ||
| - | DoZero; | + | DoZero(); |
| - | DoOne; | + | DoOne(); |
| } | } | ||
| else if (12<i){ | else if (12<i){ | ||
| j=j+3; | j=j+3; | ||
| - | DoZero; | + | DoZero(); |
| - | DoOne; | + | DoOne(); |
| }; | }; | ||
| ... | ... | ||
| Line 525: | Line 528: | ||
| |<fc # | |<fc # | ||
| ... | ... | ||
| - | if (i<=7) { | + | if ( i <= 7 ) { |
| - | j=j+2; | + | j = j + 2; |
| } | } | ||
| - | else if (( 7<i) && (i<=12)) { | + | else if (( 7 < i ) && ( i <= 12)) { |
| - | j=j+5; | + | j = j + 5; |
| - | DoZero; | + | DoZero(); |
| } | } | ||
| - | else if (12< | + | else if ( 12 < i){ |
| - | j=j+3; | + | j = j + 3; |
| - | DoZero; | + | DoZero(); |
| }; | }; | ||
| - | DoOne; | + | DoOne(); |
| ... | ... | ||
| </ | </ | ||
| ... | ... | ||
| - | if | + | if ( i <= 7) j = j + 2; |
| - | else{if | + | else{if |
| - | else if (12< | + | else if (12 < i) j = j + 3; |
| - | DoZero; | + | DoZero(); |
| }; | }; | ||
| - | DoOne; | + | DoOne(); |
| ... | ... | ||
| </ | </ | ||
| Line 561: | Line 564: | ||
| initAll; | initAll; | ||
| while(1){ | while(1){ | ||
| - | Eingabe; | + | Eingabe(); |
| - | Verarbeitung; | + | Verarbeitung(); |
| - | if (CancelButton==1) main; | + | if (CancelButton==1) main(); |
| - | Ausgabe; | + | Ausgabe(); |
| } | } | ||
| } | } | ||
| Line 572: | Line 575: | ||
| void main() | void main() | ||
| { | { | ||
| - | initOneTimeFunctions; | + | initOneTimeFunctions(); |
| while(1){ | while(1){ | ||
| - | initOtherFunctions; | + | initOtherFunctions(); |
| CancelButton = 0; | CancelButton = 0; | ||
| while(!CancelButton){ | while(!CancelButton){ | ||
| - | Eingabe; | + | Eingabe(); |
| - | Verarbeitung; | + | Verarbeitung(); |
| - | if (!CancelButton) Ausgabe; | + | if (!CancelButton) Ausgabe(); |
| }; | }; | ||
| } | } | ||
| Line 590: | Line 593: | ||
| |<fc # | |<fc # | ||
| - | for(int xpos=0; | + | for(uint8_t |
| - | initYPos; | + | initYPos(); |
| for(int ypos=0; | for(int ypos=0; | ||
| - | Eingabe; | + | Eingabe(); |
| - | Verarbeitung; | + | Verarbeitung(); |
| if (CancelButton) goto Abbruch; | if (CancelButton) goto Abbruch; | ||
| }; | }; | ||
| Line 603: | Line 606: | ||
| </ | </ | ||
| |<fc # | |<fc # | ||
| - | | + | |
| - | for(int xpos=0 ; xpos< | + | for(uint8_t |
| - | initYPos; | + | initYPos(); |
| - | for(int ypos=0 ; ypos< | + | for(uint8_t |
| - | Eingabe; | + | Eingabe(); |
| - | Verarbeitung; | + | Verarbeitung(); |
| if (CancelButton) break; | if (CancelButton) break; | ||
| }; | }; | ||
| Line 621: | Line 624: | ||
| ++++ | ++++ | ||
| - | * _delay_ms() und _delay_us() sind zu 99% nicht notwendig. Verwenden Sie stattdessen Interrupts, bzw. Timer. Es können z.B. durch Interrupts Takte angelegt werden: takt10ms, takt100ms, takt1s. Diese können dann im main() Verzweigungen in einer Zustandsmaschine | + | * _delay_ms() und _delay_us() sind zu 99% nicht notwendig. Verwenden Sie stattdessen Interrupts, bzw. Timer. |
| + | * Häufig bietet es sich an, in den Takten dann auch Verzweigungen in einer Zustandsmaschine | ||
| * Wenn Sie Zahlen in Variablen speichern und diese auch mathematisch weiterverwenden, | * Wenn Sie Zahlen in Variablen speichern und diese auch mathematisch weiterverwenden, | ||
| ++++Beispiel für Variablen mit Ausgabe| | ++++Beispiel für Variablen mit Ausgabe| | ||
| Line 643: | Line 647: | ||
| Laengen[i] = Laenge; | Laengen[i] = Laenge; | ||
| Flaeche | Flaeche | ||
| - | LCD_putc(Laengen[i]+ ASCII_ZERO); | + | LCD_putc(Laengen[i] + ASCII_ZERO); |
| ... | ... | ||
| </ | </ | ||
| Line 651: | Line 655: | ||
| ====== Bewertung ====== | ====== Bewertung ====== | ||
| - | Zur Bewertung lege ich ({{microcontrollertechnik: | + | Zur Bewertung lege ich {{microcontrollertechnik: |