Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
microcontrollertechnik:10_spi_schnittstelle [2023/11/13 23:57]
mexleadmin
microcontrollertechnik:10_spi_schnittstelle [2024/01/22 13:47] (aktuell)
mexleadmin
Zeile 1: Zeile 1:
-====== 11 SPI Schnittstelle  ======+====== 10 SPI Schnittstelle  ======
 <WRAP group>  <WRAP group> 
 <WRAP half column> <WRAP half column>
Zeile 59: Zeile 59:
  
 <-- <--
---> III. Eingabe in Atmel Studio #+--> III. Eingabe in Microchip Studio #
 <WRAP group><WRAP column 40%> <WRAP group><WRAP column 40%>
 <sxh c; first-line: 1> <sxh c; first-line: 1>
Zeile 77: Zeile 77:
 Hardware:       Simulide  Hardware:       Simulide 
    
-Software:       Atmel Studio Ver. 7.xx              +Software:       Microchip Studio Ver. 7.xx              
    
 Funktion:       Digitaluhr mit Anzeige von Stunden, Minuten und Sekunden. Eine Funktion:       Digitaluhr mit Anzeige von Stunden, Minuten und Sekunden. Eine
Zeile 128: Zeile 128:
    
 #ifndef F_CPU // optional definieren #ifndef F_CPU // optional definieren
-#define F_CPU 12288000UL                // MiniMEXLE mit 6,144 MHz Quarz    +#define F_CPU 12288000UL                // MiniMEXLE mit 12,288 MHz Quarz    
 #endif                               #endif                              
    
Zeile 165: Zeile 165:
 #define NO 0 // Deactive Wert #define NO 0 // Deactive Wert
 #define YES 1 // Active Wert #define YES 1 // Active Wert
 +#define PRESSED 0 // Button gedrückt
 +#define UNPRESSED 1 // Button nicht gedrückt
  
 #define HOURS_MAX 24 // max Wert der Stunden #define HOURS_MAX 24 // max Wert der Stunden
Zeile 176: Zeile 178:
 // Variable // Variable
    
-unsigned char softwarePrescaler = PRESCALER_VAL;    // Zaehlvariable Vorteiler+unsigned char softwarePrescaler = PRESCALER_VAL;    // Zaehlvariable fuer den Software-Vorteiler
 unsigned char cycle10msCount = CYCLE10MS_MAX; // Zaehlvariable Hundertstel unsigned char cycle10msCount = CYCLE10MS_MAX; // Zaehlvariable Hundertstel
 unsigned char cycle100msCount   = CYCLE100MS_MAX;   // Zaehlvariable Zehntel unsigned char cycle100msCount   = CYCLE100MS_MAX;   // Zaehlvariable Zehntel
Zeile 212: Zeile 214:
 void refreshTime(void);                 // Uhrfunktion void refreshTime(void);                 // Uhrfunktion
 void initDisplay(void);                 // Init Anzeige void initDisplay(void);                 // Init Anzeige
-void showTenthOfASecond(void);// +void showTenthOfASecond(void); // Anzeige der Zehntelsenkunde auf separatem Display
    
 // Hauptprogramm ============================================================== // Hauptprogramm ==============================================================
Zeile 276: Zeile 278:
     werden von Timer 0 ausgeloest (Interrupt Nr. 1)     werden von Timer 0 ausgeloest (Interrupt Nr. 1)
    
-    Veraenderte Variable: vorteiler +    Veraenderte Variable: softwarePrescaler 
-                          hunderstel +                          cycle10msCount 
-                          zehntel+                          cycle100msCount
    
-    Ausgangsvariable:     takt10ms +    Ausgangsvariable:     cycle10msActive 
-                          takt100ms +                          cycle100msActive 
-                          takt1s+                          cycle1sActive
 */ */
    
Zeile 327: Zeile 329:
     Mit der Taste S4 wird die Uebergabe der Zeit Master < Slave gestartet     Mit der Taste S4 wird die Uebergabe der Zeit Master < Slave gestartet
    
-    Veraenderte Variable: stunden +    Veraenderte Variable: hours 
-                          minuten +                          minutes 
-                          sekunden +                          seconds 
-  +                            
-    Speicher fuer Bits:   sw1Alt +    Speicher fuer Bits:   button1_old 
-                          sw2Alt +                          button2_old 
-                          sw3Alt +                          button3_old 
-                          sw4Alt+                          button4_old
 */ */
    
