kramann.info
© Guido Kramann

Login: Passwort:










Robuste Systemintegration
1 Grundlagen
..1.1 Newton
....1.1.1 LinearSchwinger
....1.1.2 Daempfung
....1.1.4 ODE
....1.1.5 Saaluebung
..1.2 NewtonEuler
....1.2.1 Traegheitsmomente
....1.2.2 Modellgleichungen
....1.2.3 Einfachpendel
..1.3 Scilab
....1.3.1 Erste_Schritte
....1.3.2 Skripte
....1.3.3 Funktionen
..1.4 Laplace
....1.4.1 Eigenwerte
....1.4.2 PT1
..1.5 Regleroptimierung
....1.5.1 Guetefunktion
....1.5.2 Heuristiken
....1.5.3 Scilab
..1.6 Einstellregeln
....1.6.1 Totzeit
....1.6.2 Methode1
....1.6.3 Methode2
....1.6.4 Scilab
..1.7 Zustandsregler
..1.8 Polvorgabe
..1.8 Polvorgabe_alt
..1.9 Beobachter
....1.9.1 Haengependel
..1.10 Daempfungsgrad
..1.11 Processing
....1.11.1 Installation
....1.11.2 Erste_Schritte
....1.11.3 Mechatronik
....1.11.4 Bibliotheken
....1.11.5 Uebung
....1.11.6 Snippets
......1.11.6.1 Dateioperationen
......1.11.6.2 Bilder
......1.11.6.3 GUI
......1.11.6.4 Text
......1.11.6.5 PDF
......1.11.6.8 Maus
......1.11.6.10 Zeit
......1.11.6.13 Animation
......1.11.6.15 Simulation
....1.11.7 Referenzen
..1.12 Breakout
2 Beispiel
3 Beispielloesung
4 Praxis
5 javasci
6 Fehlertoleranz1
7 Reglerentwurf
..7.1 Sprungantwort
..7.2 Messdaten
..7.3 Systemidentifikation
..7.4 Polvorgabe
..7.5 Beobachter
..7.6 Robuster_Entwurf
..7.7 SIL
8 Systementwicklung
9 Arduino
..9.1 Lauflicht
..9.2 Taster
..9.3 Sensor
..9.12 Motor_PWM1
..9.13 Motor_PWM2_seriell
..9.14 Motor_PWM3_analogWrite
..9.15 Scheduler
..9.20 AV
..9.21 Mikrofon
..9.22 Universal
....9.22.1 Laborplatine
....9.22.2 LED_Leiste
....9.22.3 Motortreiber
....9.22.4 Sensoreingaenge
....9.22.5 Taster
....9.22.6 Tests
....9.22.7 Mikrofon
....9.22.8 Lautsprecher
....9.22.9 Fahrgestell
..9.23 Zauberkiste
..9.24 OOP
....9.24.1 Uebungen
..9.25 AVneu
....9.25.1 Tests
..9.26 DA_Wandler
..9.27 CompBoard
....9.27.1 Tastenmatrix
....9.27.2 ASCIIDisplay
..9.28 CTC
..9.29 Tonerzeugung
10 EvoFuzzy
..10.1 Fuzzy
....10.1.1 Fuzzylogik
....10.1.2 FuzzyRegler
....10.1.3 Uebung9
....10.1.5 Softwareentwicklung
......10.1.5.1 AgileSoftwareentwicklung
......10.1.5.2 FuzzyRegler
......10.1.5.3 Uebung
....10.1.6 Umsetzung
......10.1.6.1 FuzzyRegler
......10.1.6.2 Simulation
......10.1.6.3 Optimierung
......10.1.6.4 Uebung
....10.1.7 Haengependel
......10.1.7.1 Haengependel
......10.1.7.2 Simulation
......10.1.7.3 FuzzyRegler
......10.1.7.4 Optimierer
......10.1.7.5 Genetisch
....10.1.8 Information
....10.1.9 Energie
..10.2 Optimierung
....10.2.1 Gradientenverfahren
....10.2.2 Heuristiken
....10.2.3 ModifizierteG
....10.2.4 optim
..10.3 Genalgorithmus
..10.4 NeuronaleNetze
....10.4.1 Neuron
....10.4.2 Backpropagation
....10.4.3 Umsetzung
....10.4.4 Winkelerkennung
..10.5 RiccatiRegler
11 Agentensysteme
12 Simulation
20 Massnahmen
21 Kalmanfilter
..21.1 Vorarbeit
..21.2 Minimalversion
..21.3 Beispiel
30 Dreirad
31 Gleiter
..31.1 Fehlertoleranz

