Plutos-AVR

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

Re: Plutos-AVR

Beitragvon Mathias » 8. Sep 2018, 15:14 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.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Timm Thaler » 8. Sep 2018, 15:40 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.
Timm Thaler
 
Beiträge: 730
Registriert: 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
Nach oben

Beitragvon Mathias » 8. Sep 2018, 15:45 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.
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
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 8. Sep 2018, 15:54 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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6704
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon pluto » 8. Sep 2018, 15:55 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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6704
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon pluto » 8. Sep 2018, 16:10 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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6704
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 8. Sep 2018, 16:12 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;<  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: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 8. Sep 2018, 16:17 Re: Plutos-AVR

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
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 8. Sep 2018, 16:31 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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6704
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon pluto » 8. Sep 2018, 17:54 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.
MFG
Michael Springwald
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6704
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Timm Thaler » 8. Sep 2018, 18:31 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.
Timm Thaler
 
Beiträge: 730
Registriert: 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
Nach oben

• Themenende •
Vorherige

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried