Forum: Mikrocontroller und Digitale Elektronik Automatisierung von Anwendungen


von Nic (Gast)


Lesenswert?

Guten Abend,
ich habe folgendes Problem:

In der Anwendung Arduino habe ich ein Programm erstellt, welches ich auf 
ATTINYs flashen möchte. An sich kein Problem, aber sehr 
arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY 
bekommt dabei eine individuelle I2C-Adresse und ID.
Sobald die richtige Adresse bei Arduino eingestellt ist, erzeuge ich mit 
Arduino eine HEX-Datei. Diese HEX-Datei öffne ich mit einem Flash-Tool, 
welches die ATTINYs dann letztendlich flasht.
Dieser Prozess ist somit überhaupt nicht optimiert, was ich ändern 
möchte. Den momentan benötige ich +- 1 Minute pro ATTINY, was definitiv 
zu lange ist, vor allem bei 100 Stück...

Meine Frage richtet sich an dieser Stelle an die Prozessoptimierung.
Der Wunschzustand ist das öffnen einer Anwendung, die in der Anwendung 
Arduino die beiden Parameter (ID, Adresse) verändern kann, dann 
automatisch das HEX-File erzeugt und danach das Flashen initialisert und 
durchführt, sodass ich, als Bediener, nur noch die Attinys in den Sockel 
legen muss.

Mein Ansatz war eine Batch-Datei, in der ich mittels Shortcuts die 
nötigen Befehle aufrufe, doch mit meinem Wissensstand kann man keine 
Shortcuts mit einer Batch-Datei ausführen.
Gibt es eine andere Anwendung/Programmiersprache, mit der man auch bei 
Arduino die entsprechenden Zeilen hochzählen lassen kann, bzw. mittels 
Shortcuts alles steuern kann?

von Nick M. (Gast)


Lesenswert?

Tcl?

von Nic (Gast)


Lesenswert?

Gibt es noch andere Möglichkeiten meinen "Wunsch" umzusetzen? Also eine 
intuitivere Anwendung?

von Dunno.. (Gast)


Lesenswert?

Falscher Ansatz.

Modifiziere direkt das .Hex File, dafür musst du dich natürlich ein 
bisschen mit linker und make befassen um die adressbereiche zu 
definieren und frei zu halten.

Oder du nutzt das eeprom zum speichern der Adressen, dann gibt's dafür 
ein extra Hex mit wenig inhalt.


Das modifizierte Hex wird dann geflasht.

Dafür gibt's fertige Tools, Segger zb bietet das in jflash sogar ab 
werk..

von Frank S. (_frank_s_)


Lesenswert?

Nic schrieb:
> 1 Minute pro ATTINY

Dann hättest du jetzt schon 40 Stück fertig. Nur keine Angst, die 
fehlenden 60 schaffst du auch noch.
Es geht manchmal schneller, mit ungünstigen Werkzeugen etwas zu 
erledigen, als sich erst in ein neues Werkzeug einzuarbeiten.

Ich drücke dir die Daumen.

MfG von der Spree
Frank

von Dunno.. (Gast)


Lesenswert?

Frank S. schrieb:
> Es geht manchmal schneller, mit ungünstigen Werkzeugen etwas zu
> erledigen, als sich erst in ein neues Werkzeug einzuarbeiten.

https://me.me/i/geeks-and-repetitive-tasks-time-a-spent-loses-runs-script-c452944bc2a54d39abc546adff780616

von Nic (Gast)


Lesenswert?

Mir ist natürlich bewusst, das ich hierdurch zeit verlieren werde, aber 
es geht auch darum zu sehen, wie sowas gehandhabt wird

von Wilhelm M. (wimalopaan)


Lesenswert?

Desktop Automation

Etwa:

Xdotool
Ui.vision
...

von Joachim (Gast)


Lesenswert?

Bin nicht 100%ig sicher, ob ich die Problemstellung richtig verstanden 
habe, daher erzähle ich evtl. gerade Unsinn. Aber eventuell wäre 
folgender Ansatz möglich/sinnvoll:

