Tutorial Arduino programmieren,

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Man muss das Format nicht umwandeln. Die 7-malige Division durch 10 ist völlig unnötig.

Und wie sieht es aus, wen ich die Zeit ausgeben will, ich denke kaum, das ich da auf eine Umwandlung verzichten kann ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
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: Tutorial Arduino programmieren,

Beitrag von Timm Thaler »

Mathias hat geschrieben:Und wie sieht es aus, wen ich die Zeit ausgeben will, ich denke kaum, das ich da auf eine Umwandlung verzichten kann ?


Du liest aber schon, was ich schreibe, oder? Im Nachbarthread zur DS-RTC?

Wenn Du eine Zeit auf Display oder per RS232 ausgeben willst, musst Du jede einzelne Ziffer auf Ascii wandeln. Bei Binärzahlen (uint8, uint16) musst Du dazu wieder durch 10 teilen. Bei packed BCD nimmst Du einfach das high Nibble (Wert shr 4) + $48 für die Zehner und das low Nibble (Wert and $0F) + $48 für die Einer. Das ist ja der Witz, und deswegen hat man früher BCD für sowas genommen: Es läßt sich ganz einfach wandeln, egal ob für Ziffernanzeige-Röhren, BCD-zu-7Segment-Decoder, Codierschalter, RS232, ASCII-Display.

