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 [2022/02/26 02:49] tfischermicrocontrollertechnik:vorgaben_fuer_die_softwareentwicklung [2024/09/24 13:51] (current) mexleadmin
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 156: Line 156:
 ++++Beispiel für Konstanten| ++++Beispiel für Konstanten|
  
 +{{tablelayout?tableSort=1&tableSearch=1}}
 |<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1> |<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1>
 // 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**  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|
  
Line 224: Line 225:
 // 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
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;
 } }
-</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.  |+</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 397: Line 398:
 |<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1> |<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
 ... ...
  
Line 409: Line 410:
 ... ...
     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;
     };     };
Line 424: Line 425:
 ... ...
     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;
     };     };
Line 441: Line 442:
 ... ...
     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;
     };     };
Line 465: Line 468:
 |<fc #008000>**GUT**</fc>| <sxh c; first-line: 1> |<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];
     };     };
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 #008000>**GUT**</fc>| \\ noch leserlich: \\ <sxh c; first-line: 1> |<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();
 ... ...
 </sxh>       auch möglich, aber etwas schwerer leserlich:  <sxh c; first-line: 1> </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();
 ... ...
 </sxh>    | </sxh>    |
Line 561: Line 564:
     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();
     }     }
 } }
Line 572: Line 575:
 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();
         };         };
     }     }
Line 590: Line 593:
  
 |<fc #800000>**SCHLECHT**</fc>| <sxh c; first-line: 1> |<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 603: Line 606:
 </sxh>      | </sxh>      |
 |<fc #008000>**GUT**</fc>| <sxh c; first-line: 1> |<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 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 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|
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);
 ... ...
 </sxh>  | </sxh>  |
Line 651: Line 655:
 ====== Bewertung ====== ====== Bewertung ======
  
-Zur Bewertung lege ich {{microcontrollertechnik:bewertung_ws21_prjxx.xlsx|diese Checkliste (xls-File)}} als Maßstab an.+Zur Bewertung lege ich {{microcontrollertechnik:bewertung_ss24_prj99.xlsx|diese Checkliste (xls-File)}} als Maßstab an.