Wie mit AVRISP mkII und Atmel Studio den Arduino flashen?

Hallo,

heute kam mein mkII Programmer. Die Tage hatte ich gelesen das man für die Arduino IDE den USB Treiber wechseln müßte. Das möchte ich nicht. Da ich die IDE noch nochmal nutzen möchte mit einem anderen Arduino und nicht laufend den Treiber wechseln möchte.

Atmel Studio ist schon lange installiert und das Plugin Visual Micro für Arduino. Das funktinierte auch soweit, dass ich darüber wie gewohnt über den COM Port (USB) normal flashen konnte.

Jetzt habe ich den mkII angestöpselt, Treiber wurde selbstständig installiert. Im Gerätemanager erscheint ...

Jungo Connectivy AVTISP mkII WinDriver

Mein Arduino ist mit 5V fremd versorgt, der mkII ist angesteckt und 2 grüne LEDs leuchten. Soweit gut.

Wenn ich Atmel Studio öffne und auf Device Programming gehe, den Mega2560, mkII und ISP auswähle, erscheinen erstmal die richtigen Daten. Hier könnte man dann den Takt, Fuses usw. programmieren. Das möchte ich aber nicht. Außer ich hab das falsch verstanden, was man jetzt alles machen muß. Denn externe 16MHz kann ich hier zum Bsp. nicht auswählen. Maximal 8MHz.

Ich kann nachwievor nur COM Ports auswählen. Release Build klappt. Sehe aber keine Möglichkeit einfach den mkII auszuwählen und flashen zu drücken.

Meine Frage wäre, wie bekomme ich mittels Atmel Studio und dem mkII am ISP einen Sketch geflasht mit den gewohnten Einstellungen wie 16MHz usw. ?

Moin, Hast du in der Leiste oben neben dem Comport auch den richtigen Chip gewählt?

Ansonsten musst du unter Device Programming in dem Reiter "Fuses" deine Fuses einstellen da kannst du dann auswählen, welchen Takt du haben willst.

Um zu flashen musst du auf den Reiter "Memorie" und da dann das Hex Auswählen und auf "Programm" klicken.

Hallo,

ich glaube wir reden aneinander vorbei. Chipauswahl usw. stimmt ja alles. Hatte ich auch geschrieben.

Ich dachte, ich kann den mkII irgendwie auswählen, so wie bisher den COM-Port, F5 drücken und los gehts. Scheinbar funktioniert das sooo nicht.

Bisher zusammengetragenes Wissen. Man muß seinen Sketch mit Release Build kompilieren und dann dieses Hexfile unter Device Programming flashen. Soweit richtig? Nur muß man vorher noch die Fuses einstellen? Genau dort hängt es noch. Muß man die immer wieder neu einstellen? Wird die Einstellung nicht wo gespeichert?

Da ich im Moment keine Ahnung welche Fuse Einstellungen richtig sind, wollte ich die erstmal nur auslesen. Um zu wissen was Sache ist. Mit avrdude komme ich aber auch nicht weiter, weil ich noch nicht herausgefunden habe wie der Port name für den mkII heißt. Was für PORT stehen muß weis ich nicht.

Bisher lautet meinen Konsolenbefehl: avrdude -c avrispmkII -P PORT -p m2560 -n -v

Fuses musst du nur einmal im "Programming Device" Fenster einstellen und auf den Chip übertragen, dann wars das Fusemäßig. Gespeichert wird das im Programm aber nicht.

Deswegen musst du im Code über #define F_CPU 16000000L dem Compiler sagen, dass du mit 16MHz arbeitest.

Das ist aber nur dann notwendig, wenn du irgendwas getimetes (_micros() ...) drinnen hast, ansonsten kannst du das auch weglassen.

Wenn du das nicht machst gibt der Compiler normalerweise eine Warnung aus in der er sagt, dass F_CPU nicht definiert worden ist.

Hallo,

habe mitbekommen das man mit dem Read Button in Atmel Studio die aktuellen Fuse Einstellungen einlesen kann. Okay, nur die will ich ja nicht verändern. Die Fuses möchte ich nicht verändern. Muß ich die dennoch einstellen? Im Grunde möchte ich nur meinen Sketch mittels mkII übertragen.

Nur der Arduino Bootloader wird dann gelöscht? Wenn ich mit mkII flashe? Die Fuses bleiben doch?

Ja du kannst das alles so lassen, wie es ist, wenn du nix ändern willst. Der Bootloader wird gelöscht aber die aktuell gesetzten Fuses bleiben erhalten.

Du musst in deinem Code nur mit dem definieren von F_CPU sagen, mit wieviel Takt der aktuell läuft wenn du timings drinen hast.

