Prozeßsynchronisierung bei dem Funktionsmodell einer geregelten Laufkatze
Bild 0-1: Funktionsmodell einer Laufkatze
  | 
Bild 0-2: Layout mit zwei Mikrocontrollern zur Erfassung je eines Abstandssignals (oben links und rechts) und eines weiteren zur Verarbeitung der Abstandssignale und zur Generierung eines PWM-Stellsignals für den Laufkatzenmotor.
  | 
  | 
  | 
  | 
Übertragung des 10-Bit Sensorsignals von A nach C:
       A    nach    C
Bit0: PC0          PA0
Bit1: PC1          PA1
Bit2: PC2          PA2
Bit3: PC3          PA3
Bit4: PC4          PA4
Bit5: PC5          PA5
Bit6: PC6          PA6
Bit7: PC7          PA7
Bit8: PD2          PB2
Bit9: PD3          PB3
Signalleitung von A nach C: PD0 nach PB0
Signalleitung von C nach A: PB1 nach PD1
       B    nach    C
Bit0: PC0          PC0
Bit1: PC1          PC1
Bit2: PC2          PC2
Bit3: PC3          PC3
Bit4: PC4          PC4
Bit5: PC5          PC5
Bit6: PC6          PC6
Bit7: PC7          PC7
Bit8: PD0          PD2
Bit9: PD1          PD3
Signalleitung von B nach C: PD2 nach PD4
Signalleitung von C nach B: PD7 nach PD3
Code 0-1: Verwendung der digitalen Leitungen.
  | 
Regeln auf A und B:
while(true)
{
    Messe und skaliere A/D-Werte
    Prüfe, ob C gerade liest
    wenn nein
    {
        Zeige C an, dass nun C nicht mehr anfangen darf zu lesen
            Schreibe Werte auf die digitalen Leitungen.
        Zeige C an, dass nun C wieder lesen darf
    }
}
Regeln auf C:
while(true)
{
    Prüfe, ob A gerade schreibt
    wenn nein
    {
        Zeige A an, dass nun A nicht mehr anfangen darf zu schreiben
            Lese Sensorwert von A
        Zeige A an, dass nun A wieder schreiben darf
    }
    Prüfe, ob B gerade schreibt
    wenn nein
    {
        Zeige B an, dass nun B nicht mehr anfangen darf zu schreiben
            Lese Sensorwert von B
        Zeige B an, dass nun B wieder schreiben darf
    }
}
Code 0-2: Regeln auf A, B un C.
  | 
while(true)
{
    if( (PIND & (1<<PD1)) == 0 ) //wenn C nicht bei A liest
    {
        PORTD |= (1<<PD0);    //C anzeigen, dass nun A schreibt
            Werte schreiben
        PORTD &= ~(1<<PD0);  //C anzeigen, dass nun A nicht mehr schreibt.
    }
}
Code 0-3: Synchronisierungsmechanismus im Mikrocontroller-Programm für A
while(true)
{
    if( (PIND & (1<<PD3)) == 0 ) //wenn C nicht bei B liest
    {
        PORTD |= (1<<PD2);    //C anzeigen, dass nun B schreibt
            Werte schreiben
        PORTD &= ~(1<<PD2);  //C anzeigen, dass nun B nicht mehr schreibt.
    }
}
Code 0-4: Synchronisierungsmechanismus im Mikrocontroller-Programm für B
while(true)
{
    if( (PINB & (1<<PB0)) == 0 ) //wenn A nicht schreibt
    {
        PORTB |= (1<<PB1);    //A anzeigen, dass nun C liest
            Sensorwert von A lesen
        PORTB &= ~(1<<PB1);   //A anzeigen, dass nun C nicht mehr liest.
    }
    if( (PIND & (1<<PD4)) == 0 ) //wenn B nicht schreibt
    {
        PORTD |= (1<<PD7);    //B anzeigen, dass nun C liest
            Sensorwert von B lesen
        PORTD &= ~(1<<PD7);   //B anzeigen, dass nun C nicht mehr liest.
    }
    PWM-Stellsignal berechnen und setzen
}
Code 0-5: Synchronisierungsmechanismus im Mikrocontroller-Programm für C