Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
microcontrollertechnik:vorgaben_fuer_die_softwareentwicklung [2021/01/11 07:21] tfischermicrocontrollertechnik:vorgaben_fuer_die_softwareentwicklung [2024/09/24 13:51] (current) mexleadmin
Line 19: Line 19:
 ++++Beschreibung| ++++Beschreibung|
  
-<code c>+<sxh c; first-line: 1>
 /* ============================================================================ /* ============================================================================
  
Line 34: Line 34:
                  AVR-USB-PROGI Ver. 2.0                  AVR-USB-PROGI Ver. 2.0
  
-Software:        Atmel Studio Ver. 7.0.1417+Software:        Microchip Studio Ver. 7.0.1417
  
 Funktion:        Diese Programm sol eine einfaches Beispiel der Ein- und Ausgabe am MiniMEXLE sein. Funktion:        Diese Programm sol eine einfaches Beispiel der Ein- und Ausgabe am MiniMEXLE sein.
Line 61: Line 61:
  
 =============================================================================*/ =============================================================================*/
-</code>+</sxh>
  
 ++++ ++++
Line 68: Line 68:
 ++++Beispiel für Code-Kommentierung| ++++Beispiel für Code-Kommentierung|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 if(i==0) output=0; // wenn i = 1, output=0 if(i==0) output=0; // wenn i = 1, output=0
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 if(i==0) output=0; // nur für erstes Element wird der Output zurückgesetzt if(i==0) output=0; // nur für erstes Element wird der Output zurückgesetzt
-</code      |+</sxh     |
  
 ++++ ++++
Line 81: Line 81:
 ++++Beispiel für auskommentierten Code| ++++Beispiel für auskommentierten Code|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     if (i==1) output("eins");    // ToBeChanged: noch an Zähler anpassen     if (i==1) output("eins");    // ToBeChanged: noch an Zähler anpassen
Line 90: Line 90:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 ... ...
     if (i==STARTWERT) LCDoutput(startAusgabe);   // nur bei i=1 erfolgt eine Ausgabe     if (i==STARTWERT) LCDoutput(startAusgabe);   // nur bei i=1 erfolgt eine Ausgabe
Line 97: Line 97:
                         // Ausgabe, weil i <=1                         // Ausgabe, weil i <=1
 ... ...
-</code      |+</sxh     |
  
 ++++ ++++
Line 107: Line 107:
 ++++Beispiel für die vordefinierten Makros| ++++Beispiel für die vordefinierten Makros|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 #define    TWICE(x)    2*x // Port-Bit Setzen #define    TWICE(x)    2*x // Port-Bit Setzen
  
Line 121: Line 121:
     ...     ...
 } }
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 // Makros // Makros
  
Line 137: Line 137:
     ...     ...
 } }
-</code      |+</sxh     |
  
 ++++ ++++
Line 148: Line 148:
   * Konstanten per ''#define'' oder ''enum'' sind komplett in **Großbuchstaben** zu schreiben, um diese von Variablen zu unterscheiden.   * Konstanten per ''#define'' oder ''enum'' sind komplett in **Großbuchstaben** zu schreiben, um diese von Variablen zu unterscheiden.
   * Falls Sie aus mehreren Wörtern zusammengefügt sind, sollten Sie **mit Unterstrich**  getrennt werden.   * Falls Sie aus mehreren Wörtern zusammengefügt sind, sollten Sie **mit Unterstrich**  getrennt werden.
-<code c>+<sxh c; first-line: 1>
 enum tage {MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG};  enum tage {MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG}; 
  
 for (enum tage aktuellerTag = MONTAG; aktuellerTag <= SONNTAG; aktuellerTag++) for (enum tage aktuellerTag = MONTAG; aktuellerTag <= SONNTAG; aktuellerTag++)
-{...};</code>+{...};</sxh>
  
 ++++Beispiel für Konstanten| ++++Beispiel für Konstanten|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+{{tablelayout?tableSort=1&tableSearch=1}} 
 +|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 // Konstanten // Konstanten
  
Line 172: Line 173:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 // Konstanten // Konstanten
  