9.27 Minicomputer aus Arduino-Micro, Tastenfeld und Anzeigeelement

Tastenmatrix-Zuordnung:

Tastenmatrix-Pin Arduino-Micro A entspricht digital..
1 A0 D18
2 A1 D19
3 A2 D20
4 A3 D21
5 A4 D22
6 A5 D23
7 - D2

Tabelle 9.27-1: Verbindungen zwischen Tastenmatrix und Arduino-Micro

4-stellige-ASCII-Display-Zuordnung:

SLG2016 Pin SLG2016 Funktion Arduino
5 D0 PB0
6 D1 PB1
7 D2 PB2
8 D3 PB3
9 D4 PB4
10 D5 PB5
11 D6 PB6
1 ~WRITE PB7
3 A0 D7
2 A1 D12

Tabelle 9.27-2: 4-stellige-ASCII-Display-Zuordnung

Funktionstest


#define MAX 11

char puffer[]="1234567890";
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;

char zeichen;

void initAnzeige()
{
    DDRB=255;
    PORTB=0b10000000;  
    pinMode(7, OUTPUT);  
    pinMode(12,OUTPUT);
    digitalWrite(7,0);
    digitalWrite(12,0);
}

void initTastenmatrix()
{
    pinMode(18, INPUT);  //1
    pinMode(19, INPUT);  //2
    pinMode(20, INPUT);  //3
    pinMode(21, INPUT);  //4
    pinMode(22, INPUT);  //5
    pinMode(23, INPUT);  //6
    pinMode(2, INPUT);   //7
    
    //Pullups:
    digitalWrite(18,1);
    digitalWrite(19,1);
    digitalWrite(20,1);
}

void setzeZeichen(char zeichen, int stelle)
{
    digitalWrite(7,(3-stelle)%2);
    digitalWrite(12,(3-stelle)/2);
    PORTB&=0b10000000;
    PORTB|=zeichen;
    delay(5);
    PORTB&=0b01111111;
    delay(5);
    delay(5);
    PORTB|=0b10000000;
    
}

void zeigePuffer(int stelle)
{
    setzeZeichen(puffer[stelle%MAX],0);
    setzeZeichen(puffer[(stelle+1)%MAX],1);
    setzeZeichen(puffer[(stelle+2)%MAX],2);
    setzeZeichen(puffer[(stelle+3)%MAX],3);
}

void laufschrift()
{
    INDEX=INDEX_GLOBAL;
    setzeZeichen(puffer[INDEX],0);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],1);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],2);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],3);
    
    INDEX_GLOBAL++;
    if(INDEX_GLOBAL>=MAX)
        INDEX_GLOBAL=0;
    if(puffer[INDEX_GLOBAL]=='\0')
        INDEX_GLOBAL=0;
    
}