Zeile 343: Zeile 345:
     button4_new = GET_BIT(PINC, PC3);     button4_new = GET_BIT(PINC, PC3);
    
-    if ((button1_new==0)) // wenn Taste 1 gedrueckt ist:+    if (button1_new==PRESSED) // wenn Taste 1 gedrueckt ist:
     {     {
         PcdSendMessage = YES; //    Senden der SPI-Nachricht aktivieren         PcdSendMessage = YES; //    Senden der SPI-Nachricht aktivieren
     }     }
            
-    if ((button2_new==0)&(button2_old==1))  // wenn Taste 2 eben gedrueckt wurde:+    if ( (button2_new==PRESSED) 
 + &(button2_old==UNPRESSED)) // wenn Taste 2 eben gedrueckt wurde:
     {     {
         hours++; //    Stunden hochzaehlen, Ueberlauf bei 23         hours++; //    Stunden hochzaehlen, Ueberlauf bei 23
Zeile 354: Zeile 357:
             hours = 00;             hours = 00;
     }     }
-    if ((button3_new==0)&(button3_old==1))  // wenn Taste 3 eben gedrueckt wurde:+    if ( (button3_new==PRESSED) 
 + &(button3_old==UNPRESSED)) // wenn Taste 3 eben gedrueckt wurde:
     {     {
         minutes++; //    Minuten hochzaehlen, Ueberlauf bei 59         minutes++; //    Minuten hochzaehlen, Ueberlauf bei 59
Zeile 360: Zeile 364:
             minutes = 00;             minutes = 00;
     }     }
-    if (button3_new==0                    // solange Taste 3 gedrueckt: +    if (button3_new==PRESSED              // solange Taste 3 gedrueckt: 
- seconds = 00; //    Sekunden auf 00 setzen+ seconds = 00; //    Sekunden auf 00 setzen
    
     if ((button4_new==0)&(button4_old==1))  // wenn Taste 3 eben gedrueckt wurde:     if ((button4_new==0)&(button4_old==1))  // wenn Taste 3 eben gedrueckt wurde:
Zeile 452: Zeile 456:
     die Minuten, die Ueberlaeufe der Minuten die Stunden hoch.     die Minuten, die Ueberlaeufe der Minuten die Stunden hoch.
    
-    Veraenderte Variable:   sekunden +    Veraenderte Variable:   seconds 
-                            minuten +                            minutes 
-                            stunden+                            hours
 */ */
    
Zeile 494: Zeile 498:
   - Die Konstanten entsprechen im Wesentlichen denen der letzten Programme. Der Vorteiler Wert entspricht aber hier der Hälfte des bisherigen Wertes, da die Taktfrequenz ebenso halb so groß ist.  \\ \\ \\ \\ \\ \\ \\ \\   - Die Konstanten entsprechen im Wesentlichen denen der letzten Programme. Der Vorteiler Wert entspricht aber hier der Hälfte des bisherigen Wertes, da die Taktfrequenz ebenso halb so groß ist.  \\ \\ \\ \\ \\ \\ \\ \\
   - Für die Zeichen ''0'' und '':'' werden für die ASCII-Codes Makros definiert. Dadurch wird das Lesen des am Display ausgegebenen Textes im Code einfacher. \\ \\   - Für die Zeichen ''0'' und '':'' werden für die ASCII-Codes Makros definiert. Dadurch wird das Lesen des am Display ausgegebenen Textes im Code einfacher. \\ \\
-  - Für die anschaulichere Überprüfung von Bitwerten wird "YES" und "NO" definiert \\ \\ +  - Für die anschaulichere Beschreibung von Bitwerten wird "YES""NO", sowie "PRESSED" und "UNPRESSED" definiert \\ \\ \\ \\
   - Die Grenzen der Zeitgrößen sind hier ebenso definiert. \\ \\ \\     - Die Grenzen der Zeitgrößen sind hier ebenso definiert. \\ \\ \\  
   - Bei den Variablen entsprechen einige denen der letzten Programme. \\ \\ \\ \\ \\     - Bei den Variablen entsprechen einige denen der letzten Programme. \\ \\ \\ \\ \\  
-  - Bei den Variablen entsprechen einige denen der letzten Programme. \\ \\ \\ \\ \\  +  - Bei den Variablen entsprechen einige denen der letzten Programme. \\ \\ \\ 
   - Für die Uhr werden Stunden, Minuten, Sekunden und Zehntelsekunden mit Anfangswerten deklariert. \\ \\ \\   - Für die Uhr werden Stunden, Minuten, Sekunden und Zehntelsekunden mit Anfangswerten deklariert. \\ \\ \\
   - Für das neue Display werden Variablen für die Textposition und für das auszugebenden Zeichen deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\   - Für das neue Display werden Variablen für die Textposition und für das auszugebenden Zeichen deklariert. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
   - Das Flag PcdSendMessage zeigt an, ob Zeichen regelmäßig zu übertragen sind.  \\ \\ \\   - Das Flag PcdSendMessage zeigt an, ob Zeichen regelmäßig zu übertragen sind.  \\ \\ \\
-  - Bei den Funktionsprototypen sind einige bekannte Unterprogramme vorhanden. Details werden weiter unten erklärt. \\ \\ \\ \\ \\ +  - Bei den Funktionsprototypen sind einige bekannte Unterprogramme vorhanden. Details werden weiter unten erklärt. \\ \\ \\ \\ 
  
 ''Hauptprogramm ========================='' ''Hauptprogramm =========================''
-\\ \\+\\ \\ \\ \\
   - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten)   - Zunächst werden zwei Initialisierungsroutinen aufgerufen (siehe weiter unten)
   - Dann werden wieder "__T__imer/__C__ounter __C__ontrol __R__egister" und "__T__imer __I__nterrupt __M__a__SK__" konfiguriert.   - Dann werden wieder "__T__imer/__C__ounter __C__ontrol __R__egister" und "__T__imer __I__nterrupt __M__a__SK__" konfiguriert.