Line 193: Line 194:
 ... ...
  
-</code      |+</sxh     |
  
 ++++ ++++
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**  direkt angefügt, aber groß geschrieben. Dies wird auch als "BinnenMajuskel" oder "camelCase" bezeichnet.   * Falls Sie aus mehreren Wörtern zusammengefügt sind, so werden die folgenden Wörter **ohne Unterstrich**  direkt angefügt, aber groß geschrieben. Dies wird auch als "BinnenMajuskel" oder "camelCase" bezeichnet.
-  * Vermeiden Sie zu allgemeine Namen, wie anzahl, uebergabewert oder string. Sinnvoller sind Namen, wie anzahlBuchstaben, stunden, ausgabeString. Durch die Autovervollständigung (Vorschläge unter dem eingegebenen Text) sind auch längere Namen schnell einzugeben, bzw mit Cursortasten und TAB auswählbar.+  * Vermeiden Sie zu allgemeine Namen, wie anzahl, uebergabewert oder string. Sinnvoller sind Namen, wie ''anzahlBuchstaben''''stunden''''ausgabeString''. Durch die Autovervollständigung (Vorschläge unter dem eingegebenen Text) sind auch längere Namen schnell einzugeben, bzwmit Cursortasten und TAB auswählbar.
   * 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. ''int a;''
-  * 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 ''bool a=1;''.
 ++++Beispiel für Variablen| ++++Beispiel für Variablen|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 // Variablen // Variablen
  
Line 220: Line 221:
 char    wasKopie2;         // unklar,Was was ist char    wasKopie2;         // unklar,Was was ist
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 // Variablen // Variablen
  
-const int       maxAnzSpieler   = 2;    // Maximale Anzahl der Spieler +const uint8_t   maxAnzSpieler   = 2;    // Maximale Anzahl der Spieler 
-uint8_t         gemesseneLaenge = 0;    // gemessene Länge in Meter +uint16_t        gemesseneLaenge = 0;    // gemessene Länge in Meter 
-unsigned char   gemesseneBreite = 0;    // gemessene Breite in Meter+uint8_t         gemesseneBreite = 0;    // gemessene Breite in Meter
 bool            zeichenAusgabe  = 1;    // Wahrheitswert zur Anzeige, ob bool            zeichenAusgabe  = 1;    // Wahrheitswert zur Anzeige, ob
                                         // ein Zeichen ausgegeben werden darf                                         // ein Zeichen ausgegeben werden darf
-</code      |+</sxh     |
  
 ++++ ++++
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. ''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 include't). 
-  * Nutzen Sie den Zeileneinschub den AtmelStudio automatisch anbietet. +  * Nutzen Sie den Zeileneinschub den Microchip Studio automatisch anbietet. 
-  * 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. ''if (isI2cMessageNotSent()) sentI2cMessage()''+  * 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. ''if (isI2cMessageNotSent()) sentI2cMessage()''
   * Vermeiden Sie zu viele Leerzeilen.   * Vermeiden Sie zu viele Leerzeilen.
   * Stellen Sie auch jeder Funktion eine kurze Beschreibung voran. Aus dieser sollte hervorgehen, was Sinn und Zweck der Funktion ist.   * Stellen Sie auch jeder Funktion eine kurze Beschreibung voran. Aus dieser sollte hervorgehen, was Sinn und Zweck der Funktion ist.
 ++++Beispiel für Anweisungsblöcke| ++++Beispiel für Anweisungsblöcke|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 uint8_t unter2_neu(uint8_t Was) uint8_t unter2_neu(uint8_t Was)
 { {
Line 259: Line 260:
 return 0; return 0;
 } }
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 uint8_t schluesselPositionFinden(uint8_t schluessel) uint8_t schluesselPositionFinden(uint8_t schluessel)
 /*    Das Array schluesselArray wird nach dem übergebenen Schlüssel durchsucht. /*    Das Array schluesselArray wird nach dem übergebenen Schlüssel durchsucht.
Line 267: Line 268:
 */ */
 { {
-    for( int aktuelleSchluesselPosition=ERSTE_SCHLUESSEL_POSITION; a<=LETZTE_SCHLUESSEL_POSITION; aktuelleSchluesselPosition++)+    for( uint8_t aktuelleSchluesselPosition=ERSTE_SCHLUESSEL_POSITION; a<=LETZTE_SCHLUESSEL_POSITION; aktuelleSchluesselPosition++)
     {                        // 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;
 } }
-</code      In diesem Beispiel wäre der Funktionsname schluesselPosition statt schluesselPositionFinden auch geeignet gewesen.  \\ Weiterhin bietet es sich an hier auch einen Zeiger auf das Array und die Werte für erste und letzte Position als Parameter der Funktion zu übergeben, um diese flexibler anwenden zu können.  |+</sxh     In diesem Beispiel wäre der Funktionsname ''SchluesselPosition'' statt ''schluesselPositionFinden'' auch geeignet gewesen.  \\ Weiterhin bietet es sich an hier auch einen Zeiger auf das Array und die Werte für erste und letzte Position als Parameter der Funktion zu übergeben, um diese flexibler anwenden zu können.  |
  
 ++++ ++++
Line 284: Line 285:
 ++++Beispiel für Arrays, Schleifen und Abfragen| ++++Beispiel für Arrays, Schleifen und Abfragen|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 #define MAX 10 #define MAX 10
  
Line 295: Line 296:
     };                            };                       
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 #define MAX 10 #define MAX 10
  