char leseZeichen()
{
    pinMode(21,OUTPUT);
    digitalWrite(21,0);
    delay(1);
    if(digitalRead(18)==0) return '1';
    if(digitalRead(19)==0) return '2';
    if(digitalRead(20)==0) return '3';
    digitalWrite(21,1);
    pinMode(21,INPUT);

    pinMode(22,OUTPUT);
    digitalWrite(22,0);
    delay(1);
    if(digitalRead(18)==0) return '4';
    if(digitalRead(19)==0) return '5';
    if(digitalRead(20)==0) return '6';
    digitalWrite(22,1);
    pinMode(22,INPUT);
   
    pinMode(23,OUTPUT);
    digitalWrite(23,0);
    delay(1);
    if(digitalRead(18)==0) return '7';
    if(digitalRead(19)==0) return '8';
    if(digitalRead(20)==0) return '9';
    digitalWrite(23,1);
    pinMode(23,INPUT);
   
    pinMode(2,OUTPUT);
    digitalWrite(2,0);
    delay(1);
    if(digitalRead(18)==0) return '*';
    if(digitalRead(19)==0) return '0';
    if(digitalRead(20)==0) return '#';
    digitalWrite(2,1);
    pinMode(2,INPUT);

    return ' ';   
}

void setup() 
{
    initAnzeige();
    initTastenmatrix();
}

void loop() 
{
    laufschrift();
    delay(50);
    
    zeichen = leseZeichen();
    if(zeichen!=' ')
    {
        puffer[INDEX_SCHREIBEN]=zeichen;
        INDEX_SCHREIBEN++;
        INDEX_SCHREIBEN%=(MAX-1);
        
        while(zeichen!=' ')
        {
            zeichen = leseZeichen();
        } 
              
    }
    
}

Code 9.27-1: Funktionstest.

Kindercomputer


#define MAX 21

//>=0 == Zahl
//<0: -1==ENDE -2=='=', -3=='+' -4=='-' -5=='*' -6=='/'
int ausdruck[MAX];

char puffer[MAX];
char puffer2[MAX];
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;
int INDEX_SCHREIBEN_ALT=0;
int STELLE=0;
int STELLE_ALT=0;
char zeichen;

int GLEICH_OFT=0;

//------------- RECHNER ---------------------

//Liefert ggf. Stelle des Gleichheitszeichens:
int analysieren(int* ausdruck,char* text)
{
    int* zeiger;
    int zahl=0;
    zeiger = &ausdruck[0];

    while(*text!='\0')
    {
        if(*text<'0' || *text>'9')
        {
            *zeiger=zahl;
            zeiger++;
            zahl=0;

            if(*text=='=')
            {
                *zeiger=-2;
            }
            if(*text=='+') *zeiger=-3;
            if(*text=='-') *zeiger=-4;
            if(*text=='*') *zeiger=-5;
            if(*text=='/') *zeiger=-6;
            zeiger++;
        }
        else
        {
            zahl*=10;
            zahl+=*text-48;            
        }
        text++;
    }
    *zeiger=zahl;
    zeiger++;
    *zeiger=-1;
}

int findeStelleGleich(int* ausdruck)
{
    int index=0;     
    while(ausdruck[index]!=-1)
    {
        if(ausdruck[index]==-2)
            return index;
        index++;
    }
    return -1;
}

int auswertenLinks(int* ausdruck)
{
    int* zeiger = ausdruck;
    int erg=zeiger[0];
    zeiger++;
    while(*zeiger!=-1 && *zeiger!=-2)
    {
        if(*zeiger<0)
        {
            if(*zeiger==-3)
            {
                zeiger++;
                erg+=*zeiger;                
            }
            else if(*zeiger==-4)
            {
                zeiger++;
                erg-=*zeiger;                
            }
        }
        zeiger++;
    }
    return erg;
}

int auswertenRechts(int* ausdruck)
{
    int* zeiger = ausdruck;
    int erg = 0;
    while(*zeiger!=-1 && *zeiger!=-2)
        zeiger++;    
    if(*zeiger==-2)
    {
        zeiger++;
        erg = *zeiger;
        zeiger++;
    }
    while(*zeiger!=-1)
    {
        if(*zeiger<0)
        {
            if(*zeiger==-3)
            {
                zeiger++;
                erg+=*zeiger;                
            }
            else if(*zeiger==-4)
            {
                zeiger++;
                erg-=*zeiger;                
            }
        }
        zeiger++;
    }
    return erg;
}

