Plutos-AVR
-
- Beiträge: 6204
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Plutos-AVR
Du hast sogar mehrere Fehler eingebaut. Einer ist, deine for Schleifen überlaufen.
Das ^ hast du ingnoriert. Was es in C ist weis ich auch nicht auswendig, aber auf keinen Fall ein Pointer.
Das ^ hast du ingnoriert. Was es in C ist weis ich auch nicht auswendig, aber auf keinen Fall ein Pointer.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Plutos-AVR
Mathias hat geschrieben:Das ^ hast du ingnoriert. Was es in C ist weis ich auch nicht auswendig, aber auf keinen Fall ein Pointer.
^= ist XOR-Zuweisung.
crc ist eine Checksumme, die über jedes Bit (shift) gebildet wird. Bescheuert, weil zeitaufwendig durch das Shift. Wenn möglich würde ich die weglassen.
-
- Beiträge: 6204
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Plutos-AVR
Ich habe es dir richtig übersetzt, so verstehst du vielleicht eher was dort passiert.
Es geht sogar mit dem Pointer wie im original Code.
Das hat den Vorteil, du kannst ziemlich alles der Funktion übergeben, egal ob String, Array, Record oder eine einfache Variable.
Es geht sogar mit dem Pointer wie im original Code.
Das hat den Vorteil, du kannst ziemlich alles der Funktion übergeben, egal ob String, Array, Record oder eine einfache Variable.
Code: Alles auswählen
function Adafruit_AM2320(buffer: PByte; nbytes: byte): UInt16;
var
crc: UInt16 = $FFFF;
b: UInt8;
i, x: byte;
begin
for i := 0 to nbytes - 1 do begin
b := buffer[i];
crc := crc xor b;
for x := 0 to 7 do begin
if crc and $0001 <> 0 then begin
crc := crc shr 1;
crc := crc xor $A001;
end else begin
crc := crc shr 1;
end;
end;
end;
Result := crc;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
buf:ShortString;
begin
buf:='Hello World';
WriteLn(Adafruit_AM2320(@buf[1], Length(buf)));
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7180
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Plutos-AVR
Du hast sogar mehrere Fehler eingebaut. Einer ist, deine for Schleifen überlaufen.
Bei den For schleifen war ich mir nicht ganz sicher. Im C Code heißt es:
"for (int x=0; x<8; x++) {"
Also müsste es in Pascal wohl:
Code: Alles auswählen
for x:=0 to 7 do begin
^= ist XOR-Zuweisung.
Ich habe das für ein Pointer gehalten... In Pascal würde das dann wohl so aussehen:
Code: Alles auswählen
crc =crc xor $A001;
?
Code: Alles auswählen
crc ist eine Checksumme, die über jedes Bit (shift) gebildet wird. Bescheuert, weil zeitaufwendig durch das Shift. Wenn möglich würde ich die weglassen.
Ich brauche diese Funktion eigentlich nicht, weil es läuft ja auch so relativ gut, aber ich dachte halt, es wäre Sinnvoll sie einzubauen.
Du bisst da wohl andere Meinung?
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 7180
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Plutos-AVR
Ich habe es dir richtig übersetzt, so verstehst du vielleicht eher was dort passiert.
Danke, habe ich erst später gelesen....
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 7180
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Plutos-AVR
Code: Alles auswählen
...
the_crc:=buffer[5];
the_crc:=the_crc shl 8;
the_crc:=the_crc or buffer[4];
calc_crc:=crc16(@buffer,4);
if the_crc <> calc_crc then begin
result:=0;
Error:=true;
exit;
end;
...
So scheint es zu Funktionieren. Vielen Danke für eure Hilfe. Die Frage ist nun: Ist die Funktion "crc16" Sinnvoll oder nicht?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 6204
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Plutos-AVR
Bei den For schleifen war ich mir nicht ganz sicher. Im C Code heißt es:
In C kann man For-Schleifen auf mehrere Arten schreiben. Gebräuchlich sind dabei 2 Stück.
Beide Beispiele laufen von 0 bis 7 durch.
Code: Alles auswählen
for (int i = 0; i < 8; i++)....
for (int i = 0; i <= 7; i++)....
Was C++ einen grossen Vorteil gegenüber Pascal hat, man ist nicht auf 1er Schritte beschränkt.
Es gehen sogar Fliesskommazahlen.
Ein kleines Beispiel:
Code: Alles auswählen
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i <= 8; i += 2) {
cout << i << ' ';
}
cout << endl;
for (float i = 1.2; i <= 8.0; i += 0.3) {
cout << i << ' ';
}
return 0;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6204
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Plutos-AVR
Dies musst du selbst entscheiden.Ist die Funktion "crc16" Sinnvoll oder nicht?
Wen du möglichst viele Messungen pro Sekunde machen willst, dann weglassen.
Aber wen du genügend Zeit hast, würde ich sie einbauen, vorausgesetzt du hast noch vorigen Platz in deinem AVR.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 7180
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Plutos-AVR
Dies musst du selbst entscheiden.
Gut, dann werde ich es mir überlegen.... Es ist ja nicht nur für mich, sondern auch für die Allgemeinheit.
Vielleicht werde ich es über ein Kompilierschalter machen:
Der im Normalfall aktiv ist, aber man kann ihn dann auch ausschalten um Zeit und Speicherplatz zu sparen, wenn Sicherheit nicht so wichtig ist.....
Wäre das eine Art Kompromiss?
Aufjedenfall habe ich eine Menge über C++ Gelernt....
Da das jetzt soweit läuft, werde ich wohl beim BME 280 weiter machen...
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 7180
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Plutos-AVR
Ersten Beitrag bearbeitet und ein neues Archiv hochgeladen....
Probleme habe ich noch mit den Timern, die verstehe ich derzeit noch nicht.
Ich möchte z.b. das jede Mikrosekunde eine Variable hochgezählt wird.
Probleme habe ich noch mit den Timern, die verstehe ich derzeit noch nicht.
Ich möchte z.b. das jede Mikrosekunde eine Variable hochgezählt wird.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Plutos-AVR
Mathias hat geschrieben:Ich habe es dir richtig übersetzt, so verstehst du vielleicht eher was dort passiert.
Ach komm, das hast Du hier abgeschrieben: https://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung#Berechnung_einer_CRC-Pr%C3%BCfsumme_in_C_und_Pascal_bzw._Delphi => CRC-16
Da steht auch was zur Theorie, was da passiert und warum man das macht.