[Arduino IDE] Feinheiten und Tricks

Das ist eine sehr gute Frage. Ich kopiere da als Workaround die Zeile mit dem avrdude bzw Python Skript und füge sie in eine DOS-Box ein.

DOS-Box heißt glaube heute comand prompt. cmd.exe

Kann man die IDE irgendwie dazu bewegen, nicht immer den Sketch neu zu kompilieren, wenn bei einem Upload Fehler (falscher COM, Timout o.ä.) aufgetreten sind.

Mir nicht bekannt.

Aber dennoch eine gute Idee, denke ich mal.
Gerade bei den größeren ARM und ESP, da kann das schon nerven.

Eine Möglichkeit wird vielleicht es geben:
Die *.hex liegt dann ja fertig gebaut im Build Verzeichnis.
Man könnte, im Werkzeuge Menü, eigene Plugins unterbringen.
Diese Plugins werden in Java geschrieben.

combie:
Eine Möglichkeit wird vielleicht es geben:
Die *.hex liegt dann ja fertig gebaut im Build Verzeichnis.
Man könnte, im Werkzeuge Menü, eigene Plugins unterbringen.
Diese Plugins werden in Java geschrieben.

Demnach müßte sich ein Java Programmierer angesprochen fühlen. :slight_smile: Die Hoffnung stirbt zuletzt.

Assembler pur, mit der Arduino IDE

Es gibt mehre Möglichkeiten Assembler in unsere Arduino Programme einzuflechten.
Hier möchte ich eine reine Assembler Lösung präsentieren.
So als Beispiel, wie weit man es mit der Arduino IDE auch in die Assembler Richtung treiben kann

Damit die IDE überhaupt kompiliert, muss mindestens eine *.ino her.
In diesem Fall bleibt sie quasi leer:

/*
 * voll leer
 */

In einem zweiten Tab legt man eine *.S Datei.
Ich habe sie hier mal main.S genannt:

#include <avr/io.h>


// die Arduino typische LED an PB5 
// UNO, Nano und ProMini (alle ATMega328P)
// bei 16MHz Takt wird mit ca 0,5Hz an PB5 gewackelt


outpin = PB5         // LED_BUILTIN  
#define worker  r24  // Arbeitsregister

.section .text,"ax",%progbits  // https://www.nongnu.org/avr-libc/user-manual/mem_sections.html
.global main                   // dem Linker bekannt geben
.global TIMER1_OVF_vect        // dem Linker bekannt geben


main:  
  sbi _SFR_IO_ADDR(DDRB), outpin  // Set to Output

  // timer1 initialisieren
  ldi worker, 0                  // Normal Mode
  sts TCCR1A, worker  
           
  ldi worker, (1 << CS12)        // Clock/256
  sts TCCR1B, worker
  
  ldi worker, (1 << TOIE1)       // overflow interrupt enable
  sts TIMSK1, worker

  sei                         // global interrupt enable  
   

mainloop: rjmp mainloop       //  empty main loop


TIMER1_OVF_vect:
    sbi _SFR_IO_ADDR(PINB), outpin // toggle 
    reti

Fertig! Das wars schon.
Auf einen UNO o.ä. gespielt, blinkt es vor sich hin.

Es ist nur einen rudimentäres Beispiel:
-Ein Pin wird zum Output gemacht
-Timer 1 initialisiert
-Es wird in eine Endlosschleife gestürzt

Der Timer1 overflow Interrupt toggelt den Pin.

Der Speicherverbrauch: (damit man auch mal den Erfolg der Show sieht)

:---------------------------------:----------:--------:   
| [b]Verfahren[/b]                       |  [b]Flash[/b]   |  [b]RAM[/b]   |
:---------------------------------:----------:--------:   
| Diese Assembler Version         | 160 Byte | 0 Byte |
| Beispiele/01.Basics/Blink       | 976 Byte | 9 Byte |
| Beispiele/01.Basics/BareMinimum | 440 Byte | 9 Byte |
| *.ino nur mit "int main()"      | 134 Byte | 0 Byte |
:---------------------------------:----------:--------:

Zum Schluss noch der generierte Code, durch den Disassembler genudelt.
Ein großer Teil besteht aus den Interrupt Vektoren und der C üblichen Stackvorbereitung

