Ich habe mich selbst gewundert. Aber sooo verschwenderisch ist der Code gar nicht geschrieben. Ich hänge ihn mal hinten an. (Was noch an Info fehlt: Die Relais hängen an einem Schiebe-Register) Sicher könnte man noch einiges optimieren, aber ich habe hier gelesen, dass der Code für den IR-Empfang zwischen 600 und 900 Bytes des Flash inanspruch nimmt. Ich denke soweit kann man den Code dann doch nicht optimieren:

Code:
#define AVRGCC 
#include <avr/io.h> 
#include <compiler.h>
#include <avr/eeprom.h>
/** 
Der AVR übernimmt die Steuerung der Relais für die Kanalwahl und Phase.
IO's:
PB0  OUT  Relais Strobe
PB1  OUT  Relais Data
PB2  OUT  Relais CLK
PB3  OUT  Power-LED
PB4  OUT  Power-LED
PB5  SPI
PB6  SPI
PB7  SPI
PD0  IN  Sub1
PD1  IN  Sub2
PD2  IN  IR Empfänger
PD3  IN  Set
PD4  IN  Power Supply On
PD5  ---
PD6  ---
Speaker-Relais:
Links =  Sub 1
Rechts = Sub 2
**/
 
U8 ShiftByte = 0;
U8 PowerState = 255;
U8 ActiveSub =  1;
U8 Phase_1L =   0;
U8 Phase_1R =   0;
U8 Phase_2L =   0;
U8 Phase_2R =   0;
#define RelSigLinks    7
#define RelSigRechts   6
#define RelPhaseLinks   5
#define RelPhaseRechts   4
#define RelSubLinks    3
#define RelSubRechts   2
#define LEDSub1     1
#define LEDSub2     0
 
#define RelSigLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSigLinks))
#define RelSigLinks1   ShiftByte = (ShiftByte | (1<<RelSigLinks))
#define RelSigRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSigRechts))
#define RelSigRechts1   ShiftByte = (ShiftByte | (1<<RelSigRechts))
#define RelPhaseLinks0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseLinks))
#define RelPhaseLinks1   ShiftByte = (ShiftByte | (1<<RelPhaseLinks))
#define RelPhaseRechts0   ShiftByte = ~(~ShiftByte | (1<<RelPhaseRechts))
#define RelPhaseRechts1   ShiftByte = (ShiftByte | (1<<RelPhaseRechts))
#define RelSubLinks0   ShiftByte = ~(~ShiftByte | (1<<RelSubLinks))
#define RelSubLinks1   ShiftByte = (ShiftByte | (1<<RelSubLinks))
#define RelSubRechts0   ShiftByte = ~(~ShiftByte | (1<<RelSubRechts))
#define RelSubRechts1   ShiftByte = (ShiftByte | (1<<RelSubRechts))
#define LEDSub1_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub1))
#define LEDSub1_1    ShiftByte = (ShiftByte | (1<<LEDSub1))
#define LEDSub2_0    ShiftByte = ~(~ShiftByte | (1<<LEDSub2))
#define LEDSub2_1    ShiftByte = (ShiftByte | (1<<LEDSub2))
#define RelaisStrobe0   PORTB = ~(~PORTB | (1<<PB0))
#define RelaisStrobe1   PORTB = (PORTB | (1<<PB0))
#define RelaisData0    PORTB = ~(~PORTB | (1<<PB1))
#define RelaisData1    PORTB = (PORTB | (1<<PB1))
#define RelaisCLK0    PORTB = ~(~PORTB | (1<<PB2))
#define RelaisCLK1    PORTB = (PORTB | (1<<PB2))
#define PowerLED1_0    PORTB = ~(~PORTB | (1<<PB3)) // rot
#define PowerLED1_1    PORTB = (PORTB | (1<<PB3))
#define PowerLED2_0    PORTB = ~(~PORTB | (1<<PB4)) // grün
#define PowerLED2_1    PORTB = (PORTB | (1<<PB4))
#define TasteSub1               ((PIND & (1<<PD0)) == 0) 
#define TasteSub2               ((PIND & (1<<PD1)) == 0) 
#define TasteSet                ((PIND & (1<<PD3)) == 0) 
#define PowerSupplyOn           ((PIND & (1<<PD4)) == 0) 
 
#define Wait_Shift    30
 
void Wait (U16 Time)
{
 U16 i1;
 for (i1 = 0; i1 < Time; i1++)
  asm volatile ("NOP");
}
void ShiftOut (void)
{
 U8 Temp = ShiftByte;
 U8 i1;
 RelaisStrobe0;
 RelaisCLK1;
 Wait (Wait_Shift);
 for (i1 = 0; i1 < 8;i1++)
 {
  if ((Temp & 1) == 0)
   RelaisData0;
  else
   RelaisData1;
  
  Wait (Wait_Shift);
  RelaisCLK0;
  Wait (Wait_Shift);
  RelaisCLK1;
  Wait (Wait_Shift);
  Temp = (Temp>>1);
 }
 RelaisStrobe1;
}
 