//------------- ENDE RECHNER ----------------

void initAnzeige()
{
    DDRB=255;
    PORTB=0b10000000;  
    pinMode(7, OUTPUT);  
    pinMode(12,OUTPUT);
    digitalWrite(7,0);
    digitalWrite(12,0);
}

void initTastenmatrix()
{
    pinMode(18, INPUT);  //1
    pinMode(19, INPUT);  //2
    pinMode(20, INPUT);  //3
    pinMode(21, INPUT);  //4
    pinMode(22, INPUT);  //5
    pinMode(23, INPUT);  //6
    pinMode(2, INPUT);   //7
    
    //Pullups:
    digitalWrite(18,1);
    digitalWrite(19,1);
    digitalWrite(20,1);
}

void setzeZeichen(char zeichen, int stelle)
{
    digitalWrite(7,(3-stelle)%2);
    digitalWrite(12,(3-stelle)/2);
    PORTB&=0b10000000;
    PORTB|=zeichen;
    delay(5);
    PORTB&=0b01111111;
    delay(5);
    delay(5);
    PORTB|=0b10000000;
    
}

void zeigePuffer(int stelle)
{
    setzeZeichen(puffer[stelle%MAX],0);
    setzeZeichen(puffer[(stelle+1)%MAX],1);
    setzeZeichen(puffer[(stelle+2)%MAX],2);
    setzeZeichen(puffer[(stelle+3)%MAX],3);
}

void laufschrift()
{
    INDEX=INDEX_GLOBAL;
    setzeZeichen(puffer[INDEX],0);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],1);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],2);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],3);
    
    INDEX_GLOBAL++;
    if(INDEX_GLOBAL>=MAX)
        INDEX_GLOBAL=0;
    if(puffer[INDEX_GLOBAL]=='\0')
        INDEX_GLOBAL=0;
    
}

char leseZeichen()
{
    pinMode(21,OUTPUT);
    digitalWrite(21,0);
    delay(1);
    if(digitalRead(18)==0) return '1';
    if(digitalRead(19)==0) return '2';
    if(digitalRead(20)==0) return '3';
    digitalWrite(21,1);
    pinMode(21,INPUT);

    pinMode(22,OUTPUT);
    digitalWrite(22,0);
    delay(1);
    if(digitalRead(18)==0) return '4';
    if(digitalRead(19)==0) return '5';
    if(digitalRead(20)==0) return '6';
    digitalWrite(22,1);
    pinMode(22,INPUT);
   
    pinMode(23,OUTPUT);
    digitalWrite(23,0);
    delay(1);
    if(digitalRead(18)==0) return '7';
    if(digitalRead(19)==0) return '8';
    if(digitalRead(20)==0) return '9';
    digitalWrite(23,1);
    pinMode(23,INPUT);
   
    pinMode(2,OUTPUT);
    digitalWrite(2,0);
    delay(1);
    if(digitalRead(18)==0) return '+';
    if(digitalRead(19)==0) return '0';
    if(digitalRead(20)==0)
    {
        GLEICH_OFT++;
        return '=';
    }        
    digitalWrite(2,1);
    pinMode(2,INPUT);

    return ' ';   
}

void copyPuffer()
{
    int i;
    for(i=0;i<MAX-1;i++)
        puffer2[i]=puffer[i];
    for(i=MAX-1;i>=0;i--)
    {
        if(puffer2[i]=='=')
        {
            puffer2[i]='\0';
            break;
        }            
    }        
}

void initialisieren()
{
    int i;
    INDEX=0;
    INDEX_GLOBAL=0;
    INDEX_SCHREIBEN=0;
    STELLE=0;
    STELLE_ALT=0;
    for(i=0;i<MAX-1;i++)
        puffer[i]=' ';
    puffer[MAX-1]='\0';
}

void setup() 
{
    initAnzeige();
    initTastenmatrix();
    initialisieren();
}