c:\temp\arduino_build_499643/AssemblerSchlank.ino.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
   4: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
   8: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
   c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  10: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  14: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  18: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  1c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  20: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  24: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  28: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  2c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  30: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  34: 0c 94 4c 00 jmp 0x98 ; 0x98 <__vector_13>
  38: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  3c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  40: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  44: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  48: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  4c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  50: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  54: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  58: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  5c: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  60: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
  64: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>

00000068 <__ctors_end>:
  68: 11 24       eor r1, r1
  6a: 1f be       out 0x3f, r1 ; 63
  6c: cf ef       ldi r28, 0xFF ; 255
  6e: d8 e0       ldi r29, 0x08 ; 8
  70: de bf       out 0x3e, r29 ; 62
  72: cd bf       out 0x3d, r28 ; 61
  74: 0e 94 40 00 call 0x80 ; 0x80 <main>
  78: 0c 94 4e 00 jmp 0x9c ; 0x9c <_exit>

0000007c <__bad_interrupt>:
  7c: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>

00000080 <main>:
.global main                   // dem Linker bekannt geben
.global TIMER1_OVF_vect        // dem Linker bekannt geben


main:  
  sbi _SFR_IO_ADDR(DDRB), outpin  // Set to Output
  80: 25 9a       sbi 0x04, 5 ; 4

  // timer1 initialisieren
  ldi worker, 0                  // Normal Mode
  82: 80 e0       ldi r24, 0x00 ; 0
  sts TCCR1A, worker  
  84: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
           
  ldi worker, (1 << CS12)        // Clock/256
  88: 84 e0       ldi r24, 0x04 ; 4
  sts TCCR1B, worker
  8a: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  
  ldi worker, (1 << TOIE1)       // overflow interrupt enable
  8e: 81 e0       ldi r24, 0x01 ; 1
  sts TIMSK1, worker
  90: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7e006f>

  sei                         // global interrupt enable  
  94: 78 94       sei

00000096 <mainloop>:
   

mainloop: rjmp mainloop       //  empty main loop
  96: ff cf       rjmp .-2       ; 0x96 <mainloop>

00000098 <__vector_13>:


TIMER1_OVF_vect:
    sbi _SFR_IO_ADDR(PINB), outpin // toggle 
  98: 1d 9a       sbi 0x03, 5 ; 3
    reti
  9a: 18 95       reti

0000009c <_exit>:
  9c: f8 94       cli

0000009e <__stop_program>:
  9e: ff cf       rjmp .-2       ; 0x9e <__stop_program>

Doc_Arduino:
Demnach müßte sich ein Java Programmierer angesprochen fühlen. :slight_smile: Die Hoffnung stirbt zuletzt.

Ja, das wäre schon schön...

--

An alle:
--> Einen herzlichen Dank für die Blumen und den Zuspruch.

Editieren von eigenen und fremden Libraries

Erstmal gibts zu Libs folgendes zu sagen:
Arduino IDE 1.5: Library specification
Die Struktur, Möglichkeiten und Grenzen werden dort definiert.

Beispiele editieren:
Erwähnung soll hier insbesondere dieses praktische Feature finden.
Wenn man eine .development Datei in den jeweiligen Library Ordner wirft, kann man die zugehörigen Beispiele in der IDE modifizieren und speichern.
Desweiteren wird diese Lib nicht mehr im Bibliotheksverwalter angezeigt und ist so auch vom Update ausgeschlossen.

Diese .development Datei darf durchaus leer sein, es ist nur der Name, welcher eine Rolex spielt.
Wenn man in einer meiner Libraries eine solche Datei findet, dann habe ich sie da vergessen. Ich nutze sie manchmal um dort temporäre Notizen abzulegen.
Dann einfach löschen…

Library Quellcode Editieren:
Die IDE kann *.c, *.h, *.cpp und *.S Dateien öffnen, aber nur wenn eine *.ino im gleichen Ordner liegt und diese auch den Namen des Ordners trägt. Ohne die *.ino geht nix

Bei alten Libs(vor 1.5.0), oder selbst gebauten, liegen alle . Dateien meist im Hauptordner der Lib.
Das ist dann der richtige Ort für die *.ino, mit dem Namen des Ordners.

Bei modernen Libs, ab 1.5.0 findet sich meist ein src Verzeichnis, wo der ganze Quellcode drin steckt.
In den src Ordner sollte man eine src.ino ablegen.

