Arduino mit Lazarus: Nur für Nerds?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von theo »

Bin immer noch am Üben. :wink:
Ein ganz schönes Gefrickel, so ein kleines Thermometer zusammenzustöpseln.
ardu_temp_7.jpg
ardu_temp_7.jpg (160.16 KiB) 3365 mal betrachtet

Die LM35 Temperatursensor Daten muss man anscheinend gegen die Betriebsspannung berechnen.
Dummerweise ist am USB die Spannung, je nach Quelle und was sonst noch so eingesteckt ist, nicht immer genau 5V.

Ich habe einen Arduino-Code gefunden, welcher die tatsächliche VCC Spannung zurückgibt:

Code: Alles auswählen

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}
Damit lässt sich die Berechnung korrigieren und so bewegen sich die Temp Messwerte innerhalb des Genauigkeitsbereichs.
Versteht diesen Code jemand? Ist der gut? :wink:

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

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von pluto »

theo hat geschrieben:Damit lässt sich die Berechnung korrigieren und so bewegen sich die Temp Messwerte innerhalb des Genauigkeitsbereichs.
Versteht diesen Code jemand? Ist der gut?
Das ist ein Standard Arduino Code. Du list hier die reference Spannung aus, die sollte recht genau sein.
Nur wie verhält sich das bei Temperatur Änderungen?

Warum suchst du dir auch gleich ein "LM35" aus? und kein am2302 oder bme280... die sind deutlich einfacher auszulesen :D
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von theo »

pluto hat geschrieben:
Di 1. Sep 2020, 00:40
Das ist ein Standard Arduino Code. Du list hier die reference Spannung aus, die sollte recht genau sein.
Nur wie verhält sich das bei Temperatur Änderungen?
Ich weiss nicht genau, was du meinst.
pluto hat geschrieben:
Di 1. Sep 2020, 00:40
Warum suchst du dir auch gleich ein "LM35" aus? und kein am2302 oder bme280... die sind deutlich einfacher auszulesen
Habe ich mir nicht ausgesucht. Ich arbeite nur mein Starter Kit durch.. :wink:
Schwierig auszulesen ist der aber nicht. Ist halt analog.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von Warf »

af0815 hat geschrieben:
Mo 31. Aug 2020, 19:54
Hast du dir den Thread angesehen, also ich würde es bei Arduino uno schon mal probieren. Wenn wer lust hat und es mit der Methode nicht funktioniert, dann muss man sowieso auf das alt hergebrachte zurück.
Ja, doch das kann auch in die hose gehen:
Du baust dein programm, alles super. Dann ein jahr später willst du das program verändern, lädst dir die komponente runter, deren neue version jetzt andere compiler switches benutzt oder manche der funktionen annotiert hat, und zack du hast einen haufen Linker fehler. Oder ein GCC update kommt raus der das optimization verhalten ändert, und jetzt hast du auf zwei rechnern ne unterschiedliche gcc version und es baut auf dem einen aber nicht auf dem anderen.

Das sind genau die arten von Fehlern die einem graue haare verpassen, weil man sich dann dumm und dämlich suchen muss in quelltext den man selbst nicht geschrieben hat (besonders wenn das nur bei bestimmten optimierungsstufen oder so vorkommt). Während wenn man einmal die klassen flatened, dann kan in der Lib und im Compiler intern passieren was will (solang sich natürlich nicht das C++ interface ändert), es funktioniert
Timm Thaler hat geschrieben:
Mo 31. Aug 2020, 22:13
Aber ob das gut geht? Bisher hab ich keine guten Erfahrungen mit object und AVR gemacht. Es wird jede Menge Overhead produziert.
Theoretisch gibt es nix was daran overhead erzeugen sollte (solang man natürlich kein RTTI oder so kram benutzt, falls das mit objects überhaupt geht).

Ich hatte allerdings mal ein paper gelesen was die procedural (C) und OOP (C++) auf eingebetteten systemen vergleicht, und hat eine starke OOP penalty festgestellt (10%-20% performance, 20%-40% größe, 10%-15% stromverbrauch): Link
Das vergleicht aber im allgemeinen OOP patterns mit proceduralen patterns, ist also kein Code der für Embedded systems optimiert wurde, sondern code der so geschrieben wurde um möglichst viel High-Level OOP kram zu benutzen (z.b. iteratoren), da kann man bestimmt also noch was rausholen.