- Statt der Arduino-IDE nimmst Du PlatformIO zum kompilieren und flashen
- die sich mit bei jedem Attiny verändernden Parameter I2C-Adresse und 
ID übergibst Du als #define per "-D" Kommandozeilenparameter, z.B. 
"-DI2C_ADDRESS=23 -DID=32"
- Das ganze packst Du in ein Shell-Script/Batch-Datei, die dann in einer 
Schleife nach und nach für jeden der Attinys zuerst die passende 
Firmware kompiliert und dann flasht

von Stefan F. (Gast)


Lesenswert?

Man kann Arduino Sketche ohne IDE mit einer Batch-Datei compilieren und 
flashen: 
https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc

von ThomasW (Gast)


Lesenswert?

Gibt es dafür nicht sed? Also in die Originaldatei einen markanten 
Platzhalter an die Stelle der Adresse und dann in einer Schleife den 
Platzhalter gegen einen Counter ersetzen, dabei die Datei ans Ziel 
schreiben (das macht der sed),  dann neu compilieren und flashen. Wie 
die entsprechenden Konsolenbefehle dafür aussehen, das sollte sich doch 
herausfinden lassen.

von c-hater (Gast)


Lesenswert?

ThomasW schrieb:

> Gibt es dafür nicht sed?

Und 100000 andere Tools, die das Gleiche (und mehr) leisten könnten.

Das Problem ist: in alle muss man sich einarbeiten und dafür ist der TO 
offensichtlich zu faul.

Er ist ja sogar schon zu faul dazu gewesen, selbst so ein Tool zu 
suchen...

von ThomasW (Gast)


Lesenswert?

c-hater schrieb:
> Das Problem ist: in alle muss man sich einarbeiten und dafür ist der TO
> offensichtlich zu faul.

Kann man sich nicht erst dann einarbeiten, wenn man weiß worin?

c-hater schrieb:
> Er ist ja sogar schon zu faul dazu gewesen, selbst so ein Tool zu
> suchen...

weil er nicht genau weiß wonach er suchen soll und nun Rat von 
erfahrenen Leuten sucht, da stellt er ne Frage in einem Forum. Was für 
ne verrückte Welt ...

von QA is for Quality Art (Gast)


Lesenswert?

Hier geht es bereits um kleine Industriemengen.
Also könnte sich -nach dem Dauereinsatz unter Umwelteinflüssen- ja die 
Frage stellen, ob ein gewisses Exemplar nach einer Zeit immernoch das 
korrekte Programm in seinem FlashROM hat.

Wenn nun per "-DI2C_ADDRESS=23 -DID=32" (oder per "sed" oder per 
Desktopautomation oder...) Der Flashinhalt individualisiert wird, also 
jedes Exemplar andere Prüfsumme aufweist, müsste dies aufwändig 
administrativ gebuchhaltet werden um nach Zeit im Zweifelsfall 
vergleichen zu können.
Bitte für jede Version des Programms...

Die "Richtige Lösung[TM]" muss also darauf hinaus dass pro 
Programmversion die Prüfsumme für alle Exemplare gleich ist und solche 
Exemplarindividualdaten im gesonderten EEPROM-Datenbereich abgelegt ist.

Auch Ersatzduplikate anfertigen wird so machbar.
(ich weis jetzt nicht f. kleine Tinys, aber den selben Quellcode heute 
und in 1 Wo/nach reboot des Entwicklungsrechners/nach Compilerupdate 
ergibt durchaus unterschiedliche Prüfsummen d. Flashinhaltes)

Wenn solche Exemplarindividualdaten mehr werden als ins EEPROM passen, 
muss das FlashROM partitioniert werden und die Geschichte führt durchaus 
bald zu (Flash(ROM))tauglichen Dateisysteme.
Dieses Fass passt von der Größe eher nicht mehr zu ATtiny, erwähne ich 
also nur so als Ausblick, für die Welt in 32bit & co...

von Jemand (Gast)


Lesenswert?

Hallo

ThomasW da brauchst du gar nicht zu analysieren:
So ist er einfach "unser" c-hater (und so ca. 5 andere forenbekannte 
"Spezialisten") - fachlich durchaus Ahnung, aber voll Vorurteile, 
Vorverurteilungen und im Besitz der Absoluten Wahrheit...

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Das Problem ist: offensichtlich zu faul.