void auswerten()
{
    int erg1,erg2;
    copyPuffer();
    analysieren(ausdruck,puffer2);
    erg1 = auswertenLinks(ausdruck);   
    erg2 = auswertenRechts(ausdruck);   
    initialisieren();
    if(erg1==erg2)
    {
        setzeZeichen(':',0);
        setzeZeichen('-',1);
        setzeZeichen(')',2);
    }       
    else
    {
        setzeZeichen(':',0);
        setzeZeichen('-',1);
        setzeZeichen('(',2);
    }
    delay(2000);
    initialisieren();
}

void loop() 
{
    STELLE=INDEX_SCHREIBEN-3;
    if(STELLE<0)
        STELLE=0;
    if(INDEX_SCHREIBEN!=INDEX_SCHREIBEN_ALT)
    {
         zeigePuffer(STELLE);
         INDEX_SCHREIBEN_ALT=INDEX_SCHREIBEN;
    }         
    delay(50);
    
    zeichen = leseZeichen();
    if(zeichen!=' ')
    {
        puffer[INDEX_SCHREIBEN]=zeichen;
        INDEX_SCHREIBEN++;
        INDEX_SCHREIBEN%=(MAX-1);
        
        while(zeichen!=' ')
        {
            zeichen = leseZeichen();
        } 
              
    }

    if(GLEICH_OFT>=2)    
    {
       GLEICH_OFT=0;
       auswerten();
    }
}

Code 9.27-2: Kindercomputer.

Kindercomputer mit Punkt und Strichrechnung

Die Operatoren werden durch Kombinationen von * und einer Ziffer gewählt:

  • * und dann 1 liefert +
  • * und dann 2 liefert -
  • * und dann 3 liefert *
  • * und dann 4 liefert /

#define MAX 100

//>=0 == Zahl
//<0: -1==ENDE -2=='=', -3=='+' -4=='-' -5=='*' -6=='/'
int ausdruck[MAX];
int ausdruck_neu[MAX];

char puffer[MAX];
char puffer2[MAX];
int INDEX=0;
int INDEX_GLOBAL=0;
int INDEX_SCHREIBEN=0;
int INDEX_SCHREIBEN_ALT=0;
int STELLE=0;
int STELLE_ALT=0;
char zeichen;

int GLEICH_OFT=0;

int AUFSCHUB=0;

//------------- RECHNER ---------------------

//Liefert ggf. Stelle des Gleichheitszeichens:
int analysieren(int* ausdruck,char* text)
{
    int* zeiger;
    int zahl=0;
    zeiger = &ausdruck[0];

    while(*text!='\0')
    {
        if(*text<'0' || *text>'9')
        {
            *zeiger=zahl;
            zeiger++;
            zahl=0;

            if(*text=='=')
            {
                *zeiger=-2;
            }
            if(*text=='+') *zeiger=-3;
            if(*text=='-') *zeiger=-4;
            if(*text=='*') *zeiger=-5;
            if(*text=='/') *zeiger=-6;
            zeiger++;
        }
        else
        {
            zahl*=10;
            zahl+=*text-48;            
        }
        text++;
    }
    *zeiger=zahl;
    zeiger++;
    *zeiger=-1;
}

int findeStelleGleich(int* ausdruck)
{
    int index=0;     
    while(ausdruck[index]!=-1)
    {
        if(ausdruck[index]==-2)
            return index;
        index++;
    }
    return -1;
}

int auswertenLinks(int* ausdruck)
{
    int* zeiger = ausdruck;
    int erg=zeiger[0];
    zeiger++;
    while(*zeiger!=-1 && *zeiger!=-2)
    {
        if(*zeiger<0)
        {
            if(*zeiger==-3)
            {
                zeiger++;
                erg+=*zeiger;                
            }
            else if(*zeiger==-4)
            {
                zeiger++;
                erg-=*zeiger;                
            }
        }
        zeiger++;
    }
    return erg;
}

