Hallo ihre Rätzelrater.
Ich muss euch beide leider entäuschen, es kann nicht ein vertauschtes MSB-LSB oder ein falscher Gray-Code sein.
Wie sollte sonst die rechte Seite recht gute Werte liefern können.
Hier mal das Codestück im Interrupt SIG_ADC um zu zeigen, dass rechts und Schrott-Links identisch bearbeitet werden:
Code:
SIGNAL (SIG_ADC)
{
static unsigned int adc_val;
unsigned char v_tik = KEIN_TIK;
unsigned char v_seite;
int v_rad_zeit;
/* Mindestens ein ADC muss aktiv gewesen sein, sonst haetten wir den
Interrupt nicht bekommen.
Also den ADC-Wert holen.
*/
adc_val = ADCL + (ADCH << 8);
UND ETWAS WEITER
case ADC_DO_RAD_LH: // Links Hell-Messung speichern
MD_RAD_LH (adc_val);
MD_RAD_LH_HIST (adc_val);
sens_i.rad [LINKS_HELL] = adc_val;
if (sens_i.rad_toggle [LINKS] == TRUE)
{
if (sens_i.rad [LINKS_HELL] > hw_i.rad_schwelle_oben [LINKS])
v_tik = LINKS_TIK_OBEN;
}
else
{
if (sens_i.rad [LINKS_HELL] < hw_i.rad_schwelle_unten [LINKS])
v_tik = LINKS_TIK_UNTEN;
}
break;
case ADC_DO_RAD_RH: // Rechts Hell-Messung speichern
MD_RAD_RH (adc_val);
MD_RAD_RH_HIST (adc_val);
sens_i.rad [RECHTS_HELL] = adc_val;
if (sens_i.rad_toggle [RECHTS] == TRUE)
{
if (sens_i.rad [RECHTS_HELL] > hw_i.rad_schwelle_oben [RECHTS])
v_tik = RECHTS_TIK_OBEN;
}
else
{
if (sens_i.rad [RECHTS_HELL] < hw_i.rad_schwelle_unten [RECHTS])
v_tik = RECHTS_TIK_UNTEN;
}
break;
UND DANN NOCH
/* Bei einem erkannten Tik an der Odometrie muss nun auch der entsprechende
Tik-Zaehler erhoeht werden.
Auch die Zeit zwischen 1.er bzw. Doppel-Tik wird hier erfasst um hierraus
die Geschwindigkeit abzuleiten.
*/
if (v_tik != KEIN_TIK)
{
v_seite = (v_tik & 0x01);
sens_i.rad_toggle [v_seite] ^= 1;
sens.rad_tik [v_seite] ++;
if (RAD_ZEIT_ERFASSEN == 1 ||
(v_tik & 0x02) == 0x02)
{
v_rad_zeit = (int)(timebase * 256 + count36kHz);
sens.rad_zeit [v_seite] = v_rad_zeit - sens_i.rad_zeit [v_seite];
sens_i.rad_zeit [v_seite] = v_rad_zeit;
/* Mittelwert der RAD-ZEIT bilden.
Einen 'glatten' Mittelwert gibt es am besten wenn über eine ODO-
Scheibenumdrehung gemittelt wird.
Hier machen wir aber immer nur eine 8-er Pipe.
*/
sens_i.rad_zeit_pipe_sum [v_seite] -= sens_i.rad_zeit_pipe [v_seite][sens_i.rad_zeit_pipe_pos [v_seite]];
sens_i.rad_zeit_pipe [v_seite][sens_i.rad_zeit_pipe_pos [v_seite]] = sens.rad_zeit [v_seite];
sens_i.rad_zeit_pipe_sum [v_seite] += sens_i.rad_zeit_pipe [v_seite][sens_i.rad_zeit_pipe_pos [v_seite]];
sens_i.rad_zeit_pipe_pos [v_seite] = ++sens_i.rad_zeit_pipe_pos [v_seite] & 0x07;
sens.rad_zeit [v_seite] = sens_i.rad_zeit_pipe_sum [v_seite] / RAD_ZEIT_PIPE_LEN;
MD_RAD_ZEIT_HIST (v_seite, sens.rad_zeit [v_seite]);
}
}
Zu sehen in den EXCEL-Blättern ist immer das Datengeraffel, welches mit der letzten Zeile "MD_RAD_ZEIT_HIST (v_seite, sens.rad_zeit [v_seite]);" als MessDaten gesammelt wird.
Bis jetzt ist mir selber allerdings auch nichts passendes eingefallen. Ich glaube, ich muss mal die ODO-Scheibe nur putzen.
Oder ich tausche die ODO-Scheiben einmal von rechts nach links, um nur mal zu sehen, ob es tatsächlich die Hardware ist.
Das aber erst morgen, oder heute, oder gleich.
Gruß und vielen Dank für eurer Erklärungensbemühungen.
Sternthaler
Lesezeichen