Ich sehe das Problem eher da, dass man eine bestimmte Version bauen 
will, die bereits im Source Repository so gekennzeichnet ist. Nicht erst 
bauen (dabei als Seiteneffekt den Quelltext ändern) und dann die neue 
Versionsnummer einchecken.

von PittyJ (Gast)


Lesenswert?

Wir haben immer ein paar Studendenten. Die sitzen dann eben den ganzen 
Tag.
Aber irgendwie muß man sein Studium ja finanzieren.

von Markus (Gast)


Lesenswert?

Stefanus
>Man kann Arduino Sketche ohne IDE mit einer Batch-Datei compilieren und
>flashen:
>https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc

Der Link von Stefanus sollte eigentlich schon ausreichen.
Man muss nur noch herausbekommen, wie man die "-D" Optionien die man 
überlicherweise beim GCC findet, in die Parameterliste mit aufnimmt.

( mit -D kann man in der Kommandozeile des GCC Definitionen anhängen, 
die im Programm dann wie #defines wirken ).

von Frank K. (fchk)


Lesenswert?

Nic schrieb:

> In der Anwendung Arduino habe ich ein Programm erstellt, welches ich auf
> ATTINYs flashen möchte. An sich kein Problem, aber sehr
> arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY
> bekommt dabei eine individuelle I2C-Adresse und ID.

Im richtigen Leben definiert man sich eine struct{}, die alle 
exemplarspezifischen Konstanten sowie eine Prüfsumme (wichtig!) enthält.

Dann erstellt man im Linkerskript ein eigenes Segment, in das per 
#pragma oder __attribute__(section=...) nur diese struct plaziert wird.

Oder: Flash-Adresse definieren, per memcpy_P() direkt den Flash-Inhalt 
in die struct im RAM laden, und los gehts. Ist vielleicht einfacher, 
braucht aber extra RAM, was doof ist, wenn man nur 512 Bytes hat.

Jetzt kann man das Programm compilieren und ein Hexfile daraus machen.

Die Details dazu findest Du in der Gnu-Dokumentation.

Ich würde jetzt aus den hex mit objcopy oder hex2bin ein Binärfile 
machen, weil das einfacher zu bearbeiten ist. Wo Deine 
exemplarspezifischen Konstanten sind, weißt Du - das hast Du nämlich im 
Linkerskript festgelegt. Also ist es auch kein Problem, die Position im 
.bin zu finden, zu modifizieren und wieder ein flashbares .hex zu 
erzeugen.

Ich würde eine Prüfsumme in die struct aufnehmen, damit Du feststellen 
kannst, ob das geflashte Binery bereits passend konfiguriert ist.

Du könntest sogar erst das Programm und erst in einem zweiten Schritt 
die exemplarspezifischen Daten flashen. Dann sollten die Defaultwerte im 
Programm-Binary 0xff sein, damit Du diesen Bereich überprogrammieren 
kannst.

Und: Deine struct sollte im Flash an einer Page-Grenze beginnen. Du 
kannst das Flash nicht byteweise löschen und beschreiben, sondern immer 
nur ganze Pages. Steht alles im Datenblatt.

fchk

von Wolfgang (Gast)


Lesenswert?

Nic schrieb:
> An sich kein Problem, aber sehr
> arbeitsaufwendig, da ich 100 ATTINYs flashen möchte. Jeder ATTINY
> bekommt dabei eine individuelle I2C-Adresse und ID.
> Sobald die richtige Adresse bei Arduino eingestellt ist, erzeuge ich mit
> Arduino eine HEX-Datei. Diese HEX-Datei öffne ich mit einem Flash-Tool,
> welches die ATTINYs dann letztendlich flasht.

Sehr aufwändig und man mag gar nicht an das nächste Firmware-Update 
denken.

Warum flasht du sie nicht alle auf eine Default-Adresse, die du irgendwo 
ins EEPROM schreibst?

Dann nimmst du einen zweiten Controller, dessen einzige Aufgabe es ist, 
auf dem Bus nach einem TINY mit Default-Adresse zu suchen. Sobald er 
einen findet, schiebt er ihm eine I2C-Adresse und eine ID zu und der 
ATTiny merkt sich beides für nächste Mal.

Die TINYs steckst du dann der Reihe nach kurz mal auf den 
ID-Vergabe-Controller und schickst ihnen ihre zugeordneten persönlichen 
Daten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.