int auswertenRechts(int* ausdruck)
{
    int* zeiger = ausdruck;
    int erg = 0;
    while(*zeiger!=-1 && *zeiger!=-2)
        zeiger++;    
    if(*zeiger==-2)
    {
        zeiger++;
        erg = *zeiger;
        zeiger++;
    }
    while(*zeiger!=-1)
    {
        if(*zeiger<0)
        {
            if(*zeiger==-3)
            {
                zeiger++;
                erg+=*zeiger;                
            }
            else if(*zeiger==-4)
            {
                zeiger++;
                erg-=*zeiger;                
            }
        }
        zeiger++;
    }
    return erg;
}

//------------- ENDE RECHNER ----------------

void initAnzeige()
{
    DDRB=255;
    PORTB=0b10000000;  
    pinMode(7, OUTPUT);  
    pinMode(12,OUTPUT);
    digitalWrite(7,0);
    digitalWrite(12,0);
}

void initTastenmatrix()
{
    pinMode(18, INPUT);  //1
    pinMode(19, INPUT);  //2
    pinMode(20, INPUT);  //3
    pinMode(21, INPUT);  //4
    pinMode(22, INPUT);  //5
    pinMode(23, INPUT);  //6
    pinMode(2, INPUT);   //7
    
    //Pullups:
    digitalWrite(18,1);
    digitalWrite(19,1);
    digitalWrite(20,1);
}

void setzeZeichen(char zeichen, int stelle)
{
    digitalWrite(7,(3-stelle)%2);
    digitalWrite(12,(3-stelle)/2);
    PORTB&=0b10000000;
    PORTB|=zeichen;
    delay(5);
    PORTB&=0b01111111;
    delay(5);
    delay(5);
    PORTB|=0b10000000;
    
}

void zeigePuffer(int stelle)
{
    setzeZeichen(puffer[stelle%MAX],0);
    setzeZeichen(puffer[(stelle+1)%MAX],1);
    setzeZeichen(puffer[(stelle+2)%MAX],2);
    setzeZeichen(puffer[(stelle+3)%MAX],3);
}

void laufschrift()
{
    INDEX=INDEX_GLOBAL;
    setzeZeichen(puffer[INDEX],0);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],1);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],2);
    INDEX++;
    if(INDEX>=MAX)
        INDEX=0;
    if(puffer[INDEX]=='\0')
        INDEX=0;
    setzeZeichen(puffer[INDEX],3);
    
    INDEX_GLOBAL++;
    if(INDEX_GLOBAL>=MAX)
        INDEX_GLOBAL=0;
    if(puffer[INDEX_GLOBAL]=='\0')
        INDEX_GLOBAL=0;
    
}

char leseZeichen()
{
    pinMode(21,OUTPUT);
    digitalWrite(21,0);
    delay(1);
    if(digitalRead(18)==0) return '1';
    if(digitalRead(19)==0) return '2';
    if(digitalRead(20)==0) return '3';
    digitalWrite(21,1);
    pinMode(21,INPUT);

    pinMode(22,OUTPUT);
    digitalWrite(22,0);
    delay(1);
    if(digitalRead(18)==0) return '4';
    if(digitalRead(19)==0) return '5';
    if(digitalRead(20)==0) return '6';
    digitalWrite(22,1);
    pinMode(22,INPUT);
   
    pinMode(23,OUTPUT);
    digitalWrite(23,0);
    delay(1);
    if(digitalRead(18)==0) return '7';
    if(digitalRead(19)==0) return '8';
    if(digitalRead(20)==0) return '9';
    digitalWrite(23,1);
    pinMode(23,INPUT);
   
    pinMode(2,OUTPUT);
    digitalWrite(2,0);
    delay(1);
    if(digitalRead(18)==0) return '*';
    if(digitalRead(19)==0) return '0';
    if(digitalRead(20)==0)
    {
        GLEICH_OFT++;
        return '=';
    }        
    digitalWrite(2,1);
    pinMode(2,INPUT);

    return ' ';   
}