BCD ist quasi der kleinste gemeinsame Nenner zwischen menschlichem Dezimalsystem und elektronischem Binärsystem.

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Da habe ich wohl etwas übersehen. Bei mir wird zwei mal gewandelt. Einmal mit bcd2bin(.. und einmal mit str(.. .
Und so wie du schreibst, kann man einen BCD-Wert sehr schnell in einen String umwandeln.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Ich habe es auf deine Weise umgesetzt, nur mit dem Unterschied das es 48 anstelle von $48 ist.

Mit folgendem Code klappt es:

Code: Alles auswählen

  procedure ReadDS3231neu(addr: UInt16);
  begin
    TWIStart((addr shl 1) or TWI_Write);
    TWIWrite(0);
    TWIStop;
 
    TWIStart((addr shl 1) or TWI_Read);
    Date.second := TWIReadACK_Error and $7F;   
 ....
  end;
 
begin
  ....
    ReadDS3231neu(I2CAddr);
    UARTSendString('Sec: ');
    UARTSendChar(char((Date.second shr 4) + 48));
    UARTSendChar(char((Date.second and $0F) + 48));
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
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: Tutorial Arduino programmieren,

Beitrag von Timm Thaler »

Ja "0" ist Hex 30 und Dez 48. Ich schreib des Verständnisses wegen immer uint8('0'), was im erzeugten Code auf das Gleiche hinauskommt, aber es wird sofort klar, was hier addiert wird.

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Ich habe gerade gesehen, das jemand angefangen hat, das Deutsche Tutorial in Englisch zu übersetzen.

Somit besteht die Chance, das es mehr AVR-Anhänger für Lazarus gibt. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Tutorial Arduino programmieren,

Beitrag von wp_xyz »

Bin Arduino-Neuling und mache meine ersten Geh-Versuche. Da hilft das Tutorial sehr - danke! Muss allerdings feststellen, dass die Programmierung des Arduino mit Lazarus viel komplizierter ist als mit der Arduino-IDE. Es wäre hilfreich, wenn man eine Unit mit so typischen Arduino-IDE-Befehlen wie "DigitalRead", "DigitalWrite", "AnalogRead", "AnalogWrite", "Delay" etc. hätte (aber viellicht wird so eine auch auf einer der anderen 21 Seiten dieses Monster-Threads vorgestellt, die ich nicht alle durchgesehen habe)

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Es wäre hilfreich, wenn man eine Unit mit so typischen Arduino-IDE-Befehlen wie "DigitalRead", "DigitalWrite", "AnalogRead", "AnalogWrite", "Delay" etc. hätte

Wäre machbar, aber genau dies wollen wir vermeiden, mit den direkten Zugriffe, weis man genau, was man macht.
Wen du mal das hier durchliest: https://wiki.freepascal.org/AVR_Embedde ... _output/de , wirst du sehen, das es mit Pascal einfacher ist, als mir Arduino C++.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Tutorial Arduino programmieren,

Beitrag von wp_xyz »

Mathias hat geschrieben:
Es wäre hilfreich, wenn man eine Unit mit so typischen Arduino-IDE-Befehlen wie "DigitalRead", "DigitalWrite", "AnalogRead", "AnalogWrite", "Delay" etc. hätte

Wäre machbar, aber genau dies wollen wir vermeiden, mit den direkten Zugriffe, weis man genau, was man macht.
Wen du mal das hier durchliest: https://wiki.freepascal.org/AVR_Embedde ... _output/de , wirst du sehen, das es mit Pascal einfacher ist, als mir Arduino C++.

Sehe ich total anders. Warum programmierst du das Ding nicht gleich in Assembler? "Da weiß man genau, was man macht."

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Hast du das Tutorial gelesen, dann solltest du sehen, das Pinzugriffe einfacher als mit Arduino sind.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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: Tutorial Arduino programmieren,

Beitrag von pluto »

Sehe ich total anders. Warum programmierst du das Ding nicht gleich in Assembler? "Da weiß man genau, was man macht."

Aber nein, dann solltest du gleich Rust und STM32 nehmen, und wirst fluchen, weil du kaum Tutorials findest im Internet.... und musst dir alles selbst beibringen oder Datenblätter lesen und verstehen.....
MFG
Michael Springwald

Timm Thaler
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: Tutorial Arduino programmieren,

Beitrag von Timm Thaler »

wp_xyz hat geschrieben:Es wäre hilfreich, wenn man eine Unit mit so typischen Arduino-IDE-Befehlen wie "DigitalRead", "DigitalWrite", "AnalogRead", "AnalogWrite", "Delay" etc. hätte


Leider holt man sich damit wieder einen Wasserkopf an unnötigen und teils störenden Routinen rein.

Zum Beispiel macht ein DigitalWrite bei Arduino viel mehr als einfach den Pin auf High oder Low setzen: Dadurch dass man den Pin als Variable ansprechen kann, muss der erstmal geshiftet und maskiert werden. Aus einem einzigen sbi / cbi Befehl wird da schnell ein loop-shift-in-mask-out mit einem Dutzend Befehlen - die in 99% der Fälle überflüssig sind, denn wann muss man schon mal einen Portpin variabel ansprechen.

Oder delay - arbeitet mit dem Timer Interrupt. Unnötigerweise. Allerdings beeinflußt das die PWM, so dass bei Delay die PWM dieses Timers nicht mehr nutzbar ist.

wp_xyz hat geschrieben:Sehe ich total anders. Warum programmierst du das Ding nicht gleich in Assembler?


Habe ich jahrelang gemacht, und Inline-ASM baue ich immer wieder ein, weil einige Dinge gar nicht anders gehen (String aus Flash lesen, Lockup-Table aus Flash lesen). Ist aber fehleranfällig, man kann schonmal stundenlang suchen, bis man werk dass man statt eines lds (lade aus Speicher) ein ldi (lade Konstante) geschrieben hat, das Programm läuft, aber irgendwas stimmt da nicht...

Mit Pascal werden die Programme grundsätzlich größer, weil:
- Der Compiler optimiert nicht immer so gut, wie man das in ASM könnte.
- Es macht mit Pascal soviel Spass, dass man noch das und das Gimmick einprogrammiert, was man sich in ASM schenken würde. ;-)

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Das DigitalWrite ist ein sehr gutes Beispiel, wie Arduino sehr viel Resourcen verschwendet.
Ein Schieberegister steuert Arduino sehr gemütlich an, weil intern gemütlich mit DigitalWrite gearbeitet wird.
Und wie Timm schon sagt, versuche mal mit Arduino alle 3 Timer zu nutzen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Tutorial Arduino programmieren,

Beitrag von Mathias »

Das DigitalWrite ist ein sehr gutes Beispiel, wie Arduino sehr viel Resourcen verschwendet.
Ein Schieberegister steuert Arduino sehr gemütlich an, weil intern gemütlich mit DigitalWrite gearbeitet wird.
Und wie Timm schon sagt, versuche mal mit Arduino alle 3 Timer zu nutzen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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: Tutorial Arduino programmieren,

Beitrag von af0815 »

ich habe mich zu dem Thema etwas versucht zu beschäftigen https://github.com/afriess/Laz_AVR_Lib dabei habe ich gesehen wie komplex die Materie ist. Durch die vielen Register mit den Möglichkeiten und den Interrupts wird es ganz schön unübersichtlich, wenn man es flexibler haben will.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten