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:
Viele GrüßeCode:#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); }
Andreas
Lesezeichen