Hallo,

okay. Habe die Fuse so belassen und den Blink Sketch geflasht. Dabei kam keine Fehlermeldung. Allerdings blinkt die LED 13 nicht.

#define F_CPU 16000000L

const int ledPin =  13;      // the number of the LED pin

int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated

const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {

    pinMode(ledPin, OUTPUT);
}

void loop()
{
    unsigned long currentMillis = millis();

    if(currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;

        if (ledState == LOW)
        ledState = HIGH;
        else
        ledState = LOW;

        // set the LED with the ledState of the variable:
        digitalWrite(ledPin, ledState);
    }
}

Hast du mal geguckt, ob das nicht vielleicht an einem anderen Pin toggelt? Wenn es an keinem Pin Toggelt probier mal die LED einfach nur an bzw. aus zu machen.

Wenn das auch nicht geht, dann probier's mal in reinem C, vlt. stimmt da was im PlugIn nicht. Kann dir den Blink Sketch mal portieren.

Wie kommt's eigentlich zur Verwendung von Arduino C++ in Atmel Studio :D?

Visual Micro: http://www.visualmicro.com/

Geht auch mit Visual Studio Professional. Wenn man das mal gemacht hat will man wirklich nicht mehr zurück zur Arduino IDE.

Hallo,

gute Idee. Ich hab ja noch eine eine uralte selbst gebaute LED Leiterplatte mit 8 LEDs und Transistoren. Aus Zeiten wo ich mit dem Parallelport vom Amiga 500 experimentiert habe. Ein Pin an die 13 gesteckt. LED leuchtet. Sketch geändert das Pin 3, 4 und 13 blinken, meine LEDs blinken wie sie sollen im Sekundentakt. Nur die "Arduino LED 13" leuchtet nicht. Entweder ist die defekt oder bekommt keinen Saft, weil das das Board ist wo ich paar Bauteile runtergelötet habe. Da muß ich mal den Schaltplan konsultieren ... ja klar, die wird vom OPV angesteuert, den ich ausgelötet habe. ;) Okay, alles gut.

Noch eine Frage. Macht es einen Unterschied ob die .hex oder die .elf Datei flashe?

Wegen den Fuses nochmal. Ich könnte die in Atmel Studio auslesen, zum Bsp. Brown Detection Level ändern und flashen. Das war's?

Und was war mit dem Watchdogtimer? Sollte der aus sein oder nur eine Anfangswartezeit erhöht werden? Könnte ich jetzt alles korrigieren mit dem mkII.

Watchdog braucht man nicht wenn es vernünftig programmiert ist. Der löst einen Reset aus wenn man ihn nicht innerhalb des definierten Zeitraums zurücksetzt. Damit kann man also das Board in den Ausgangszustand bringen wenn es mal hängt.

Jop, du musst einfach nur in der IDE die Fuses einstellen dann auf "Program" klicken und schon ist es Fertig :D. Das ist schöne an Atmel Studio :D.

Wegen den .hex und .elf Datein kann ich dir leider nicht helfen. Ich denke aber, dass das einfach nur zwei verschiedene Formate für ein und das selbe Programm sind. Mit meinem ISP Programmierer kann ich jedenfalls beide flashen und es läuft nach upload bei beiden gleich, musst mal ausprobieren vlt. gehts auch bei dir.

Hallo,

ja. Ich hatte mal was gelesen das man die Wartezeit für den Watchdog erhöhen sollte, damit man noch Zeit zum neu flashen hat, falls man Mist programmiert hat. Wie ich Dich verstehe, kann man das Thema ignorieren, wenn man im Sketch kein Watchdog eingebaut hat?

Kann mir noch jemand sagen wie der Portname vom mkII heißt? Damit ich zum Abschluss avrdude testen kann um die Fuse damit auszulesen. Nur so.

Übrigens, wenn ich das "#define F_CPU 16000000L" weglasse, meckert der Compiler nicht rum. Ich nehme an, weil sich das Visual Micro Plugin darum kümmert? Ich programmiere ja nicht im nackten Atmel Studio.

Ich kann also wie von der IDE gewohnt in Atmel Studio Sketche schreiben, programmiere den µC aber über Device Programming mittels mkII. Sehe ich das richtig? War eine schwere Geburt.

Dieses #define macht shon die Arduino Software für dich. Wenn du das nochmal machst wird es überschrieben. Wenn man es schöner machen will macht man vorher deshalb #undef, z.B. um eine andere Frequenz zu setzen.

Hallo,

okay, alles klar erstmal. Vielen Dank an Euch. :)