Zeile 511: Zeile 515:
   - Mit dem Befehl ''sei()'' wird die Bearbeitung von Interrupts aktiv. \\ \\ \\   - Mit dem Befehl ''sei()'' wird die Bearbeitung von Interrupts aktiv. \\ \\ \\
   - In der Endlosschleife sind verschiedene Zeitzyklen vorgesehen (wie beim [[4_up_down_counter|Up/Down Counter]]). \\ \\   - In der Endlosschleife sind verschiedene Zeitzyklen vorgesehen (wie beim [[4_up_down_counter|Up/Down Counter]]). \\ \\
-    - im $10~\rm ms$ Raster (auch $10~\rm ms$ Zyklus genannt) wird die Unterfunktion ''setTime()'' zum (möglichen) Ändern der Uhrzeit aufgerufen. \\ \\ \\ \\ +    - im $10~\rm ms$ Raster (auch $10~\rm ms$ Zyklus genannt) wird die Unterfunktion ''setTime()'' zum (möglichen) Ändern der Uhrzeit aufgerufen. \\ \\ \\ \\ \\ \\ 
-    - im $100~\rm ms$ Raster werden die Unterfunktionen ''showTime()'' für die Anzeige und ''refreshTime()'' zum Weiterzählen aufgerufen. Davor wird, falls das Flag ''PcdSendMessage'' gesetzt ist, wird dieses zurückgesetzt, die LED blinkt und das Unterprogramm ''showTenthOfASecond()'' wird aufgerufen. \\ \\ \\ \\ \\ \\+    - im $100~\rm ms$ Raster werden die Unterfunktionen ''showTime()'' für die Anzeige und ''refreshTime()'' zum Weiterzählen aufgerufen. Davor wird, falls das Flag ''PcdSendMessage'' gesetzt ist, wird dieses zurückgesetzt, die LED blinkt und das Unterprogramm ''showTenthOfASecond()'' wird aufgerufen. \\ \\ \\ \\ \\ \\ \\
     - im $1~\rm s$ Raster blinkt die LED und das Unterprogramm ''pcd_init'' zum initialisieren des PCD Displays wird aufgerufen. \\ \\ \\ \\ \\ \\ \\      - im $1~\rm s$ Raster blinkt die LED und das Unterprogramm ''pcd_init'' zum initialisieren des PCD Displays wird aufgerufen. \\ \\ \\ \\ \\ \\ \\ 
  
 ''Interrupt Routine ========================='' ''Interrupt Routine =========================''
   - Mit dem Befehl ''ISR()'' wird wieder die Interrupt Service Routine für den  __OV__er__F__low Interrupt des __TIMER0__ angelegt. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\    - Mit dem Befehl ''ISR()'' wird wieder die Interrupt Service Routine für den  __OV__er__F__low Interrupt des __TIMER0__ angelegt. \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ 
