Hi,
ich habe eine Frage zu der Verbindung zwischen USB und Atmega in einem
Arduino.
Wenn man den Arduino per USB verbindet kann man ihn programmieren oder
auch mit der seriellen Schnittstelle kommunizieren.
Wie ist das denn genau?
Wenn man auf "hochladen" klickt wird das Programm über den
USB-controller an die ISP SS. des Atmegas geschickt ?
Wenn man auf den seriellen Monitor klick, wird dann nur über USB mit RxD
und TxD kommuniziert.
Schaltet die USB SS. da immer um oder was ?!
Danke :D
fragso schrieb:> Wenn man auf "hochladen" klickt wird das Programm über den> USB-controller an die ISP SS. des Atmegas geschickt ?
Es wird erst der Controller resettet über einen der zusätzlichen Pins.
Es startet dann der Arduino-Bootloader, welcher ein paar Sekunden darauf
wartet, dass der PC ein neues Programm über die serielle Schnittstelle
schickt. Wenn das nicht passiert, startet das bereits vorhandene
Programm, welches dann die Schnittstelle zur Kommunikation nutzen kann
(Serial.print & Co).
Das Programmieren geht dabei nicht über ISP, sondern komplett über die
serielle Schnittstelle.
fragso schrieb:> Schaltet die USB SS. da immer um oder was ?!
Die USB- und Serielle-Schnittstelle bekommt da im Prinzip nichts mit; es
gehen nur mal eigene Daten, mal ein neues Programm drüber.
Danke.
Also der Bootloader merkt dann, dass es sich um Programmierdaten
handelt.
Warum wird den ISP nicht verwendet ?
Ist die USB SS einfach nur mit RxD und TxD verbunden ?
fragso schrieb:> Also der Bootloader merkt dann, dass es sich um Programmierdaten> handelt.
Daten, die direkt nach einem Reset kommen, müssen "Programmierdaten"
sein; da darf man nicht mit einem eigenen Programm auf den COM-Port
zwischenfunken, wobei der Bootloader vermutlich ungültige Daten
ignoriert.
fragso schrieb:> Warum wird den ISP nicht verwendet ?
Weil man dann einen zusätzlichen Programmieradapter zwischen ISP-Pins
und USB bräuchte; die Konstruktion mit der seriellen Schnittstelle
ermöglicht sowohl Programmieren als auch eigene Kommunikation über die
selbe Schnittstelle.
fragso schrieb:> Ist die USB SS einfach nur mit RxD und TxD verbunden ?
Nein, USB ist ein ganz eigenes Protokoll. Der FT232RL auf den Arduino
Boards (auf neueren ein eigener µC, der sich dem aber ähnlich verhält)
registriert sich per USB am PC und bildet einen Adapter auf die serielle
Schnittstelle.
fragso schrieb:> Warum wird den ISP nicht verwendet ?
Denn. Mit zwei n.
> Ist die USB SS einfach nur mit RxD> und TxD verbunden ?
Ja, mit einer zusätzlichen Handshakeleitung für den Reset.
(Sieh Dir den Schaltplan Deines Arduinos an)
Und mit einem USB-Seriell-Adapter kann die ISP-Schnittstelle nicht
genutzt werden, der müsste dafür ein komplett anderes Protokoll
unterstützen, was auch die auf dem PC laufende Software unterstützen
müsste.
fragso schrieb:> Warum wird den ISP nicht verwendet ?
weil es pro OS üblicherweise Treiber braucht für einen ISP Prommer.
> Ist die USB SS einfach nur mit RxD und TxD verbunden ?
ja denn Seriell können (fast) alle Compis. (CBM PET2001 konnte es nicht,
jedenfalls nicht ab Werk)
Es gibt aber auch Arduino-Artige die das anders machen, z.B. das
Olimexino-STM32 verbindet direkt die USB-Pins mit dem Mikrocontroller,
welcher USB-fähig ist. Mit einem entsprechenden Bootloader kann er dann
darüber vom PC programmiert werden, und eigene Anwendungen können den
USB beliebig nutzen. Das ISP-Äquivalent (JTAG/SWD) kann optional mit
einem externen Programmier/Debug-Adapter genutzt werden. Die serielle
Schnittstelle wird hier gar nicht genutzt.
Danke sehr !
>die Konstruktion mit der seriellen Schnittstelle>ermöglicht sowohl Programmieren als auch eigene Kommunikation über die>selbe Schnittstelle.
Ich habe den Atmega zb immer über ISP programmiert und dachte es wäre
einer von wenigen Möglichkeiten.
Hier sind ja noch mehr Informationen:
https://www.mikrocontroller.net/articles/AVR_In_System_Programmer
Also dort steht ja: *ISP,TPI,PDI,JTAG,Bootloader*
--
Bootloader
Einige wenige AVRs kommen bereits mit einem einprogrammierten
Bootloader. Bei diesen kann man ein zum Bootloader passendes Programm
nutzen um den AVR über eine im Bootloader definierte Schnittstelle zu
programmieren. Auf Bootloadern basierende Systeme haben ansonsten ein
Henne-Ei Problem. Irgendwie muss der Bootloader einmal konventionell in
den AVR programmiert werden, zum Beispiel mit ISP.
--
Ok jetzt verstehe ich das schon etwas besser:
Der Hersteller definiert am Anfang eine Schnittstelle im Bootloader
durch welche Programmcode auf den µC direkt nach dem Start
einprogrammiert werden kann.
Wenn der Fall auftritt, dass keine Programmdaten nach einem Reset
auftreten, wird auch nichts neues einprogrammiert und der µC geht in den
normalen Betrieb.
Wenn man auf "Hochladen" klickt, wird der Arduino dann zuerst
zurückgesetzt ?
Wie wird dieser Befehl "Reset" denn an den Arduino geschickt.
Oder wird einfach der Strom kurz unterbrochen ? xD
Danke :D
Niklas G. schrieb:> Es gibt aber auch Arduino-Artige die das anders machen,
Genau!
Arduinos mit Atmega328P und 2560 nutzen verschiedenste Seriel zu USB
Adapter/Chips.
Arduinos mit ATmega32U4 können USB direkt, und haben eine zusätzliche
native Serielle
Der DUE kann beides, Seriell zu USB über einen Atmege16U2
Und USB direkt.
Das waren jetzt nur die wichtigsten....
Bei den China Nachbauten und sonstigen Fremdprodukten kommen
verschiedenste Seriel zu USB Adapter/Chips zum Einsatz. Gibt sicherlich
1/2 Dutzend üblicher Varianten.
fragso schrieb:> Wenn man auf "Hochladen" klickt, wird der Arduino dann zuerst> zurückgesetzt ?
Ja
> Wie wird dieser Befehl "Reset" denn an den Arduino geschickt.> Oder wird einfach der Strom kurz unterbrochen ? xD
Nein, dafür ist keine Schaltung vorhanden. Der USB-Seriell-Adapter (bei
älteren Arduinos der FT232RL) hat eine extra Leitung (bei FT232RL: Eine
der Handshake-Leitungen), über welche der RESET-Eingang des AVR kurz auf
"Low" gezogen wird, was den Controller resettet. Nach dem Reset startet
als Erstes der Bootloader, welcher dann ein neues Programm in Empfang
nehmen und flashen kann.
Arduino Fanboy D. schrieb:> Die 32U4 machen ihren Reset, wenn für kurze Zeit auf 1200Baud gestellt> wird.
Uhm, was für ein Hack. Man möchte sagen, Arduino-Typisch... Hätte es da
kein eigener USB-Request getan? Oder ein richtiger USB-Reset?
Niklas G. schrieb:> Hätte es da> kein eigener USB-Request getan? Oder ein richtiger USB-Reset?
Dürfte einen eigenen Treiber erfordern.
So gehts über den generischen USB-Seriell Treiber für virtuelle COM
Ports.
Betriebssystem übergreifend.
Arduino Fanboy D. schrieb:> Betriebssystem übergreifend.
Ginge es mit libusb auch, unter Windows mit WinUSB. Die
Signatur-Problematik besteht so oder so; auch für einen Seriell-Port
braucht's bis Win7 eine signierte .cat+.inf, wenn man eine eigene
VID+PID nutzt, was glaube ich bei Arduino der Fall ist. Mit einem
Composite Device ginge das parallel zum "normalen" Parallel-Port...
Es sind zwei paar Schuhe, was man sich wünscht, und was man bekommt.
Oder anders Formuliert:
> Hätte, hätte, Fahrradkette.
Nein, es kann nicht meine Rolle sein, die getroffenen Entscheidungen zu
rechtfertigen.
Kann nur sagen, wie es jetzt ist.
Das bewerten überlasse ich gerne dir, und anderen.
Bin aber recht sicher, dass das Thema ausufernd diskutiert wurde.