Beim Öffnen der *.ino mit der IDE läd die IDE auch die ganzen anderen Dateien, aus dem Ordner, in Tabs und man kann sie bequem manipulieren, speichern und testen.


Wenn man fertig ist mit bearbeiten, den ganzen Quatsch wieder weg löschen, und gut ist.

Echt coole Sache, einer der Besten Tipps wie ich finde. Licht im Kaos. :slight_smile:

Deswegen eine weitere vorbereitete Liste zum ausblenden nicht benötigter ESP8266 Boards
C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2
auch hier eine boards.local.txt anlegen mit folgenden Inhalt und erwünschte Einträge mit # auskommentieren

generic.hide=             # Generic ESP8266 Module
esp8285.hide=             # Generic ESP8285 Module
espduino.hide=             # ESPDuino (ESP-13 Module)
huzzah.hide=             # Adafruit Feather HUZZAH ESP8266
inventone.hide=         # Invent One
cw01.hide=                 # XinaBox CW01
espresso_lite_v1.hide=     # ESPresso Lite 1.0
espresso_lite_v2.hide=     # ESPresso Lite 2.0
phoenix_v1.hide=         # Phoenix 1.0
phoenix_v2.hide=         # Phoenix 2.0
nodemcu.hide=             # NodeMCU 0.9 (ESP-12 Module)
nodemcuv2.hide=         # NodeMCU 1.0 (ESP-12E Module)
modwifi.hide=             # Olimex MOD-WIFI-ESP8266(-DEV)
thing.hide=             # SparkFun ESP8266 Thing
thingdev.hide=             # SparkFun ESP8266 Thing Dev
esp210.hide=             # SweetPea ESP-210
d1_mini.hide=             # LOLIN(WEMOS) D1 R2 & mini
d1_mini_pro.hide=         # LOLIN(WEMOS) D1 mini Pro
d1_mini_lite.hide=         # LOLIN(WEMOS) D1 mini Lite
d1.hide=                # WeMos D1 R1
espino.hide=             # ESPino (ESP-12 Module)
espinotee.hide=         # ThaiEasyElec's ESPino
wifinfo.hide=             # WifInfo
arduino-esp8266.hide=     # Arduino
gen4iod.hide=             # 4D Systems gen4 IoD Range
oak.hide=                 # Digistump Oak
wifiduino.hide=         # WiFiduino
wifi_slot.hide=         # Amperka WiFi Slot
wiolink.hide=             # Seeed Wio Link
espectro.hide=             # ESPectro Core

Schön, dass es dir gefällt!
Und danke, für die Liste.

Habs auch mal im ersten Beitrag verlinkt.

Zum Thema „Erleichterungen bei der Bedienung der IDE" hätte ich vielleicht noch etwas beizusteuern:

Individuelle Farbeinstellungen für den Editor

Vielleicht nicht für jeden interessant, aber in manchen Situationen hatte ich mir gewünscht, die Farbeinstellungen im Editor ändern zu können, z.B. zu speziellen Dokumentations-Zwecken. Eine Suche danach ergab dann folgendes Ergebnis:

Im Arduino Programm-Verzeichnis (bei mir /Arduino_188) befindet sich ein Ordner "lib", darin gibt es einen Unterordner "theme". Und innnerhalb .../Arduino_188/lib/theme befindet sich die sehr interessante Datei theme.txt

In dieser Datei (die man sich vorsichtshalber zuvor sichern sollte) kann man eine Menge optische Einstellungen vornehmen, die einem "Optic-Junky" zur Genüge reichen könnte:

arduino_IDE.jpg

Derartige Änderungen zu testen ist jedoch etwas mühseelig, weil die Einstellungen dort nur beim Start des Programmes abgefragt werden. Also: "Änderung(en) vornehmen - Progi neu starten - Prüfen - Progi schließen" ... und ggf. erneut ändern.

LG
RudiDL5

arduino_IDE.jpg

Jawoll!

Danke, habe ich oben verlinkt.

So nun auch ich mit ESP32er

Deswegen eine weitere vorbereitete Liste zum ausblenden nicht benötigter ESP32 Boards
C:\Users\user\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4
auch hier eine boards.local.txt anlegen mit folgenden Inhalt und erwünschte Einträge mit # auskommentieren