Line 307: Line 308:
     };                            };                       
  
-</code   |+</sxh  |
  
 ++++ ++++
Line 318: Line 319:
 ++++Beispiel für ähnliche Zeilen| ++++Beispiel für ähnliche Zeilen|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     temp = hunderter;     temp = hunderter;
Line 333: Line 334:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 #define ASCII_ZERO 0x30  #define ASCII_ZERO 0x30 
 #define MOD_TEN 10 #define MOD_TEN 10
Line 355: Line 356:
     printDecimalDigit(DISP_LINE1, DISP_POS2, einer);     printDecimalDigit(DISP_LINE1, DISP_POS2, einer);
 ... ...
-</code      |+</sxh     |
  
 ++++ ++++
Line 364: Line 365:
 ++++Beispiel für Verzweigungen 1 - Umwandlung in Array | ++++Beispiel für Verzweigungen 1 - Umwandlung in Array |
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     if (i==0) output("null");    // wenn 0 dann null     if (i==0) output("null");    // wenn 0 dann null
Line 374: Line 375:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 #define MAX_ANZ_AUSGABE 6 #define MAX_ANZ_AUSGABE 6
 #define MAX_ZEICHEN_AUSGABE 4 #define MAX_ZEICHEN_AUSGABE 4
Line 391: Line 392:
     outputToLCD(AusgabeZahl[i]);     outputToLCD(AusgabeZahl[i]);
 ... ...
-</code      |+</sxh     |
  
 ++++++++Beispiel für Verzweigungen 2 - Umwandlung in Switch-Case| ++++++++Beispiel für Verzweigungen 2 - Umwandlung in Switch-Case|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
-    if (i==0) doZero;    // wenn 0 dann null +    if (i==0) doZero();    // wenn 0 dann null 
-    if (i==1) doOne;     // wenn 1 dann eins +    if (i==1) doOne();     // wenn 1 dann eins 
-    if (i==2) doTwo;     // wenn 2 dann zwei +    if (i==2) doTwo();     // wenn 2 dann zwei 
-    if (i==3) doThree;   // wenn 3 dann drei +    if (i==3) doThree();   // wenn 3 dann drei 
-    if (i==4) doFour;    // wenn 4 dann vier +    if (i==4) doFour();    // wenn 4 dann vier 
-    if (i==5) doFive;    // wenn 5 dann fünf+    if (i==5) doFive();    // wenn 5 dann fünf
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 ... ...
     switch(i) {     switch(i) {
-        case 1: doOne;   break;    // könnte alternativ auch +        case 1: doOne();   break;    // könnte alternativ auch 
-        case 2: doTwo;   break;    // über Pointer auf Funktionen +        case 2: doTwo();   break;    // über Pointer auf Funktionen 
-        case 3: doThree; break;    // wie Beispiel 3 gelöst +        case 3: doThree(); break;    // wie Beispiel 3 gelöst 
-        case 4: doFour;  break;    // werden +        case 4: doFour();  break;    // werden 
-        case 5: doFive;  break;+        case 5: doFive();  break;
         default: break;         default: break;
     };     };
 ... ...
