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
Lesezeichen