kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Laboruebung2_alt
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
8 OOP
..8.1 Probleme
..8.2 Konzept
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

14.5 Umsetzen einer SPI Client-Server-Struktur

  • Die Recourcen eines Mikrocontrollers sind sehr begrenzt.
  • Dies kann man durch Zusammenschalten mehrerer Mikrocontroller verbessert werden.
  • Möglich ist dies am besten über die vorhanedenen Bussysteme.
  • Der SPI-Bus ist der schnellste verfügbare Bus (bis 4MHz Byte-Übertragungsrate).

Das Konzept

  • Ein Mikrocontroller wird einzig und allein dazu verwendet die Daten der anderen zu empfangen und weiter zu leiten. Man kann ihn als "Server" bezeichnen.
  • Damit die Hauptprozesse auf den einzelnen Clients nicht unterbrochen werden, soll der Server nur dann einen Interrupt für die Datenübertragung auf einem Client auslösen, wenn dieser über eine Zusatzleitung durch einen LOW-Pegel die Bereitschaft dazu anzeigt.
  • Jedem Client ist ein Block von N Byte z.B. 8 zugeordnet. Bei K Clients z.B. 14 ergibt sich eine Gesamtdatenmenge von N*K, z.B. 114Byte.
  • Diese werden an jeden Client komplett gesendet und dieser holt sich einerseits heraus, was er davon benötigt.
  • Zum anderen frischt jeder Client in einem Datenaustauschzyklus mit dem Server seine eigene Datenzeile mit den N Bytes auf.
  • Dieses Konzept ermöglicht die Verwendung einer variablen Anzahl an Clients ohne Programmänderungen am Server vornehmen zu müssen.
  • Mehr dazu in der Vorlesung.

Das Server Programm (Fragment)

    void datenaustausch()
    {        
        for(i=0;i<KANALANZAHL;i++) //Alle Kanäle durchgehen
        {
            timeout = 0;
            while(!pruefeKanalbereitschaft(i)  && timeout<10000) timeout++;
            timeout = 0;
            timeout=false;
       //Wenn Kanal bereit, kompletten Speicherinhalt senden und Inhalt des aktuellen Kanals merken
            if(pruefeKanalbereitschaft(i))
            {                
                aktiviereKanal(i); //Interrupt bei Client auslösen.
                for(k=0;k<KANALANZAHL*SPI_NACHRICHT_BYTEANZAHL;k++)
                {
                    zeichen_senden = speicher[k];
                    zeichen_empfangen = senden_empfangen(zeichen_senden);
                    if(timeout_aufgetreten==true)
                        break;
                    //nur wenn Zeichen im Speicherbereich des aktuellen Kanals steht, das
                    //korrespondierende Zeichen in speicher überschreiben:
                    if(k/SPI_NACHRICHT_BYTEANZAHL==i)
                        speicher[k]=zeichen_empfangen;
                }                
                //Interrupt zurücksetzen:
                deaktiviereKanal(i);
            }
            if(timeout_aufgetreten==true)
            {
                deaktiviereKanal(i);
                //SPI-Schnittstelle ausschalten:
                SPCR = (0<<SPIE) | (0<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);            
                for(pause=0;pause<1000;pause++);
                //SPI-Schnittstelle als Master ohne Interrupts konfigurieren und starten:
                SPCR = (0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);            
                for(pause=0;pause<1000;pause++);
            }
        }            
    }

Code 14.5-1: Das Serverprogramm.

Das Client-Programm (Fragment)

Das Client-Programm.

Bild 14.5-1: Das Client-Programm.

Versuchsaufbau

Versuchsaufbau 1.

Bild 14.5-2: Versuchsaufbau 1.

Versuchsaufbau 2.

Bild 14.5-3: Versuchsaufbau 2.

Ergebnis über Hyperterminal visualisiert

Test mit RS232.

Bild 14.5-4: Test mit RS232.