Forum: Compiler & IDEs Atmel Studio External Tool MCU Parameter (z.B. für avrdude)


von L. K. (ladde)


Lesenswert?

Hallo,

gibt es eine Möglichkeit, in Atmel Studio 7 einem externen Tool den 
verwendeten uC als Parameter zu übergeben?

Ich benutze einen USBTiny-Adapter mit avrdude zum Flashen und habe 
diesen als "External Tool" im Atmel Studio eingebunden:
Command:
1
C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avrdude.exe
Arguments:
1
-v -c usbtiny -p t841 -U flash:w:"$(TargetPath)":e

Nun muss ich jedes Mal, wenn ich einen anderen uC verwende den Befehl 
ändern und würde stattdessen gerne den uC, der in den 
Projekteinstellungen vorgegeben ist automatisch als Parameter an avrdude 
übergeben.
Oder (falls das nicht geht) einen Wert im Quelltext definierten Wert, 
z.B.
1
#define AVRDUDE_PART_ID m328p

Danke & Grüße
Ladde

: Bearbeitet durch User
von L. K. (ladde)


Lesenswert?

Eine (nicht ganz zufriedenstellende) Möglichkeit habe ich inzwischen 
gefunden:
$(CurText) enthält aktuell im Editor markierten Text.
Ist zwar nicht perfekt (immer erst im Quelltext den Controller 
markieren), aber schonmal besser als für jeden ein eigenes externes Tool 
zu definieren bzw. die Definition zu ändern.

Falls jemand ne Möglichkeit kennt, auf die Projekteigenschaften oder ein 
define o.ä. zuzugreifen bin ich weiterhin sehr interessiert :)

PS: Die Info zu $(CurText) sowie weitere Parameter gibts hier:
https://msdn.microsoft.com/en-us/library/76712d27.aspx

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Keine Ahnung über diesen Studio-Kram, aber nur als Hinweis: du musst
natürlich nicht zwingend die Kurzform (t841) benutzen, es darf auch
der lange Name (ATtiny841) benutzt werden.  Vielleicht findest du ja
dafür eher einen Weg, den sollte das Studio ja zumindest grundlegend
bereits kennen.

von L. K. (ladde)


Lesenswert?

Danke für den Hinweis. Hatte ich zwar auch schon gemerkt, aber komme 
gerade auf eine neue Idee :)

Wenn Atmel Studio so sparsam mit den Parametern ist, könnte man 
natürlich ein Skript schreiben, dass den uC-Typ aus der Projekt-Datei 
ausliest (xml) und dann entsprechend avrdude aufruft.

Bin allerdings nicht besonders fit in Skript-Sprachen. Könnte man das 
(unter Windows) mit ner .cmd-Datei lösen?
Hier mal ein beispielhafter Ausschnitt aus einer .cproj-Datei:
1
<?xml version="1.0" encoding="utf-8"?>
2
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
3
  <PropertyGroup>
4
    <SchemaVersion>2.0</SchemaVersion>
5
    <ProjectVersion>7.0</ProjectVersion>
6
    <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
7
    <ProjectGuid>{ba5004a8-a1e2-4bfb-bc9a-36e6b2e169e8}</ProjectGuid>
8
    <avrdevice>ATtiny441</avrdevice>
9
    ...
Die Datei geht natürlich noch ne ganze Ecke weiter, aber das 
interessante steht in <avrdevice>

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du einen XSL-Transformator mit an Bord hast, ist es relativ
einfach, sowas zu extrahieren.  Mit Windows-Boardmitteln kenne ich
mich nicht so aus.  cmd.exe ist ja nicht so übertrieben mächtig.
Manche Leute scheinen auf die Windows Power Shell zu schwören, keine
Ahnung, was die alles kann.

Wenn eine Scriptsprache wie Python für dich in Frage kommt, sollte es
auch nicht so schwierig sein, das XML auseinanderzunehmen.

von L. K. (ladde)


Lesenswert?

Hmm, XSL Transformator höre ich ehrlich gesagt zum ersten Mal :)

Windows hat for. Damit habe ich jetzt nach reichlich trial & error ein 
batch-Skript zusammengebastelt:
1
@echo off
2
setlocal enableextensions enabledelayedexpansion
3
for /f  "tokens=2-4* delims=<> usebackq" %%a in ("%~1") do (
4
  IF "%%a"=="avrdevice" IF "%%c"=="/avrdevice" set mcu=%%b )
5
set avrdude_args=
6
:loop
7
shift
8
if ""%1""=="""" goto after_loop
9
set avrdude_args=%avrdude_args% %1
10
goto loop
11
:after_loop
12
"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avrdude.exe" -p %mcu% %avrdude_args%
Das Skript erwartet als erstes Argument den Dateinamen der Projektdatei 
und reicht alle weiteren Parameter direkt an avrdude weiter.
Funktioniert wunderbar, allerdings findet keinerlei Fehlerbehandlung 
statt (da verlasse ich mich der Einfachheit halber darauf, dass avrdude 
seine Parameter prüft).

Im Studio habe ich jetzt folgende Argumente für das externe Tool:
Flash schreiben:
1
"$(ProjectDir)$(ProjectFileName)" -v -c usbtiny -U flash:w:"$(TargetPath)":e
EEPROM schreiben:
1
"$(ProjectDir)$(ProjectFileName)" -v -c usbtiny -U eeprom:w:"$(TargetDir)$(TargetName).eep":i

Vielleicht hilft's ja dem einen oder anderen.

Wenn ich allerdings überlege, wie viel Zeit ich jetzt damit verbracht 
habe, muss ich noch ne ganze Menge Controller flashen, bevor sich der 
(zeitliche) Aufwand rentiert hat :P

von Arduinoquäler (Gast)


Lesenswert?

L. K. schrieb:
> Wenn ich allerdings überlege, wie viel Zeit ich jetzt damit verbracht
> habe, muss ich noch ne ganze Menge Controller flashen, bevor sich der
> (zeitliche) Aufwand rentiert hat

Naja, soviele verschiedene Controller hast du sicher nicht, da
könnte man ja den AvrDude auch mehrmals (für jeden Controller
einmal) als Tool eintragen .... ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

L. K. schrieb:
> Windows hat for.

Gut, so viel cmd.exe habe ich selbst nicht in petto, dafür benutze
ich es zu wenig.

Schön, dass du eine Lösung damit finden konntest.

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.