Basti87
06.11.2005, 13:26
Hallo,
ich habe bei mir einen Roboter angefangen zur Linienverfolgung.
Basis bildet ein Atmega64 Controller und als Programmierplattform E-Lab PED32 - Pascaldialekt.
Dazu möchte ich den ADC verwenden und habe auch schon die Werte mit getadc(i) abgefragt. Jedoch möchte ich gerne über die Register die Werte abfragen, da dies den Prozess beschleunigt. Bis dahin alles schön und gut, jedoch bekomme ich keine / unsinnige Werte über meine Abfrage.
Folgenden Code verwende ich für die ADC-Initalisierung und den Start der Konvertierung:
ADCSRA:=$CC;
FOR i :=0 TO 5 DO // i läuft von 0 bis 7 einmal durch
sensor:=i;
if i>0
then ADMUX:=$C0+Byte(potenz(2,word(i-1))); // AVCC, channel:=i
else ADMUX:=$C0;
endif;
//Hellwert
led[i]:=false; //LED einschalten
ADCSRA:=$CC; // Konvertierung starten
WaitSema(sema);
Die Werte werden im Interrupt eingetragen, der folgenderweise aussieht:
interrupt ADCRdy;
var sensl,sensh:byte;
begin
sensl :=ADCL;
sensh :=ADCH;
if led[i]
then
SensorN[sensor]:=(word(sensh) SHL 8) OR (word(sensl));
else
SensorL[sensor]:=(word(sensh) SHL 8) OR (word(sensl));
endif;
IncSema(sema);
end;
Die Register habe ich aus folgenden Gründen so gesetzt:
ADCSRA --> ADC einschalten, Konvertierung starten, kein Freilauf, Interrupt aktivieren und 16er Teiler
ADMUX --> interner Vergleich, rechtsjustiertes Ergebnis sowie Kanal
Als Wert bekomme ich für den 2. Sensor immer 259 und ansonsten 0 (z.T. aber auch Anzeigen wie "0 0" obwohl ich IntToStr(Sensor[i]:3) verwende).
ich habe bei mir einen Roboter angefangen zur Linienverfolgung.
Basis bildet ein Atmega64 Controller und als Programmierplattform E-Lab PED32 - Pascaldialekt.
Dazu möchte ich den ADC verwenden und habe auch schon die Werte mit getadc(i) abgefragt. Jedoch möchte ich gerne über die Register die Werte abfragen, da dies den Prozess beschleunigt. Bis dahin alles schön und gut, jedoch bekomme ich keine / unsinnige Werte über meine Abfrage.
Folgenden Code verwende ich für die ADC-Initalisierung und den Start der Konvertierung:
ADCSRA:=$CC;
FOR i :=0 TO 5 DO // i läuft von 0 bis 7 einmal durch
sensor:=i;
if i>0
then ADMUX:=$C0+Byte(potenz(2,word(i-1))); // AVCC, channel:=i
else ADMUX:=$C0;
endif;
//Hellwert
led[i]:=false; //LED einschalten
ADCSRA:=$CC; // Konvertierung starten
WaitSema(sema);
Die Werte werden im Interrupt eingetragen, der folgenderweise aussieht:
interrupt ADCRdy;
var sensl,sensh:byte;
begin
sensl :=ADCL;
sensh :=ADCH;
if led[i]
then
SensorN[sensor]:=(word(sensh) SHL 8) OR (word(sensl));
else
SensorL[sensor]:=(word(sensh) SHL 8) OR (word(sensl));
endif;
IncSema(sema);
end;
Die Register habe ich aus folgenden Gründen so gesetzt:
ADCSRA --> ADC einschalten, Konvertierung starten, kein Freilauf, Interrupt aktivieren und 16er Teiler
ADMUX --> interner Vergleich, rechtsjustiertes Ergebnis sowie Kanal
Als Wert bekomme ich für den 2. Sensor immer 259 und ansonsten 0 (z.T. aber auch Anzeigen wie "0 0" obwohl ich IntToStr(Sensor[i]:3) verwende).