-  - Die Ermittlung von ''timertick'', ''softwarePrescaler'', ''cycle10msActive'', ''cycle10msCount'' und ''cycle100msActive'' ist hier wieder gleich dem im [[4_up_down_counter|Up/Down Counter]].  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\  +  - Die Ermittlung von ''timertick'', ''softwarePrescaler'', ''cycle10msActive'', ''cycle10msCount'' und ''cycle100msActive'' ist hier wieder gleich dem im [[4_up_down_counter|Up/Down Counter]].  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\  
-  - Eine Erweiterung auf ''cycle100msCount'' und ''cycle1sActive'' wurde hier mit eingefügt. \\ \\ \\ \\ \\ +  - Eine Erweiterung auf ''cycle100msCount'' und ''cycle1sActive'' wurde hier mit eingefügt. \\ \\ \\ \\ 
 '' Funktion Tasten einlesen =============='' '' Funktion Tasten einlesen ==============''
 \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ 
Zeile 524: Zeile 528:
   - Die Flankenerkennung in den if-Bedingungen wurde auch bereits beim [[4_up_down_counter|Up/down Counter]] erklärt.    - Die Flankenerkennung in den if-Bedingungen wurde auch bereits beim [[4_up_down_counter|Up/down Counter]] erklärt. 
   - Wenn die Taste ''S1'' gedrückt ist, so wird das Flag ''PcdSendMessage'' gesetzt, welches in ''main'' zum Aufrufen des Unterprogramm ''showTenthOfASecond'' in jedem $100~\rm ms$ Raster führt.  \\ \\ \\    - Wenn die Taste ''S1'' gedrückt ist, so wird das Flag ''PcdSendMessage'' gesetzt, welches in ''main'' zum Aufrufen des Unterprogramm ''showTenthOfASecond'' in jedem $100~\rm ms$ Raster führt.  \\ \\ \\ 
-  - Die Tasten ''S2'' und ''S3'' führen zum einmaligem Hochzählen der Stunden bzw. Minuten. Wenn der jeweilige Wert über das Maximum hinausläuft, so beginnt dieser wieder beim Minimum.  \\ \\ \\ \\ \\ \\ \\ \\ +  - Die Tasten ''S2'' und ''S3'' führen zum einmaligem Hochzählen der Stunden bzw. Minuten. Wenn der jeweilige Wert über das Maximum hinausläuft, so beginnt dieser wieder beim Minimum.  \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ 
-  -  Die Taste ''S4'' zeichnet eine Linie mittels ''pcd_putLine'' und aktualisiert das Displays des PCD8544 \\ \\ \\ \\ \\ \\ \\ \\+  -  Die Taste ''S4'' zeichnet eine Linie mittels ''pcd_putLine'' und aktualisiert das Displays des PCD8544 \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
  
 ''Anzeigefunktion Uhr ========================='' ''Anzeigefunktion Uhr =========================''
Zeile 536: Zeile 540:
   - Die Anzeige von Minuten und Sekunden erfolgt analog.   - Die Anzeige von Minuten und Sekunden erfolgt analog.
  
-\\ \\ \\ \\ +\\ \\ \\ \\ \\
  
 ''Anzeigefunktion fuer PCD Display ========================='' ''Anzeigefunktion fuer PCD Display =========================''
Zeile 562: Zeile 566:
 <-- <--
 --> IV. Ausführung in Simulide # --> IV. Ausführung in Simulide #