-</code      |+</sxh     |
  
 ++++++++Beispiel für Verzweigungen 3 - Optimierung von Switch-Case| ++++++++Beispiel für Verzweigungen 3 - Optimierung von Switch-Case|
  
-|<fc #800000>**OPTIMIERBAR**</fc>| <code c>+|<fc #800000>**OPTIMIERBAR**</fc>| <sxh c; first-line: 1>
 ... ...
     switch(i) {     switch(i) {
-        case 1: doOne;   break;                // - die ersten beiden Cases +        case 1: doOne();   break;                // - die ersten beiden Cases 
-        case 2: doOne;   break;                //   haben die gleichen Konsequenzen +        case 2: doOne();   break;                //   haben die gleichen Konsequenzen 
-        case 3: doThree;doFour;doFive; break;  // - hier werden - je nach Zahl -  +        case 3: doThree();doFour();doFive(); break;  // - hier werden - je nach Zahl -  
-        case 4: doFour;doFive;         break;  //   nach und nach aufeinanderfolgende +        case 4: doFour();doFive()          break;  //   nach und nach aufeinanderfolgende 
-        case 5: doFive;                break;  //   Funktionen aufgerufen +        case 5: doFive()                   break;  //   Funktionen aufgerufen 
-        case 6: doOne;   break;                // - hier haben mehrere Cases +        case 6: doOne();   break;                // - hier haben mehrere Cases 
-        case 7: doOne;   break;                //   haben die gleichen Konsequenzen +        case 7: doOne();   break;                //   haben die gleichen Konsequenzen 
-        case 8: doOne;   break;                //   +        case 8: doOne();   break;                //   
-        case 9: doOne;   break;                //  +        case 9: doOne();   break;                //  
         default: break;         default: break;
     };     };
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**BESSER**</fc>| <code c>+|<fc #008000>**BESSER**</fc>| <sxh c; first-line: 1>
 ... ...
     switch(i) {     switch(i) {
-        case 126...9 : doOne;   break;    // Einzelne Zahlen können mit Komma getrennt und Gruppen mit '...' kombiniert werden +        case 1
-        case 3:            doThree;           // ohne Break werden alle folgenden Befehle bis zum nächsten Break ausgeführt +        case 2:                                 // Einzelne Zahlen können mit case's untereinander ... 
-        case 4:            doFour;             +        case 6 ... 9:      doOne();   break;    // ... und Gruppen mit '...' kombiniert werden 
-        case 5:            doFive; +        case 3:            doThree();           // Ohne Break werden alle folgenden Befehle bis zum nächsten Break ausgeführt 
 +        case 4:            doFour();             
 +        case 5:            doFive()
         default:           break;         default:           break;
     };     };
 ... ...
-</code      |+</sxh     |
  
 ++++++++Beispiel für Verzweigungen 4 - Umwandlung in For-Next| ++++++++Beispiel für Verzweigungen 4 - Umwandlung in For-Next|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     if (( 0<i) && (i<= 7)) j=j+2;     if (( 0<i) && (i<= 7)) j=j+2;
Line 462: Line 465:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 ... ...
-    int maxSteps            = 6; +    uint8_t maxSteps            = 6; 
-    int Grenze[maxSteps+1]  = { 0, 7,12,20,22,60,85}; +    uint8_t Grenze[maxSteps+1]  = { 0, 7,12,20,22,60,85}; 
-    int jSummand[maxSteps]  = { 2, 5, 3,10, 7, 1};+    uint8_t jSummand[maxSteps]  = { 2, 5, 3,10, 7, 1};
  
