Ich habe noch ein wenig am Programmcode gespielt. Ein kleines Problem habe ich damit noch. Wenn eines der Potis auf Null gedimmt ist, ist es nicht möglich, den Wert mit der Fernbedienung zu überschreiben. Irgendwie scheint vom ADC dann ein Wert zu kommen, der eine Veränderung erkennt nd damit den Wert der Fernbedienung wieder überschreibt. Prinzipiell haben die Potis Vorrang, wenn man daran dreht und damit der Wert sich ändert. Ich habe da die Toleranz schon auf 20 hochgesetzt. Können die Schwankungen so groß sein?
Hier der Quellcode vom Hauptzweig. In der Anlage ist der gesamte Code zu finden (einige unwichtige Teile sind entfernt). Vielleicht hat jemand eine Idee. Danke.
Code
int main (void) {
DDRB = 0xff;
PORTB = 0x03;
uint16_t ADCval, ADCvalC1, ADCvalC2; //Werte des ADC
int16_t iLED1; //gespeicherte Werte PWM
uint8_t code, addr,key; //RC5-Code, Adresse, Idikator-Taste
//...
sei();
// ...
//Anfangswert setzen
pwm_10_64(iLED1, 1); //PWM-Kanal 1
//Hauptschleife
while(1) {
if (-1 == rc5.flip)
{
//keine FB-Taste gedrückt: Kanal 0,1 ADC lesen
ADCval = ReadChannel(1); /* MUX-Bits auf 0b0000 -> Channel 1 */
//Differenz zum vorhergehenden Wert? -> Poti wurde verändert
if ((ADCval > ADCvalC1+20) || (ADCval < ADCvalC1-20))
{
//ADC (10 bit) auf 6 Bit abbilden und Werte setzen
iLED1=ADCval/16;
pwm_10_64(iLED1, 1);
//ADC-Wert speichern
ADCvalC1=ADCval;
}
else
{
ADCval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
//Differenz zum vorhergehenden Wert? -> Poti wurde verändert
if ((ADCval > ADCvalC2+20) || (ADCval < ADCvalC2-20))
{
//ADC (10 bit) auf 6 Bit abbilden und Werte setzen
iLED1=ADCval/16;
pwm_10_64(iLED1, 1);
//ADC-Wert speichern
ADCvalC2=ADCval;
}
}
}
else
{
/* Ja, dann rc5.code merken und evtl. rc5.addr */
code = rc5.code;
addr = rc5.addr;
/* und auf naechstes Zeichen warten */
rc5.flip = -1;
if (addr==0)
{
switch (code)
{
case 12: { iLED1=0;
pwm_10_64(iLED1, 1);break;} // Aus
case 43: { iLED1=15;
pwm_10_64(iLED1, 1);break;} // Play
case 44: { iLED1=30;
pwm_10_64(iLED1, 1);break;} // Stop
case 53: { iLED1=45;
pwm_10_64(iLED1, 1);break;} // Pause
case 13: { iLED1=63;
pwm_10_64(iLED1, 1);break;} // Mute
// ... weitere Tasten entfernt
default: ;
}
}
}
}
return 0;
}
Alles anzeigen