Und zumindest in sehr kleinen test programmen produzieren variablen und funktionen und advanced records mit methoden das selbe assembly beim fpc (zumindest auf x86). Klar, wenn man jetzt objects mit vtables benutzt, kann das das program ganz schön aufblähen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von af0815 »

@warf: Das Risiko ist mir bewusst, weiters sind wir hier bei AVR und weiters ist das OpenSource :-)

Aber, dasselbe Risiko habe ich wenn ich FPC/Lazarus verwende und es kommen breaking Changes. Ich sehe es ja bei meinem 3D Drucker, da kann ich auch nicht mit jeder Arduino Version arbeiten. Da funktioiniert auch nur immer der aktuelle stable und keine älteren Versionen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von PascalDragon »

Warf hat geschrieben:
Mo 31. Aug 2020, 18:55
af0815 hat geschrieben:
Mo 31. Aug 2020, 16:22
Genau darum ging es dort im Thread, da gibt es paar features

Code: Alles auswählen

type
  THardwareTimer =  cppclass external name 'HardwareTimer'
  public
    procedure pause;
  end;
Damit sollte das flatten für einfache Sachen wie bei Arduino erschlagen sein. (Soweit ich den Thread verstanden habe)
Oha! das würde ich nicht benutzen. Das bedeutet das der FPC Annahmen über die Namensgebung und die calling convention des Compilers. Grade die namensgebung kann mit compilerswitches und gcc c++ language extensions verändert werden (z.b. kann man sagen das für eine bestimmte Funktion der Name nicht mit __ anfangen soll). Und die calling convention kann massiv abbhängig vom Optimierungslevel sein.
Es kommt also nicht mal nur auf den entsprechenden compiler an, sondern, wenn z.b. eine lib viel mit asembly arbeitet (was ich mir bei avr gut vorstellen kann), kann es gut sein das durch spezielle g++ switches die funktionen massiv von der gcc norm abweichen, um halt besser im assembly benutzt werden zu können
Nur weil es die Möglichkeit gibt in GCC da was umzustellen, heißt das nicht, dass auch jeder davon Gebrauch macht. Wir reden hier von einem recht eingeschränkten Usecase, nämlich die Bibliotheken von Arduino, für die das ansonsten noch recht eingeschränkte cppclass-Feature wie geschaffen ist (vor allem, da keine virtuellen Funktionen und ähnliches verwendet werden).
Mathias hat geschrieben:
Mo 31. Aug 2020, 22:23
Timm Thaler hat geschrieben:
Mo 31. Aug 2020, 22:13
Aber ob das gut geht? Bisher hab ich keine guten Erfahrungen mit object und AVR gemacht. Es wird jede Menge Overhead produziert.
So wie ich mich errinern mag, braucht sogar ein Record mehr Platz als lose Variablen und Methode.
Weder TP objects noch record (egal ob mit Methoden oder ohne) haben für sich selbst großen Overhead. Was Overhead erzeugt sind die folgenden Punkte:
  • Verwendung von virtuellen Methoden in einem object (einschließen erben von einem solchen)
  • Verwendung von Managed Typen in einem object oder record (wobei diese Typen unter AVR standardmäßig deaktiviert sind)
  • Zugriff auf die RTTI (wobei dies vorwiegend Speicheroverhead ist)
  • Verwendung von Managed Records (weil hierdurch records zu einem Managed Type werden)
  • Dynamische Allokation von object/record Instanzen (im Gegensatz zu globalen oder Stackvariablen)
Ansonsten sind object, record und auch cppclass (welcher sich eher wie object/record hinsichtlich der Speicherverwaltung verhält denn als class) erstmal nur eine Ansammlung von Methoden, welche auch nur eingelinkt werden, wenn sie verwendet werden.
FPC Compiler Entwickler

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von af0815 »

Danke an PascalDragon für die ausführlichen Erklärungen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von mschnell »

Meine Meinung:

Wenn etwas "einfach" sein soll, ist es zwangsläufig immer speziell.

Wer es also einfach haben will mit einem (embedded) Software Projekt, muss sich damit abfinden, dass er
- spezielle Hardware (bei embedded)
- eine vom Lieferanten der IDE ausgesuchte Programmiersprache
- eingeschränkte Möglichkeiten
usw. in Kauf nehmen muss.

Wer sein Vorwissen verwenden will, wird mit solchen "einfachen" Umgebungen nicht hinkommen, aber er ist ja auch ein "Nerd".

