Guten Morgen,
entweder bin ich zu müde oder AVRco kann nicht mehr rechnen
Eigentlich habe ich auf meinem Board 2 Lichtsensoren, beide Werte werden in einer Summe addiert und dann durch 2 geteilt. Um nun einen genaueren Wert zu Filtern, gehe ich nun vor der Auswertung mit der folgenden Routine drann.
Ich schreibe alle paar Sekunden einen Wert in ein Array und verschiebe den Array-Speicher entsprechend, so das der älteste Wert aus der Liste fliegt.
Dann addiere alle 31 Werte zusammen und teile sie wieder durch 31, somit habe ich einen kompletten gemittelten Wert über mehrere Sekunden. Dieser Vorgang soll auch verhindern, dass das kurze anstrahlen von Autoscheinwerfern einen sofortigen Sprung der Lichtsteuerung macht.
Eigentlich sollte das alles kein Problem sein, aber warum kann AVRco nicht mehr rechnen ???
Oder habe ich um diese Zeit einfach einen Denkfehler?
Die Einzelwerte sind max 1024, somit ist die maximal mögliche Zahl 31.744, also eigentlich auch kein Problem mit dem Word. Aber da ich hier ganz komische Werte erhalten habe, habe ich zum Test mal in das "Array [0..30] of word" mit je 200 gefüllt.
Somit sollte das Mittel eigentlich auch 200 sein und die Summe 6200, aber AVRco errechnet als Summme 9003 und als Mittel 290 ?????
Und der Wert ändert sich im laufenden Betrieb! Jetzt habe ich sogar Summe: 26424 und Mittel 852 ???
Ich benutze den mega1284P, hat Jemand eine Idee woran das liegen könnte?
{--------------------------------------------------------------}
Procedure LichtSteuer;
var
LichtX : Integer;
WordSumme : Word;
begin
/// Ausgabe Lichtfilter
// Fülle zum Test mit 200
for LichtX := 30 downto 0 do
LichtFilter[LichtX]:=200;
endfor;
for LichtX := 0 to 30 do
DebugOut('LichtFilter-'+IntToStr(LichtX)+': '+IntToStr(LichtFilter[LichtX]));
WordSumme:= WordSumme + LichtFilter[LichtX];
endfor;
DebugOut('Summe: '+IntToStr(WordSumme));
WordSumme:= WordSumme div 31;
DebugOut('LichtFilter-Mittel: '+IntToStr(WordSumme));
end;
Beisst sich da was evtl. mit einen anderen Treiber (I2C, TWI, ModBus RTU)?
Gruss
Thorsten
entweder bin ich zu müde oder AVRco kann nicht mehr rechnen
Eigentlich habe ich auf meinem Board 2 Lichtsensoren, beide Werte werden in einer Summe addiert und dann durch 2 geteilt. Um nun einen genaueren Wert zu Filtern, gehe ich nun vor der Auswertung mit der folgenden Routine drann.
Ich schreibe alle paar Sekunden einen Wert in ein Array und verschiebe den Array-Speicher entsprechend, so das der älteste Wert aus der Liste fliegt.
Dann addiere alle 31 Werte zusammen und teile sie wieder durch 31, somit habe ich einen kompletten gemittelten Wert über mehrere Sekunden. Dieser Vorgang soll auch verhindern, dass das kurze anstrahlen von Autoscheinwerfern einen sofortigen Sprung der Lichtsteuerung macht.
Eigentlich sollte das alles kein Problem sein, aber warum kann AVRco nicht mehr rechnen ???
Oder habe ich um diese Zeit einfach einen Denkfehler?
Die Einzelwerte sind max 1024, somit ist die maximal mögliche Zahl 31.744, also eigentlich auch kein Problem mit dem Word. Aber da ich hier ganz komische Werte erhalten habe, habe ich zum Test mal in das "Array [0..30] of word" mit je 200 gefüllt.
Somit sollte das Mittel eigentlich auch 200 sein und die Summe 6200, aber AVRco errechnet als Summme 9003 und als Mittel 290 ?????
Und der Wert ändert sich im laufenden Betrieb! Jetzt habe ich sogar Summe: 26424 und Mittel 852 ???
Ich benutze den mega1284P, hat Jemand eine Idee woran das liegen könnte?
Code
{--------------------------------------------------------------}
Procedure LichtSteuer;
var
LichtX : Integer;
WordSumme : Word;
begin
/// Ausgabe Lichtfilter
// Fülle zum Test mit 200
for LichtX := 30 downto 0 do
LichtFilter[LichtX]:=200;
endfor;
for LichtX := 0 to 30 do
DebugOut('LichtFilter-'+IntToStr(LichtX)+': '+IntToStr(LichtFilter[LichtX]));
WordSumme:= WordSumme + LichtFilter[LichtX];
endfor;
DebugOut('Summe: '+IntToStr(WordSumme));
WordSumme:= WordSumme div 31;
DebugOut('LichtFilter-Mittel: '+IntToStr(WordSumme));
end;
Beisst sich da was evtl. mit einen anderen Treiber (I2C, TWI, ModBus RTU)?
Gruss
Thorsten