-  - Legen Sie in Atmel Studio ein neues Projekt an.+  - Legen Sie in Microchip Studio ein neues Projekt an.
   - Fügen Sie in dieses die *.c und *.h Files aus dem File ''pcd8544.zip'' hinzu. \\ Dazu ist zunächst das zip-File zu entpacken und die Files dann als ''Existing Item'' hinzuzufügen - wie in [[2_sound_und_timer]] beschrieben.   - Fügen Sie in dieses die *.c und *.h Files aus dem File ''pcd8544.zip'' hinzu. \\ Dazu ist zunächst das zip-File zu entpacken und die Files dann als ''Existing Item'' hinzuzufügen - wie in [[2_sound_und_timer]] beschrieben.
   - Geben Sie die oben dargestellten Codezeilen in ''main.c'' ein und kompilieren Sie den Code.   - Geben Sie die oben dargestellten Codezeilen in ''main.c'' ein und kompilieren Sie den Code.
Zeile 586: Zeile 590:
     - Um den Signalverlauf besser zu sehen, kann mit einem Klick auf ''Expand'' das Oszilloskop separiert und größer dargestellt werden \\ {{microcontrollertechnik:simulide_beispiel_anzeige_oszigross.jpg}}     - Um den Signalverlauf besser zu sehen, kann mit einem Klick auf ''Expand'' das Oszilloskop separiert und größer dargestellt werden \\ {{microcontrollertechnik:simulide_beispiel_anzeige_oszigross.jpg}}
     - Das im Bild dargestellte Signal ist ''00100111'' also ''0x27'' oder dezimal 39.     - Das im Bild dargestellte Signal ist ''00100111'' also ''0x27'' oder dezimal 39.
-  - Analyse der Dateien in ''pcd8544.zip'' in Atmel Studio +  - Analyse der Dateien in ''pcd8544.zip'' in Microchip Studio 
     - In der Datei ''characterset5x8.c'' ist der Zeichensatz für das Display zu finden. Warum ist dieser um 90° gedreht?     - In der Datei ''characterset5x8.c'' ist der Zeichensatz für das Display zu finden. Warum ist dieser um 90° gedreht?
     - In der Datei ''pcd8544.c'' ist die eigentliche Bibliothek für die Kommunikation zum Display zu finden.     - In der Datei ''pcd8544.c'' ist die eigentliche Bibliothek für die Kommunikation zum Display zu finden.
