Plutos-AVR

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

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.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1081
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

Beitrag von Timm Thaler »

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.

Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

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.

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 gün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

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

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Ich habe es dir richtig übersetzt, so verstehst du vielleicht eher was dort passiert.

Danke, habe ich erst später gelesen....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

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

Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

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;<  8; i++)....
for (int i = 0;<=  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 gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

Ist die Funktion "crc16" Sinnvoll oder nicht?
Dies musst du selbst entscheiden.

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 gün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

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

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

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.
MFG
Michael Springwald

Timm Thaler
Beiträge: 1081
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

Beitrag von Timm Thaler »

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.

Antworten