esp32.hide=                           #ESP32 Dev Module
esp32wrover.hide=                           #ESP32 Wrover Module
pico32.hide=                           #ESP32 Pico Kit
tinypico.hide=                           #TinyPICO
magicbit.hide=                           #MagicBit
turta_iot_node.hide=                           #Turta IoT Node
ttgo-lora32-v1.hide=                           #TTGO LoRa32-OLED V1
ttgo-t1.hide=                           #TTGO T1
cw02.hide=                           #XinaBox CW02
esp32thing.hide=                           #SparkFun ESP32 Thing
nina_w10.hide=                           #u-blox NINA-W10 series (ESP32)
widora-air.hide=                           #Widora AIR
esp320.hide=                           #Electronic SweetPeas - ESP320
nano32.hide=                           #Nano32
d32.hide=                           #LOLIN D32
d32_pro.hide=                           #LOLIN D32 PRO
lolin32.hide=                           #WEMOS LOLIN32
pocket_32.hide=                           #Dongsen Tech Pocket 32
WeMosBat.hide=                           #WeMos WiFi&Bluetooth Battery
espea32.hide=                           #ESPea32
quantum.hide=                           #Noduino Quantum
node32s.hide=                           #Node32s
hornbill32dev.hide=                           #Hornbill ESP32 Dev
hornbill32minima.hide=                           #Hornbill ESP32 Minima
firebeetle32.hide=                           #FireBeetle-ESP32
intorobot-fig.hide=                           #IntoRobot Fig
onehorse32dev.hide=                           #Onehorse ESP32 Dev Module
featheresp32.hide=                           #Adafruit ESP32 Feather
nodemcu-32s.hide=                           #NodeMCU-32S
mhetesp32devkit.hide=                           #MH ET LIVE ESP32DevKIT
mhetesp32minikit.hide=                           #MH ET LIVE ESP32MiniKit
esp32vn-iot-uno.hide=                           #ESP32vn IoT Uno
esp32doit-devkit-v1.hide=                           #DOIT ESP32 DEVKIT V1
esp32-evb.hide=                           #OLIMEX ESP32-EVB
esp32-gateway.hide=                           #OLIMEX ESP32-GATEWAY
esp32-poe.hide=                           #OLIMEX ESP32-PoE
esp32-poe-iso.hide=                           #OLIMEX ESP32-PoE-ISO
esp32-DevKitLipo.hide=                           #OLIMEX ESP32-DevKit-LiPo
espino32.hide=                           #ThaiEasyElec's ESPino32
m5stack-core-esp32.hide=                           #M5Stack-Core-ESP32
m5stack-fire.hide=                           #M5Stack-FIRE
m5stick-c.hide=                           #M5Stick-C
odroid_esp32.hide=                           #ODROID ESP32
heltec_wifi_kit_32.hide=                           #Heltec WiFi Kit 32
heltec_wifi_lora_32.hide=                           #Heltec WiFi LoRa 32
heltec_wifi_lora_32_V2.hide=                           #Heltec WiFi LoRa 32(V2)
heltec_wireless_stick.hide=                           #Heltec Wireless Stick
espectro32.hide=                           #ESPectro32
CoreESP32.hide=                           #Microduino-CoreESP32
alksesp32.hide=                           #ALKS ESP32
wipy3.hide=                           #WiPy 3.0
bpi-bit.hide=                           #BPI-BIT
wesp32.hide=                           #Silicognition wESP32
t-beam.hide=                           #T-Beam
d-duino-32.hide=                           #D-duino-32
lopy.hide=                           #LoPy
lopy4.hide=                           #LoPy4
oroca_edubot.hide=                           #OROCA EduBot
fm-devkit.hide=                           #ESP32 FM DevKit
frogboard.hide=                           #Frog Board ESP32
esp32cam.hide=                           #AI Thinker ESP32-CAM
sparkfun_lora_gateway_1-channel.hide=                           #SparkFun LoRa Gateway 1-Channel
ttgo-t-watch.hide=                           #TTGO T-Watch
d1_mini32.hide=                           #WEMOS D1 MINI ESP32
gpy.hide=                           #Pycom GPy
vintlabs-devkit-v1.hide=                           #VintLabs ESP32 Devkit

Gruß
DerDani

Danke, und verlinkt.