Zeile 605: Zeile 609:
  
   * Diese [[http://www.falstad.com/circuit/circuitjs.html?running=false&ctz=CQAgzCCMCmC0AcIAMA6SAmMkBsnsBZN8B2JfATmJAFYkaR8Jq5JIAoAGQaUXXjvw9wGEOiggAZgEMANgGdo9JJwaDR-VXSxixdafMXVkK2vnV1TwnckmyFSlSR0anV0eP32jyrtiR0+Oj8tETFIWwMHXzBnIJi3XQivYy5qbF4NNMRtd3DPQxSaMGxzIpKcsKSC5QBZbkQ0+qgSnRRqNjr8NUauuhx3dDaOmjIaEst+1vbO4jEe2eaBobrgsZBVydFl9fjG7HjNwemxhvH0xanh6mK165LDoYAlUUawch10MzfKsP8--y2RiONlQ7QA7uBRhgtKNBIhlBCwMQWv0wF1RP0EeB0ehUeiwDcsWivjdIEjyoS2BDsAQMfceLxMVTIWY4VA-k0sWTkXSoOTwJSIZAORhEMKAWyfOAeZBqGIwHKoIrKvkouz4GL4GZhbTIFr3Ho7NU2AAjEDwUi5LoQLq6NgAD3WxCMCBAxHwiFgRjMnxANSkcgALtAAE4O83wF2Icj4F3e0RmADKMikADdoOHkeQMXR4GAAmSGAm-QB5RMASUz2GzMUQea0WCLvpq5cTJarJUEudl3BtxcTAGEANJsWV9EXocdqaHiRLgkDkRWsMTEETLwqrsIidJi0I2VXeTOWnXmpC-bM+pOJ0cal7ld7qbIPm1hRhIfNk6g+9iO4iW+AruQJSRk2ZgAPpgWw5YLkua4iiIdCgjQzLCtOk7qmK6FElC6H8jOyhmpAzo2O6iC9MYKDmgAQgAloGiYABY0RIgaPNAADmNFBqGADqHAAPZSAAJgAIjRIY2IgKIgAOHBDkW4RiCJ5bPDW7gcCWACCIn0NYFYAHJuk2IBtgAqgAKtKRYQAAGloZhUOENnhPm6ziDZOjjO5EDoGI2ogDZ2rZO5RibE59LiE5VAlH0IAAJohEZdBxYp0U2HFOhMOlECQBe6XalQEDJaFinpcB4jJVQiR0CJABiMg0QADvV-GNQAojIAC2AA6ciQL16C9WAvX4N1IYCZxADGJYAK6Bo1c0dT1cjYGNE00dNc0LYGS0DWNNQzTIgZNTI0D2qGu1yMQvWrXI8A3b11C9eQvX9SGB1HSdZ0XV1e19Ugr39f9j3Pa9g3jfxU2zfNi2-Xda2Qxt0PbZdwpjXVDXNTIrWo4N8N9cNcijSGGNNS17Vw5Ao19UDsojQjUNbbDy04AzSNMztlNvR9x2Nad50hpd919bdRGvbdT1yC9fXEzzX0C6jtPC7lr3C5L0uTmzm0w5zLPXRDjM66j90k-VZPYxTy2a3111yLi9PvYdvP8z9esDXjmDuyDUsDcT63ayjlMvQb7NG3Dvno2bWM4+H1Mq3bkuy078uu69Gu3egtvoBLoN2yb-vI8zA3DSHAdF3bq2m5j5OXXwxcDdLSefXz32C+HhP5kNQOd3I6tDeDBcc7X+uD2Hy2d1X5sx+PHu2wSDtyy3Cvh3P1Or970sKlrhe61329D3DaKR9XFuXVvchYENt1N87rdn931N4znPsXyPiNl7vF-at1vUA3bP92zaHtAaQC+oALxv1P6g0QGS2gYAyWkC5B-0QX-OBRxgHwNeuArBUDwGgLQaAlBOD-7-xgRg9BYDf7EI9ng2BtDiHIOwaQzBzCKFEMoSQghdCyEcMYbgmBbB8DCmlMBMiHo+T3GonRRizFWIcS4sGEMfFBKiXElAR6ogYGaPgeou2uidBaI9m0XRfQNFGKBFooGYQBraOBOYkx+jbHGPsUDUKNj7EuI0VYpxFidGuMcR4yxv8AkCK4HhfUCowj6kSAeYwQjxy3lvKwPwEjxDwFovRJiLE2KcW4kogSwkxISSBgEQxQS9HeMCX44JJSfF1O8ZUsp1SkEhJ0Z4lpjS2nlNMXoqpwJamdLsd01pRxhgYHEY0cZYoWiAjGYENYoo+gzNGXUMk6JJnEguLM1ZOQNlrmWdsVg+pJl6m1Ac44GB+iTNxPcc5YzZRzHuA8rZKyoAzhOehB47QuBTNKL8io+4jRqkWX8+ZALDSREPD8zZ8y1lfD3HkIFUK+ShA0GSEQALEWQsKEcn0aLTkJA8EinFNzQWoj3BC5IUpWDKnxYqTFVRgUzlhTOBlsTqUMiVL8XUypAXYuUEAA|Falstad-Simulation]] skizziert die Funktionsweise der SPI Schnittstelle (Achtung: Die Simulation beinhaltet noch einige Bugs)   * Diese [[http://www.falstad.com/circuit/circuitjs.html?running=false&ctz=CQAgzCCMCmC0AcIAMA6SAmMkBsnsBZN8B2JfATmJAFYkaR8Jq5JIAoAGQaUXXjvw9wGEOiggAZgEMANgGdo9JJwaDR-VXSxixdafMXVkK2vnV1TwnckmyFSlSR0anV0eP32jyrtiR0+Oj8tETFIWwMHXzBnIJi3XQivYy5qbF4NNMRtd3DPQxSaMGxzIpKcsKSC5QBZbkQ0+qgSnRRqNjr8NUauuhx3dDaOmjIaEst+1vbO4jEe2eaBobrgsZBVydFl9fjG7HjNwemxhvH0xanh6mK165LDoYAlUUawch10MzfKsP8--y2RiONlQ7QA7uBRhgtKNBIhlBCwMQWv0wF1RP0EeB0ehUeiwDcsWivjdIEjyoS2BDsAQMfceLxMVTIWY4VA-k0sWTkXSoOTwJSIZAORhEMKAWyfOAeZBqGIwHKoIrKvkouz4GL4GZhbTIFr3Ho7NU2AAjEDwUi5LoQLq6NgAD3WxCMCBAxHwiFgRjMnxANSkcgALtAAE4O83wF2Icj4F3e0RmADKMikADdoOHkeQMXR4GAAmSGAm-QB5RMASUz2GzMUQea0WCLvpq5cTJarJUEudl3BtxcTAGEANJsWV9EXocdqaHiRLgkDkRWsMTEETLwqrsIidJi0I2VXeTOWnXmpC-bM+pOJ0cal7ld7qbIPm1hRhIfNk6g+9iO4iW+AruQJSRk2ZgAPpgWw5YLkua4iiIdCgjQzLCtOk7qmK6FElC6H8jOyhmpAzo2O6iC9MYKDmgAQgAloGiYABY0RIgaPNAADmNFBqGADqHAAPZSAAJgAIjRIY2IgKIgAOHBDkW4RiCJ5bPDW7gcCWACCIn0NYFYAHJuk2IBtgAqgAKtKRYQAAGloZhUOENnhPm6ziDZOjjO5EDoGI2ogDZ2rZO5RibE59LiE5VAlH0IAAJohEZdBxYp0U2HFOhMOlECQBe6XalQEDJaFinpcB4jJVQiR0CJABiMg0QADvV-GNQAojIAC2AA6ciQL16C9WAvX4N1IYCZxADGJYAK6Bo1c0dT1cjYGNE00dNc0LYGS0DWNNQzTIgZNTI0D2qGu1yMQvWrXI8A3b11C9eQvX9SGB1HSdZ0XV1e19Ugr39f9j3Pa9g3jfxU2zfNi2-Xda2Qxt0PbZdwpjXVDXNTIrWo4N8N9cNcijSGGNNS17Vw5Ao19UDsojQjUNbbDy04AzSNMztlNvR9x2Nad50hpd919bdRGvbdT1yC9fXEzzX0C6jtPC7lr3C5L0uTmzm0w5zLPXRDjM66j90k-VZPYxTy2a3111yLi9PvYdvP8z9esDXjmDuyDUsDcT63ayjlMvQb7NG3Dvno2bWM4+H1Mq3bkuy078uu69Gu3egtvoBLoN2yb-vI8zA3DSHAdF3bq2m5j5OXXwxcDdLSefXz32C+HhP5kNQOd3I6tDeDBcc7X+uD2Hy2d1X5sx+PHu2wSDtyy3Cvh3P1Or970sKlrhe61329D3DaKR9XFuXVvchYENt1N87rdn931N4znPsXyPiNl7vF-at1vUA3bP92zaHtAaQC+oALxv1P6g0QGS2gYAyWkC5B-0QX-OBRxgHwNeuArBUDwGgLQaAlBOD-7-xgRg9BYDf7EI9ng2BtDiHIOwaQzBzCKFEMoSQghdCyEcMYbgmBbB8DCmlMBMiHo+T3GonRRizFWIcS4sGEMfFBKiXElAR6ogYGaPgeou2uidBaI9m0XRfQNFGKBFooGYQBraOBOYkx+jbHGPsUDUKNj7EuI0VYpxFidGuMcR4yxv8AkCK4HhfUCowj6kSAeYwQjxy3lvKwPwEjxDwFovRJiLE2KcW4kogSwkxISSBgEQxQS9HeMCX44JJSfF1O8ZUsp1SkEhJ0Z4lpjS2nlNMXoqpwJamdLsd01pRxhgYHEY0cZYoWiAjGYENYoo+gzNGXUMk6JJnEguLM1ZOQNlrmWdsVg+pJl6m1Ac44GB+iTNxPcc5YzZRzHuA8rZKyoAzhOehB47QuBTNKL8io+4jRqkWX8+ZALDSREPD8zZ8y1lfD3HkIFUK+ShA0GSEQALEWQsKEcn0aLTkJA8EinFNzQWoj3BC5IUpWDKnxYqTFVRgUzlhTOBlsTqUMiVL8XUypAXYuUEAA|Falstad-Simulation]] skizziert die Funktionsweise der SPI Schnittstelle (Achtung: Die Simulation beinhaltet noch einige Bugs)
 +  * Ein einfaches Beispiel für eine Anfrage von Daten beim Slave ist unter [[weitere Codebeispiele]] eingefügt