-Michael

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

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von Mathias »

theo hat geschrieben:
Mo 31. Aug 2020, 23:41
Bin immer noch am Üben. :wink:
Ein ganz schönes Gefrickel, so ein kleines Thermometer zusammenzustöpseln.

ardu_temp_7.jpg


Die LM35 Temperatursensor Daten muss man anscheinend gegen die Betriebsspannung berechnen.
Dummerweise ist am USB die Spannung, je nach Quelle und was sonst noch so eingesteckt ist, nicht immer genau 5V.

Ich habe einen Arduino-Code gefunden, welcher die tatsächliche VCC Spannung zurückgibt:

Code: Alles auswählen

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}
Damit lässt sich die Berechnung korrigieren und so bewegen sich die Temp Messwerte innerhalb des Genauigkeitsbereichs.
Versteht diesen Code jemand? Ist der gut? :wink:
Dies macht fast das gleiche, wie dieser Lazarus-Code: https://wiki.freepascal.org/AVR_Embedde ... og_Read/de
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von theo »

Mathias hat geschrieben:
Di 1. Sep 2020, 14:24
Dies macht fast das gleiche, wie dieser Lazarus-Code: https://wiki.freepascal.org/AVR_Embedde ... og_Read/de
Jaja, nur wusste ich halt nicht, wo diese komischen Wörter wie ADMUX, REFS0 etc. herkommen.
Ich fürchte, um diese zu verorten, muss man so einen Schinken lesen.
Ob die Liebe zum Thema dann so gross ist?
Ich denke, wenn man nicht beruflich damit zu tun hat, oder ein ambitioniertes Hobby-Projekt verfolgt, wird man sich das freiwillig wohl eher nicht antun.
Deshalb finde ich die Arduino Idee eigentlich ganz gut.
Und man sollte nicht vergessen, wir sind hier im Lazarus- und nicht im "Maschinencode-die-hard" Forum.
Auch Delphi/Lazarus verdankt sein Überleben der Einsteigerfreundlichkeit und nicht dem Befehlszyklus reduzieren und Bytes sparen (Ja, ist nicht vergleichbar mit Mikrocontrollern).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von af0815 »

Gleich RasPi mit Lazarus nehmen :D SCNR
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von theo »

af0815 hat geschrieben:
Di 1. Sep 2020, 17:29
Gleich RasPi mit Lazarus nehmen :D SCNR
Ist das einfacher? (Keine Scherzfrage, bin ahnungslos).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von af0815 »

Aufwand ist in etwa gleich. Es gibt die Bastelboxen, die du für den Arduino hast, fast gleich für den RasPi ausgestattet.

Für einfache Sachen und wo Strom keine Rolle spielt und besonders dann wenn IPKommunikation dabei ist, nehme ich den RasPi. Wenn es mit Akku bzw. Batterie läuft, so kommst du an AVR nicht vorbei.

Für die ursprüngliche Aufgabe von dir, ist der RasPi optimal. Ein paar IO und Videos abspielen das ist für den RasPi maßgeschneidert. Der Code von mir den ich gepostet ist im Industriellen Einsatz, also Fertigungtauglich. Und das ist ja bekanntlich die Steigerung von Idiotensicher. :mrgreen:

Übrigends ist manchmal einfacher den Arduinocode zu verstehen, als die originale Doku :lol:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von Mathias »

Wen man einen AVR voll ausreizen will, was der Stromverbrauchbanbelangt, dann muss man sich mit Fuses auseinandersetzen.
Damit kann man die Taktrate runtersetzen.
Dann ist es aber um so wichtiger, das man effizienten Code erzeugt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Arduino mit Lazarus: Nur für Nerds?

Beitrag von theo »

af0815 hat geschrieben:
Di 1. Sep 2020, 17:53
Aufwand ist in etwa gleich.
Aber ist es denn nicht so, dass beim AVR der begrenzte Speicher und die begrenze Performance es verhindern, ein bequemes API zu benutzen? (Arduino IDE ist euch ja offenbar zu wenig optimiert).
Die Bitschubsereien bzw. Zyklen-Sparerei kommt doch im Wesentlichen aus dieser Mangelsituation.

Hätte denn der Raspi nicht genügend Speicher und Leistung um es dort einfacher für den Benutzer (Programmierer) zu machen?

Antworten