Auf Mac ist der Pfad zu ESP8266:
‎⁨MacOS ▸ ⁨Benutzer⁩ ▸ ⁨Skorpi08 ▸ ⁨Library⁩ ▸ ⁨Arduino15⁩ ▸ ⁨packages⁩ ▸ ⁨esp8266⁩ ▸ ⁨hardware⁩ ▸ ⁨esp8266⁩ ▸ ⁨2.5.2⁩

Zu AVR muss man in die Arduino.app
MacOS ▸ ⁨Programme⁩ ▸ ⁨Arduino.app⁩ ▸ ⁨Contents⁩ ▸ ⁨Java⁩ ▸ ⁨hardware⁩ ▸ ⁨arduino⁩ ▸ ⁨avr⁩

Das Problem:
löscht man die Arduino.app um auf neuere Version umzusteigen, muss man die ganze Prozedur nochmal machen.

Gibt es da eine Lösung für? Vielleicht über Dokumente ▸ Arduino ▸ hardware ?

@Combie, könntest du auch die hardware.zip verlinken, wie man eigene Boards erstellt?

Gibt es da eine Lösung für?

Die portable Installation mildert das Problem etwas.

@Combie, könntest du auch die hardware.zip verlinken, wie man eigene Boards erstellt?

KA, welche Zip du meinst...
Hier findest du ein Tutorial

Problem mit der boards.local.txt:
Wenn man die Boards aktualisiert, ist die Datei weg.
Also am besten eine Kopie vorher anlegen und hinterher wieder in das ensprechende Verzeichnis kopieren (auch bei der portablen Version)

hab mir gleich ne batchdatei angelegt, muss dann nur die Versionsnummern ändern:

copy boards.local.txt .\hardware\arduino\avr
copy boards.local.txt .\portable\packages\arduino\hardware\avr\1.8.1
copy boards.local.txt .\portable\packages\esp32\hardware\esp32\1.0.4
copy boards.local.txt .\portable\packages\esp8266\hardware\esp8266\2.5.2

Hallo,

weil Board Updates reinkamen habe ich meine boards.local Dateien aktualisiert, die ich hiermit zur Verfügung stelle.
Wer die Arduino AVR Eweiterung v1.8.2 installiert hat, muss die Datei in zwei Ordner kopieren, nur im IDE Installationspfad reicht nicht, jedenfalls bei mir. Die Pfadangaben stehen in der jeweiligen .txt mit drin.
Alles in Klammern im Dateinamen entfernen. Der Rest sollte selbsterklärend sein wenn man den Thread gelesen hat.

(Arduino)boards.local.txt (1.08 KB)

(ESP8266)boards.local.txt (1.33 KB)

(ATtinyCore)boards.local.txt (863 Bytes)

(XMC)boards.local.txt (475 Bytes)

Ändern der Datei->Neu *.ino Vorlage

Wenn ich ein neues Projekt beginne, drücke ich im Arduino Menü gerne auf Datei und dann Neu, um eine leere Vorlage zu erhalten.

Folgendes erscheint im Editor:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Der Quelltext findet sich im Arduino Programmordner in examples\01.Basics\BareMinimum\BareMinimum.ino

Aus mehreren Gründen ist mir die Vorlage so nicht genug:

  • Ich möchte gerne die öffnenden und schließenden Blockklammern, in jeweils der gleichen Spalte.
  • In den allermeisten Fällen kommt Serial zum Einsatz. Das dauernd neu zu schreiben ist mir zu blöd.
  • Streaming, ich habe es lieben gelernt.
  • Die Ausgabe von FILE ist bei mir zum Standard geworden. Es hat sich bewährt, dass Arduinos, welche sich schon länger im praktischen Einsatz befinden, als erstes ihren Programmbezeichner ausgeben.

Also fix die BareMinimum.ino angepasst, so dass sie meinen häufigsten Bedürfnisse entgegen kommt.

So sieht sie dann aus:

#include <Streaming.h>


void setup() 
{
  Serial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;
}

void loop() 
{

}

Hallo,

mach ich auch so. :slight_smile: Aller Standardcode ist enthalten. Löschen geht einfacher wie jedesmal neu tippen.

Da ich im Notepad++ editiere, habe ich es mir dort als Macro hinterlegt:

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");

}

void loop() {

}

Gruß Tommy

Beides eine prima Sache, die klau ich sofort ;D