RCO
12.12.2004, 22:47
Also da ich ein echter C-Noob bin und auch relativ wenig Ahnung von den gazen registern der verschiedenen AVRs habe, würde ich mich freuen, wenn mir jemand den folgenden Ausschnitt erklären könnte.
Es geht dabei um die Konvertierung eines ADC-werts in eine Variable deren einzelne Bits quasi verschiedene Stufen sind. Das war jetzt vermutlich ziemlich undeutlich, deshalb versuche ich es mit einem Beispiel:
Wird z.B. ein bestimmter Wert an den ADC gelegt, so wird nciht der Wert zurück geliefert, sondern je nach höhe des Wertes eben nur das entsprechende bit in einem Byte.
Da es insgesamt nur 7 mögliche Eingangssignale, jedoch alle auch durcheinander gemischt gibt, wird dann jedem Wert, falls angelegt, quasi das entsprechende Bit zugeordnet.
Ich hoffe das war verständlich :-)
unsigned char PollSwitch (void)
{
unsigned int i;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8 ) ;
SWITCH_OFF;
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
}
Mein größtes Problem ist dabnei das verständniss dieses Auszugs:
i = ADCL + (ADCH << 8);
und dieser anschließenden Berechnung
((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5)
Soweit ich weiß handelt es dabei um einen 10 Bit-ADC, deshalb vermutlich die 1024.
Falls hier wichtige Teile oder Informationen fehlen sollten, sagt mir bitte bescheid.
Ich würde mich sehr über eure Hilfe freuen, deshalb schon mal Danke im Voraus.
P.S.: Wem das ganze bekannt vorkommt, es ist ein Auszug aus der Asuro.c-Datei.
MFG Moritz
Es geht dabei um die Konvertierung eines ADC-werts in eine Variable deren einzelne Bits quasi verschiedene Stufen sind. Das war jetzt vermutlich ziemlich undeutlich, deshalb versuche ich es mit einem Beispiel:
Wird z.B. ein bestimmter Wert an den ADC gelegt, so wird nciht der Wert zurück geliefert, sondern je nach höhe des Wertes eben nur das entsprechende bit in einem Byte.
Da es insgesamt nur 7 mögliche Eingangssignale, jedoch alle auch durcheinander gemischt gibt, wird dann jedem Wert, falls angelegt, quasi das entsprechende Bit zugeordnet.
Ich hoffe das war verständlich :-)
unsigned char PollSwitch (void)
{
unsigned int i;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8 ) ;
SWITCH_OFF;
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
}
Mein größtes Problem ist dabnei das verständniss dieses Auszugs:
i = ADCL + (ADCH << 8);
und dieser anschließenden Berechnung
((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5)
Soweit ich weiß handelt es dabei um einen 10 Bit-ADC, deshalb vermutlich die 1024.
Falls hier wichtige Teile oder Informationen fehlen sollten, sagt mir bitte bescheid.
Ich würde mich sehr über eure Hilfe freuen, deshalb schon mal Danke im Voraus.
P.S.: Wem das ganze bekannt vorkommt, es ist ein Auszug aus der Asuro.c-Datei.
MFG Moritz