void SetOutputs (U8 showPhase)
{
 switch (ActiveSub)
 {
  case 1: { RelSigLinks0;
     RelSigRechts0;
     if (Phase_1L == 0)
      RelPhaseLinks0;
     else
      RelPhaseLinks1;
     if (Phase_1R == 0)
      RelPhaseRechts0;
     else
      RelPhaseRechts1;
     RelSubLinks0;
     RelSubRechts0;
     LEDSub1_1;
     LEDSub2_0;
     break;
    }
  case 2: { RelSigLinks1;
     RelSigRechts1;
     if (Phase_2L == 0)
      RelPhaseLinks0;
     else
      RelPhaseLinks1;
     if (Phase_2R == 0)
      RelPhaseRechts0;
     else
      RelPhaseRechts1;
     RelSubLinks1;
     RelSubRechts1;
     LEDSub1_0;
     LEDSub2_1;
     break;
    }
 }
 if (showPhase == 1)
 {
  U8 tmpShiftByte = ShiftByte;
  U8 tmpFlashByte;
  LEDSub1_0;
  LEDSub2_0;
  PowerLED1_1;
  PowerLED2_0;
  ShiftOut ();
  Wait (5000);
  switch (ActiveSub)
  {
   case 1: { if (Phase_1L == 1)
       LEDSub1_1;
      if (Phase_1R == 1)
       LEDSub2_1;
      break;
     }
   case 2: { if (Phase_2L == 1)
       LEDSub1_1;
      if (Phase_2R == 1)
       LEDSub2_1;
      break;
     }
  }
  ShiftOut ();
  tmpFlashByte = ShiftByte;
  Wait (1000);
  ShiftByte = tmpShiftByte;
  LEDSub1_0;
  LEDSub2_0;
  ShiftOut ();
  Wait (1000);
  ShiftByte = tmpFlashByte;
  ShiftOut ();
  Wait (5000);
  PowerLED1_0;
  PowerLED2_1;
  ShiftByte = tmpShiftByte;
 }
 ShiftOut ();
}
 
void loadSettings (void)
{
 ActiveSub = eeprom_read_byte (1);
 Phase_1L = eeprom_read_byte (2);
 Phase_1R = eeprom_read_byte (3);
 Phase_2L = eeprom_read_byte (4);
 Phase_2R = eeprom_read_byte (5);
 if (ActiveSub < 1) ActiveSub = 1;
 if (ActiveSub > 2) ActiveSub = 2;
 if (Phase_1L > 1)  Phase_1L =  0;
 if (Phase_1R > 1)  Phase_1R =  0;
 if (Phase_2L > 1)  Phase_2L =  0;
 if (Phase_2R > 1)  Phase_2R =  0;
}
void saveSettings (void)
{
 eeprom_write_byte (1, ActiveSub);
 eeprom_write_byte (2, Phase_1L);
 eeprom_write_byte (3, Phase_1R);
 eeprom_write_byte (4, Phase_2L);
 eeprom_write_byte (5, Phase_2R);
}
 
int main(void) 
{ 
 DDRB = 0b00011111;
 PORTB = 0b00000000;
 DDRD = 0b00000000;
 PORTD = 0b00011011;
 RelaisStrobe1;
 RelaisCLK1;
 loadSettings ();

 ShiftOut ();
 

   while (1)
    {
  if (PowerSupplyOn)
  {
   if (PowerState != 0)
   {
    PowerLED1_0;
    PowerLED2_1;
    PowerState = 1;
    SetOutputs (0);
   }
 
   if (PowerState == 1)
   {
    if (TasteSub1)
    {
     ActiveSub = 1;
     SetOutputs (0);
     saveSettings ();
     Wait (1000);
     while (TasteSub1)
      Wait (1000);
    }
    if (TasteSub2)
    {
     ActiveSub = 2;
     SetOutputs (0);
     saveSettings ();
     Wait (1000);
     while (TasteSub2)
      Wait (1000);
    }
    if (TasteSet)
    {
     switch (ActiveSub)
     {
      case 1: { if (Phase_1L == 0)
         {
          if (Phase_1R == 0)
          {
           Phase_1R = 1;
          }
          else
          {
           Phase_1L = 1;
           Phase_1R = 0;
          }
         }
         else
         {
          if (Phase_1R == 0)
          {
           Phase_1R = 1;
          }
          else
          {
           Phase_1L = 0;
           Phase_1R = 0;
          }
         }
         break;
        }
      case 2: { if (Phase_2L == 0)
         {
          if (Phase_2R == 0)
          {
           Phase_2R = 1;
          }
          else
          {
           Phase_2L = 1;
           Phase_2R = 0;
          }
         }
         else
         {
          if (Phase_2R == 0)
          {
           Phase_2R = 1;
          }
          else
          {
           Phase_2L = 0;
           Phase_2R = 0;
          }
         }
         break;
        }
     }
     SetOutputs (1);
     saveSettings ();
     
     Wait (1000);
     while (TasteSet)
      Wait (1000);
    }
   }
  }
  else
  {
   if (PowerState != 0)
   {
    ShiftByte = 0;
    ShiftOut ();
    PowerLED1_1;
    PowerLED2_0;
    PowerState = 0;
   }
  }
    } 
    return(0); 
}
Viele Grüße
Andreas