Hallo Thomas.
Es ist die aktuelle Compilerversion 4.99.72.
Ich habe es in der V4.99.71 und V4.99.72 getestet, es läuft ohne Probleme!
Hier mal mein Beispielcode:
Ich bin kein Profi im Bezug auf den ADC und Float-Berechnung, aber ich komme klar.
Werte die auf der Ser ausgegeben werden:
Sensor1: 503
Sensor1 Volt: 2.46
Sensor2: 326
Sensor2 Volt: 1.59
Flow: 252
Flow Volt: 1.23
Hier die Werte mit Deiner Formel:
Sensor1: -0.510
Sensor2: -0.73
Flow: 252.00
Data kommt maximal mit 1024 rein, wir nehmen mal die Werte von Sensor1 503 Digits/Einheiten an:
1. Step: 920-503 = 417
2. Step: 417 / 818 =0,509779951.....
3.Step: =- 0,509779951
Und das Stimmt auch perfekt mit dem Ausgabe Wert überein "Sensor1: -0.510"
Aber nehme mal das Testprogramm von mir, ich habe leider nicht den gleichen Controller wie Du, aber die Werte passen wie die Faust aufs Auge mit dem was mein Messgerät anzeigt.
Egal ob V4.99.71 oder V4.99.72
Schau doch einfach mal mit der Schift-Taste in den Quellcode rein (Schift drücken und GETADC(-...) anklicken). Bei meiner Routine siehst DU ganz klar die verschiedenen Adressen:
Vieleicht stimmt die VErsion bei deinen Controller ja wirklich nicht und es stehen am Port 0 und 1 die selben Adressen.
Gruss
Thorsten
Quote by ThomasW69
Es ist die aktuelle Compilerversion 4.99.72.
Ich habe es in der V4.99.71 und V4.99.72 getestet, es läuft ohne Probleme!
Hier mal mein Beispielcode:
Code
program ADC_Test;
{$NOSHADOW}
{ $WG} {global Warnings off}
Device = mega1284P, VCC=5;
{ $BOOTRST $0F000} {Reset Jump to $0F000}
Define_Fuses
Override_Fuses;
NoteBook = E;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [SPIEN, JTAGEN, OCDEN];
ProgMode = JTAG;
Import SysTick, SerPort, ADCPort;
From System Import Float;
Define
ProcClock = 14745600; {Hertz}
SysTick = 10; {msec}
StackSize = $00C8, iData;
FrameSize = $00C8, iData;
SerPort = 57600, Stop1; {Baud, StopBits|Parity}
RxBuffer = 60, iData;
TxBuffer = 60, iData;
ADCchans = 3, iData, Int2;
ADCpresc = 128;
Implementation
{$IDATA}
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Const Declarations }
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
VAR
Senspress1 : Float;
Senspress2 : Float;
Flow : Float;
iSenspress1 : Integer;
iSenspress2 : Integer;
iFlow : Integer;
{--------------------------------------------------------------}
{ functions }
// Funktion von ThomasW69 eLab
Procedure ReadSensors;
var Data: word;
begin
Data:=GetADC(1); //Drucksensor1
Senspress1:=-(float(920-Data)/818.0);
Data:=GetADC(2); //Drucksensor 2
Senspress2:=-(float(920-Data)/818.0);
Data:=GetADC(3); //Durchflusssensor
Flow:=(float(Data)); //Rohdaten lesen
end;
// Vereinfachte Funktion ohne Berechnung als Integer
Procedure ReadSensorsInt;
begin
iSenspress1:=Integer( GetADC(1) ); //Drucksensor1
iSenspress2:=Integer( GetADC(2) ); //Drucksensor 2
iFlow:=Integer( GetADC(3) ); //Durchflusssensor
end;
// Berechne anhand der ADC-Werte die Spannung als Float
Function Voltage( var IntWert : integer):FLOAT;
var
TeilWert : Float;
FloatBuffer : Float;
begin
//Berechne Wert pro ADC-Einheit, 5V durch 1024 Einheiten
Teilwert:= 5/1024;
//Rechne Spannung aus
FloatBuffer:= Float( IntWert ) * Teilwert;
return( FloatBuffer );
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
EnableInts;
WriteLn(serout, 'Debug: System gestartet...');
loop //Zyklus
mdelay(3000); // Kleine Pause :-) 3s
ReadSensorsInt; // Lese Routine von ThomasW69 starten
WriteLn(serout, 'Sensor1: '+ IntToStr (iSenspress1));
WriteLn(serout, 'Sensor1 Volt: '+ FloatToStr( Voltage( iSenspress1):3:2));
WriteLn(serout, 'Sensor2: '+ IntToStr (iSenspress2));
WriteLn(serout, 'Sensor2 Volt: '+ FloatToStr( Voltage( iSenspress2):3:2));
WriteLn(serout, 'Flow: '+ IntToStr (iFlow));
WriteLn(serout, 'Flow Volt: '+ FloatToStr( Voltage( iFlow):3:2));
//Ausgabe mit Formel von ThomasW69
ReadSensors; // Lese Routine von ThomasW69 starten
WriteLn(serout, 'Sensor1: '+ FloatToStr(Senspress1:3:3));
WriteLn(serout, 'Sensor2: '+ FloatToStr(Senspress2:3:2));
WriteLn(serout, 'Flow: '+ FloatToStr(Flow:3:2));
endloop;
end ADC_Test.
{$NOSHADOW}
{ $WG} {global Warnings off}
Device = mega1284P, VCC=5;
{ $BOOTRST $0F000} {Reset Jump to $0F000}
Define_Fuses
Override_Fuses;
NoteBook = E;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [SPIEN, JTAGEN, OCDEN];
ProgMode = JTAG;
Import SysTick, SerPort, ADCPort;
From System Import Float;
Define
ProcClock = 14745600; {Hertz}
SysTick = 10; {msec}
StackSize = $00C8, iData;
FrameSize = $00C8, iData;
SerPort = 57600, Stop1; {Baud, StopBits|Parity}
RxBuffer = 60, iData;
TxBuffer = 60, iData;
ADCchans = 3, iData, Int2;
ADCpresc = 128;
Implementation
{$IDATA}
{--------------------------------------------------------------}
{ Type Declarations }
type
{--------------------------------------------------------------}
{ Const Declarations }
{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
VAR
Senspress1 : Float;
Senspress2 : Float;
Flow : Float;
iSenspress1 : Integer;
iSenspress2 : Integer;
iFlow : Integer;
{--------------------------------------------------------------}
{ functions }
// Funktion von ThomasW69 eLab
Procedure ReadSensors;
var Data: word;
begin
Data:=GetADC(1); //Drucksensor1
Senspress1:=-(float(920-Data)/818.0);
Data:=GetADC(2); //Drucksensor 2
Senspress2:=-(float(920-Data)/818.0);
Data:=GetADC(3); //Durchflusssensor
Flow:=(float(Data)); //Rohdaten lesen
end;
// Vereinfachte Funktion ohne Berechnung als Integer
Procedure ReadSensorsInt;
begin
iSenspress1:=Integer( GetADC(1) ); //Drucksensor1
iSenspress2:=Integer( GetADC(2) ); //Drucksensor 2
iFlow:=Integer( GetADC(3) ); //Durchflusssensor
end;
// Berechne anhand der ADC-Werte die Spannung als Float
Function Voltage( var IntWert : integer):FLOAT;
var
TeilWert : Float;
FloatBuffer : Float;
begin
//Berechne Wert pro ADC-Einheit, 5V durch 1024 Einheiten
Teilwert:= 5/1024;
//Rechne Spannung aus
FloatBuffer:= Float( IntWert ) * Teilwert;
return( FloatBuffer );
end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
EnableInts;
WriteLn(serout, 'Debug: System gestartet...');
loop //Zyklus
mdelay(3000); // Kleine Pause :-) 3s
ReadSensorsInt; // Lese Routine von ThomasW69 starten
WriteLn(serout, 'Sensor1: '+ IntToStr (iSenspress1));
WriteLn(serout, 'Sensor1 Volt: '+ FloatToStr( Voltage( iSenspress1):3:2));
WriteLn(serout, 'Sensor2: '+ IntToStr (iSenspress2));
WriteLn(serout, 'Sensor2 Volt: '+ FloatToStr( Voltage( iSenspress2):3:2));
WriteLn(serout, 'Flow: '+ IntToStr (iFlow));
WriteLn(serout, 'Flow Volt: '+ FloatToStr( Voltage( iFlow):3:2));
//Ausgabe mit Formel von ThomasW69
ReadSensors; // Lese Routine von ThomasW69 starten
WriteLn(serout, 'Sensor1: '+ FloatToStr(Senspress1:3:3));
WriteLn(serout, 'Sensor2: '+ FloatToStr(Senspress2:3:2));
WriteLn(serout, 'Flow: '+ FloatToStr(Flow:3:2));
endloop;
end ADC_Test.
Ich bin kein Profi im Bezug auf den ADC und Float-Berechnung, aber ich komme klar.
Werte die auf der Ser ausgegeben werden:
Sensor1: 503
Sensor1 Volt: 2.46
Sensor2: 326
Sensor2 Volt: 1.59
Flow: 252
Flow Volt: 1.23
Hier die Werte mit Deiner Formel:
Sensor1: -0.510
Sensor2: -0.73
Flow: 252.00
Data kommt maximal mit 1024 rein, wir nehmen mal die Werte von Sensor1 503 Digits/Einheiten an:
1. Step: 920-503 = 417
2. Step: 417 / 818 =0,509779951.....
3.Step: =- 0,509779951
Und das Stimmt auch perfekt mit dem Ausgabe Wert überein "Sensor1: -0.510"
Aber nehme mal das Testprogramm von mir, ich habe leider nicht den gleichen Controller wie Du, aber die Werte passen wie die Faust aufs Auge mit dem was mein Messgerät anzeigt.
Egal ob V4.99.71 oder V4.99.72
Schau doch einfach mal mit der Schift-Taste in den Quellcode rein (Schift drücken und GETADC(-...) anklicken). Bei meiner Routine siehst DU ganz klar die verschiedenen Adressen:
Code
ADC_Test.ReadSensorsInt:
.RETURNS 0
.BLOCK 76
.LINE 77
LDI _ACCA, 001h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.ISENSPRESS1, _ACCB
STS ADC_TEST.ISENSPRESS1+1, _ACCA
.LINE 78
LDI _ACCA, 002h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.ISENSPRESS2, _ACCB
STS ADC_TEST.ISENSPRESS2+1, _ACCA
.LINE 79
LDI _ACCA, 003h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.IFLOW, _ACCB
STS ADC_TEST.IFLOW+1, _ACCA
.ENDBLOCK 80
.RETURNS 0
.BLOCK 76
.LINE 77
LDI _ACCA, 001h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.ISENSPRESS1, _ACCB
STS ADC_TEST.ISENSPRESS1+1, _ACCA
.LINE 78
LDI _ACCA, 002h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.ISENSPRESS2, _ACCB
STS ADC_TEST.ISENSPRESS2+1, _ACCA
.LINE 79
LDI _ACCA, 003h
.FRAME 0
CALL SYSTEM.GETADC
STS ADC_TEST.IFLOW, _ACCB
STS ADC_TEST.IFLOW+1, _ACCA
.ENDBLOCK 80
Vieleicht stimmt die VErsion bei deinen Controller ja wirklich nicht und es stehen am Port 0 und 1 die selben Adressen.
Gruss
Thorsten