void copyPuffer()
{
    int i;
    for(i=0;i<MAX-1;i++)
        puffer2[i]=puffer[i];
    for(i=MAX-1;i>=0;i--)
    {
        if(puffer2[i]=='=')
        {
            puffer2[i]='\0';
            break;
        }            
    }        
}

void initialisieren()
{
    int i;
    INDEX=0;
    INDEX_GLOBAL=0;
    INDEX_SCHREIBEN=0;
    STELLE=0;
    STELLE_ALT=0;
    for(i=0;i<MAX-1;i++)
        puffer[i]=' ';
    puffer[MAX-1]='\0';
}

void setup() 
{
    initAnzeige();
    initTastenmatrix();
    initialisieren();
}

//Vorab alle Ausdrücke mit * und / auswerten:
void auswertenPunkt(int* ausdruck_neu,int* ausdruck)
{
    int* zeiger = ausdruck;
    int* zeiger_neu = ausdruck_neu;
    int zahl=0;
    while(*zeiger!=-1)
    {        
        if(*zeiger==-5 || *zeiger==-6)
        {
            zeiger_neu--;
            zeiger--;
            zahl=*zeiger;
            zeiger++;              
            while(*zeiger==-5 || *zeiger==-6)
            {
                if(*zeiger==-5)
                {
                    zeiger++;
                    zahl*=*zeiger;                
                }
                else if(*zeiger==-6)
                {
                    zeiger++;
                    zahl/=*zeiger;                
                }   
                zeiger++;
            }
            zeiger--;
            *zeiger_neu=zahl;
        }
        else
        {
            *zeiger_neu=*zeiger;
        }          
        zeiger++;
        zeiger_neu++;
    }
    *zeiger_neu=-1;
}


void auswerten()
{
    int erg1,erg2;
    copyPuffer();
    analysieren(ausdruck,puffer2);
    auswertenPunkt(ausdruck_neu,ausdruck);    
    erg1 = auswertenLinks(ausdruck_neu);   
    erg2 = auswertenRechts(ausdruck_neu);   
    initialisieren();
    if(erg1==erg2)
    {
        setzeZeichen(':',0);
        setzeZeichen('-',1);
        setzeZeichen(')',2);
    }       
    else
    {
        setzeZeichen(':',0);
        setzeZeichen('-',1);
        setzeZeichen('(',2);
    }
    delay(2000);
    initialisieren();
}

void loop() 
{
    STELLE=INDEX_SCHREIBEN-3;
    if(STELLE<0)
        STELLE=0;
    if(INDEX_SCHREIBEN!=INDEX_SCHREIBEN_ALT)
    {
         zeigePuffer(STELLE);
         INDEX_SCHREIBEN_ALT=INDEX_SCHREIBEN;
    }         
    delay(50);
    
    zeichen = leseZeichen();
    if(zeichen=='*')
    {
        while(zeichen!=' ')
        {
            zeichen = leseZeichen();
        }         
        while(zeichen<'1' || zeichen>'4')
        {
            zeichen = leseZeichen();
        }         
        if(zeichen=='1') zeichen='+';
        if(zeichen=='2') zeichen='-';
        if(zeichen=='3') zeichen='*';
        if(zeichen=='4') zeichen='/';
        
        puffer[INDEX_SCHREIBEN]=zeichen;
        INDEX_SCHREIBEN++;
        INDEX_SCHREIBEN%=(MAX-1);
        
        while(zeichen!=' ')
        {
            zeichen = leseZeichen();
        }         
    }
    else if(zeichen!=' ')
    {      
        puffer[INDEX_SCHREIBEN]=zeichen;
        INDEX_SCHREIBEN++;
        INDEX_SCHREIBEN%=(MAX-1);
        
        while(zeichen!=' ')
        {
            zeichen = leseZeichen();
        } 
              
    }

    if(GLEICH_OFT>=2)    
    {
       GLEICH_OFT=0;
       auswerten();
    }
}

Code 9.27-3: Kindercomputer mit Grundrechenarten.