-    for(int steps; steps<maxSteps+1; steps++) {+    for(uint8_t steps; steps<maxSteps+1; steps++) {
         if( (Grenze[steps] < i) && (i <= Grenze[steps+1]) ) j = j + jSummand[steps];         if( (Grenze[steps] < i) && (i <= Grenze[steps+1]) ) j = j + jSummand[steps];
     };     };
 ... ...
-</code      |+</sxh     |
  
 ++++ ++++
Line 480: Line 483:
 ++++Beispiel für Verzweigungen 4 - Verwenden von Else if| ++++Beispiel für Verzweigungen 4 - Verwenden von Else if|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     if (( 0<i) && (i<= 7)) j=j+2;     if (( 0<i) && (i<= 7)) j=j+2;
     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;
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 ... ...
     if      (( 0<i) && (i<= 7)) { j = j + 2;}     if      (( 0<i) && (i<= 7)) { j = j + 2;}
     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;};
 ... ...
-</code      |+</sxh     |
  
 ++++++++Beispiel für Verzweigungen 5 - Reduzieren der Anweisungen| ++++++++Beispiel für Verzweigungen 5 - Reduzieren der Anweisungen|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     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();
     };     };
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| \\ noch leserlich: \\ <code c>+|<fc #008000>**GUT**</fc>| \\ noch leserlich: \\ <sxh c; first-line: 1>
 ... ...
-    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<i){ +    else if ( 12 < i){ 
-        j=j+3; +        j = j + 3; 
-        DoZero;+        DoZero();
     };     };
-    DoOne;+    DoOne();
 ... ...
-</code       auch möglich, aber etwas schwerer leserlich:  <code c>+</sxh      auch möglich, aber etwas schwerer leserlich:  <sxh c; first-line: 1>
 ... ...
-    if           (i<=7)              j=j+2; +    if           ( i <= 7)                j = j + 2; 
-    else{if     (( 7<i) && (i<=12))  j=j+5; +    else{if     (( 7 <  i) && (i <= 12))  j = j + 5; 
-        else if  (12<i)              j=j+3; +        else if  (12 <  i)                j = j + 3; 
-        DoZero;+        DoZero();
     };     };
-    DoOne;+    DoOne();
 ... ...
-</code    |+</sxh   |
  
 ++++ ++++
Line 556: Line 559:
 ++++Beispiel für Schleifen 1 - main()| ++++Beispiel für Schleifen 1 - main()|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 void main() void main()
 { {
     initAll;     initAll;
     while(1){            // es wäre auch for(;;){} möglich     while(1){            // es wäre auch for(;;){} möglich
-        Eingabe; +        Eingabe()
-        Verarbeitung; +        Verarbeitung()
-        if (CancelButton==1) main; +        if (CancelButton==1) main()
-        Ausgabe;+        Ausgabe();
     }     }
 } }
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
 void main() void main()
 { {
-    initOneTimeFunctions;+    initOneTimeFunctions();
  
     while(1){                        // äußere Endlos-Schleife     while(1){                        // äußere Endlos-Schleife
-        initOtherFunctions;+        initOtherFunctions();
         CancelButton = 0;         CancelButton = 0;
         while(!CancelButton){        // innere Schleife mit Abbruchbedingung         while(!CancelButton){        // innere Schleife mit Abbruchbedingung
-            Eingabe; +            Eingabe()
-            Verarbeitung; +            Verarbeitung()
-            if (!CancelButton) Ausgabe;+            if (!CancelButton) Ausgabe();
         };         };
     }     }
 } }
  
-</code      |+</sxh     |
  
 ++++++++Beispiel für Schleifen 2 - Abbrechen von verschachtelten Schleifen| ++++++++Beispiel für Schleifen 2 - Abbrechen von verschachtelten Schleifen|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c> +|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1
