PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WinAVR - Flash Reset bei Arduino Mega2560 im Atmel Studio



robo_tom_24
18.01.2013, 22:55
Hallo miteinander,
ich programmiere mein Arduino Board in Arduino-C und "normalem" C, flashen tu ich "normales" C übers Atmel Studio, um genau zu sein über ein externes Tool, welches über WinAVR - avrdude.exe läuft. Um ein neues Programm aufspielen zu können muss ich immer Reset drücken und das Tool ausführen. Aus Layoutgründen kann ich bei meinem "mini-Gameboy" keinen Reset Taster (in "schöner"/praktischer Form, ohne einen kompletten Hardwareumbau (es ist fertiges Shield mit Lochrasterbereich)) einbauen. Kann ich das Tool/Programm irgendwie modifizieren um keinen manuellen Reset auslösen zu müssen?

Anm.: Irgendwie muss es ja gehen, wie machts denn sonst die Arduino IDE?

grüße

ePyx
19.01.2013, 08:45
Schon einmal die Schaltpläne der Arduino-Boards angesehen? Was fällt einem auf ? RTS ist mit Reset über 100 nF verbunden. Sobald eine serielle Kommunikation aufgebaut wird, geht RTS gegen Masse und der Controller führt einen Reset durch. Bei avrdude sind auch Programmer wie stk500v2 und arduino realisiert, die den RESET durchführen und dann flashen (Bootloader vorausgesetzt).

pirndi
19.01.2013, 08:48
Hy!

Welches Kabel benützt du zum Programmieren ein normales ISP bzw JTAG sollte den Reset eigentlich selbst durchführen.

ePyx
19.01.2013, 10:01
Das er RESET drücken muss, sagt eigentlich schon das er weder ISP noch JTAG benutzen wird.

robo_tom_24
19.01.2013, 11:42
Ja, das hab ich mir gerade angesehen...
Es ist mir aber nicht ganz klar wie das funktionieren soll. Wie soll ich dann eine normale Serielle Kommunikation zum PC aufbauen, ohne einen Reset auszulösen?
Ich vermute das funktioniert über eine spezielle Zeichenfolge etc. die der kleine µC dann als Resetanforderung hält und die Leitung auf HIGH zieht...

ePyx
19.01.2013, 12:02
Wie soll ich dann eine normale Serielle Kommunikation zum PC aufbauen, ohne einen Reset auszulösen?.
Ja, so schwer kann das Leben sein.

Ich vermute das funktioniert über eine spezielle Zeichenfolge etc. die der kleine µC dann als Resetanforderung hält und die Leitung auf HIGH zieht...

Nöp. Grundlagen serielle Schnittstelle. Der Pin wird eigentlich für die Flusssteuerung benutzt. Die Arduino-Boards nutzen den Pin um in den Bootloader zu kommen, also einen RESET durchzuführen. Nix Befehl, nix Sequenz! Siehe Arduino Auto-Reset etc.

robo_tom_24
19.01.2013, 16:40
Danke für die tollen Antworten -.-
Könntest du mir das bitte genauer erklären? Das einzige was ich verstanden habe ist, dass ich einen 120Ohm Widerstand einbauen muss um Auto-Reset zu verhindern.... Das will ich aber nicht!

Könntest du mir das bitte genauer erklären? Ich versteh nämlich nicht wie man dem kleinen Controller von extern sagen kann, dass er nun den "Bootmodus" starten soll...

ePyx
20.01.2013, 19:00
Wenn ich dir etwas erklären soll, dann musst du konkret sagen was du willst und wo dein Problem ist.

Stimmt schon, dass beim Aufbau dann immer ein Reset ausgelöst wird. Aber letzten Endes musst du halt wissen was du willst. Entweder du willst, dass per Hardware der Bootloader gestartet wird oder du implementierst es per Software.
Per Software gäbe es dann so Dinge wie springe nach Adresse 0x00 oder man nutzt den Watchdog für seine Belange. Wenn du es per Software machst, dann musst du dir halt eine Zeichenfolge ausdenken die den Reset auslöst
und dir einen Interpreter für die serielle Schnittstelle schreiben. ist ja auch nicht so das Problem, wenn man "richtiges" C programmiert. Ansonsten halt überlegen, ob der Reset beim Aufbau so eine wichtige Rolle spielt. Benutze d
ie Arduino-Lösung auch auf meinen Boards, aber da geh ich eigentlich auch nur zu Debuggen oder Flashen von neuer Firmware ran.

Der Aufwand ist halt sehr marginal und ein bisschen Lackdraht und einen 1206 Kondensator kann man auch mit Sekundenkleber nachträglich "verbauen".

robo_tom_24
20.01.2013, 19:25
Gut ok, mein Fehler...
Mein Problem liegt darin, zu verstehen, wann nun ein Reset ausgelöst wird. Bei jeder seriellen Tätigkeit kann das ja nicht sein, sondern nur beim Flashen mit der Arduino Software. Konkret möchte ich nun wissen, wie ich diese Funktion der Arduino Software in WinAVR bzw. ins Atmel Studio einbauen kann, damit ich nicht immer einen manuellen Reset durchführen muss ;)

ePyx
20.01.2013, 19:42
Die Arduino IDE, führt den Reset auch bei jedem Verbindungsaufbau durch. Daher gibt es ja auch Leute, die den Auto-Reset abschalten wollen und demnach den Widerstand einlöten.

Man kann auch das Folgende Aufbauen : RTS-Pin -> Schalter -> Kondensator -> Reset

Wenn Geschlossen dann Auto-Reset aktiv, wenn offen funzt es ganz normal.

robo_tom_24
20.01.2013, 20:44
Macht das nur die Arduino IDE oder jedes Schnittstellenprogramm?

ePyx
22.01.2013, 07:07
Naja die Arduino-IDE benutzt avrdude und gibt als Programmer "arduino" oder stk500v2 an. Praktisch gesehen, sollte der RTS-Pin nur bei Hardware-Flusssteuerung nach Masse gezogen werden. Daher gibt es keine klares "JA" oder "NEIN". Probier es doch einfach aus, schließlich hast du doch ein Arduino-Board oder?

robo_tom_24
22.01.2013, 13:38
Ja, hab ich...
Wie soll ichs ausprobieren? :confused:

ePyx
22.01.2013, 15:01
HTerm oder so nehmen und auf den COM-Port verbinden. Wenn die LED die an SCK häng (D13 ist es bei den kleinen Arduinos) rumzappelt dann wurde bei deinem Board ein Reset ausgelöst.

robo_tom_24
22.01.2013, 22:30
Ich weiß jetzt nicht ob ich das richtig gemacht hab...
Beim senden von einem Text muss ich das RTS anklicken und wegschicken oder? (ich verwende HTerm - normalerweise RealTerm, aber funktioniert auf dem PC nicht)

Wenn ja, dann löst es keinen Reset aus :confused:

ePyx
23.01.2013, 05:20
Also bei mir wird der Reset nur durchgeführt, wenn ich per AVRDude ein Hexfile flashe. Bei der normalen seriellen Verbindung konnte ich nichts feststellen. Werde es heute abend aber nochmal mit einem originalem Arduino testen.

robo_tom_24
23.01.2013, 08:34
Ok, das selbe beobachte ich auch ;)

Wie kann ich nun die "Resetfunktion" in mein externes Tool beim Atmel Studio einbauen? Irgendwie bei den Arguments vielleicht?