-    for(int xpos=0;xpos<10;xpos++){ +    for(uint8_t xpos=0;xpos<10;xpos++){ 
-        initYPos;+        initYPos();
         for(int ypos=0;ypos<20;ypos++){         for(int ypos=0;ypos<20;ypos++){
-            Eingabe; +            Eingabe()
-            Verarbeitung;+            Verarbeitung();
             if (CancelButton) goto Abbruch;             if (CancelButton) goto Abbruch;
         };         };
Line 601: Line 604:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c> +|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1
-    int xposMax=10, yposMax=20;+    uint8_t xposMax=10, yposMax=20;
  
-    for(int xpos=0 ; xpos<xposMax ; xpos++){ +    for(uint8_t xpos=0 ; xpos<xposMax ; xpos++){ 
-        initYPos; +        initYPos()
-        for(int ypos=0 ; ypos<yposMax ; ypos++){ +        for(uint8_t ypos=0 ; ypos<yposMax ; ypos++){ 
-            Eingabe; +            Eingabe()
-            Verarbeitung;+            Verarbeitung();
             if (CancelButton) break;    // bricht nur die ypos-Schleife ab!             if (CancelButton) break;    // bricht nur die ypos-Schleife ab!
         };         };
Line 617: Line 620:
 ... ...
  
-</code      **Beachten Sie, dass in diesem Fall CancelButton eine Variable sein muss und sich zwischen den beiden if-Bedingungen nicht ändern darf (z.B. durch Interrupts).**     |+</sxh     **Beachten Sie, dass in diesem Fall CancelButton eine Variable sein muss und sich zwischen den beiden if-Bedingungen nicht ändern darf (z.B. durch Interrupts).**     |
  
 ++++ ++++
  
-  * _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 werdentakt10ms, takt100ms, takt1s. Diese können dann im main() Verzweigungen in einer Zustandsmaschine auslösen.+  * _delay_ms() und _delay_us() sind zu 99% nicht notwendig. Verwenden Sie stattdessen Interrupts, bzw. Timer. \\ Es sollten durch Interrupts Takte angelegt werden, z.B. takt10ms, takt100ms, takt1s welche nur im ''main()'' abgefragt werden.  
 +  * Häufig bietet es sich an, in den Takten dann auch Verzweigungen in einer Zustandsmaschine aufzubauen (z.B. mit Zustandsvariablen wie ''outputState'': ''<nowiki>switch(outputState) {case initOutput: outputState++; ... break; case startOutput: outputState++; ... break; }</nowiki>'').
   * Wenn Sie Zahlen in Variablen speichern und diese auch mathematisch weiterverwenden, so wandeln Sie diese Variable erst bei der Ausgabe in das ASCII-Format um.   * Wenn Sie Zahlen in Variablen speichern und diese auch mathematisch weiterverwenden, so wandeln Sie diese Variable erst bei der Ausgabe in das ASCII-Format um.
 ++++Beispiel für Variablen mit Ausgabe| ++++Beispiel für Variablen mit Ausgabe|
  
-|<fc #800000>**SCHLECHT**</fc>| <code c>+|<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 ... ...
     Zahlenwert = (ADC_Wert/10)%10 + 0x30;     Zahlenwert = (ADC_Wert/10)%10 + 0x30;
Line 633: Line 637:
 ... ...
  
-</code      +</sxh     
-|<fc #008000>**GUT**</fc>| <code c>+|<fc #008000>**GUT**</fc>| <sxh c; first-line: 1>
  
 #define ASCII_ZERO 0x30  #define ASCII_ZERO 0x30 
Line 643: Line 647:
     Laengen[i] = Laenge;     Laengen[i] = Laenge;
     Flaeche    = Laenge * Breite;     Flaeche    = Laenge * Breite;
-    LCD_putc(Laengen[i]+ ASCII_ZERO);+    LCD_putc(Laengen[i] + ASCII_ZERO);
 ... ...
-</code  |+</sxh |
  
 ++++ ++++
Line 651: Line 655:
 ====== Bewertung ====== ====== Bewertung ======
  
-Zur Bewertung lege ich {{checkliste_250520.pdf|diese Checkliste}}  ({{checkliste_250520.xlsx|xls-File}} als Maßstab an.+Zur Bewertung lege ich {{microcontrollertechnik:bewertung_ss24_prj99.xlsx|diese Checkliste (xls-File)}} als Maßstab an.