INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
USB neu programmieren oder Daten schreiben
11.05.2016, 19:00
Beitrag #1
USB neu programmieren oder Daten schreiben
Über den USB-Port des Arduino kann man ihn neu programmieren.
Gleichzeitig kann man diesen Port auch für eigene Ein und Aus-gaben brauchen.

Wen man Daten an den Port schreibt, wie weis der Arduino, ober er sich neu programmieren soll, oder ob nur eigene Daten ankommen ?

Wird da irgend eine spezielle Bitfolge am Anfang gesendet, oder wie läuft dies ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2016, 20:19
Beitrag #2
RE: USB neu programmieren oder Daten schreiben
(11.05.2016 19:00)Mathias schrieb:  Wird da irgend eine spezielle Bitfolge am Anfang gesendet, oder wie läuft dies ?

Der Arduino wird zuvor durch einen def. Reset in den Programmiermodus gesetzt.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2016, 21:18
Beitrag #3
RE: USB neu programmieren oder Daten schreiben
Zitat:Der Arduino wird zuvor durch einen def. Reset in den Programmiermodus gesetzt.
Aber wie weis der Arduino ob das ein Reset-Code ist, oder ob Daten kommen ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2016, 21:56
Beitrag #4
RE: USB neu programmieren oder Daten schreiben
(11.05.2016 21:18)Mathias schrieb:  
Zitat:Der Arduino wird zuvor durch einen def. Reset in den Programmiermodus gesetzt.
Aber wie weis der Arduino ob das ein Reset-Code ist, oder ob Daten kommen ?

Der Arduino bekommt den Reset aus dem Serial-USB-Wandler. Ob es da einen bestimmten Code gibt, bin ich überfragt. Kannst du sicher im Datenblatt nachlesen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2016, 18:43
Beitrag #5
RE: USB neu programmieren oder Daten schreiben
(11.05.2016 21:18)Mathias schrieb:  
Zitat:Der Arduino wird zuvor durch einen def. Reset in den Programmiermodus gesetzt.
Aber wie weis der Arduino ob das ein Reset-Code ist, oder ob Daten kommen ?

Das ist eine interessante Frage.
Insbesondere wo man das Protokoll dafür findet.
Man könnte damit evtl. auch übergrosse Programmteile auf eine SD-Karte auslagern und bei Bedarf nachladen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2016, 18:53 (Dieser Beitrag wurde zuletzt bearbeitet: 12.05.2016 18:54 von Mathias.)
Beitrag #6
RE: USB neu programmieren oder Daten schreiben
Ein Reset im Programm-Code einbauen ist einfach:
Code:
asm volatile ("  jmp 0");

Aber interessant wäre es trotzdem, was am COM-Port anders ist als bei normaler Übertragung.
Irgend ein Handshake-Code kann es nicht sein, das die Serielle Übertragung nur über 2 Leitungen plus Masse ist. Dies ist Pin 0+1 .
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2016, 20:26 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2016 20:29 von amithlon.)
Beitrag #7
RE: USB neu programmieren oder Daten schreiben
Hallo,

(12.05.2016 18:53)Mathias schrieb:  Ein Reset im Programm-Code einbauen ist einfach:
Code:
asm volatile ("  jmp 0");

Aber interessant wäre es trotzdem, was am COM-Port anders ist als bei normaler Übertragung.
Irgend ein Handshake-Code kann es nicht sein, das die Serielle Übertragung nur über 2 Leitungen plus Masse ist. Dies ist Pin 0+1 .

naja, dann schau Dir doch einfach, wie der vom Arduino auf den Mega328 installierte Bootloader funktioniert, das sollte alles im netz verfügbar sein, je nach dem, ob der alte Bootloader oder Opiboot oder ein anderer Bootloader installiert ist.
Ist alles im Ordner der Arduino-IDE zu finden. Da zum Programmieren aus der IDE AVRDude benutzt wird kann man auch die Kommandozeile suchen, die jeweils benutzt wird. In der AVRDude-Beschreibung sollte dazu dann näheres stehen usw.

Nichts davon ist ein Geheimnis, letztlich ist Arduino ein AVR (oder auch ein anderer Prozessor), in der IDE liegen irgendwo die boards.txt, die beschreiben, was wie mit welchem Arduino genutzt wird.

Die IDE ist nur ein Framework, die den Editor über einige Hilfsprogramme und etliche Scripte mit dem GCC-Compiler und AvrDude und noch einigen Zutaten verbindet.

Zu Deiner Anmerkung mit der SD-Card: schau Dir das Atmel-Datenblatt des genutzen AVR an (ATMEga328 bei Uno/Nano/PreMini), dann wirst Du feststellen, daß der AVR keine von-Neumann-Architektur ist und damit Programme nur aus seinem Flash ausführen kann. Theoretisch könnte man ein Konstrukt basteln, bei dem er selbst zur Laufzeit einen Teil seines Flash von SD-Card überschreibt. Praktisch nicht machbar. Du müßtest für jedes Teil vorher bestimmen, an welche Flashadresse Du es schreiben willt, um es dann dort aufrufen zu können.
Dabei natürlich genau auseinandernehmen, daß nit 2 Sacehn gleichzeitig genutzt werden, die im gleichen Flashbereich laufen müssen usw.

Ein Sprung auf Adresse 0 ist übrigens kein echter Reset. Bei einem Hardware-Reset sind alle internen Register des AVR auf bestimmten default-Werten, bei einem Jump auf 0 bleiben die aber erhalten, auch Timer, Interrupts usw. bleiben aktiv, wenn man das nicht vor dem JMP 0 alles im Programm von Hand aufräumt.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2016, 21:07
Beitrag #8
RE: USB neu programmieren oder Daten schreiben
(14.05.2016 20:26)amithlon schrieb:  Hallo,

(12.05.2016 18:53)Mathias schrieb:  Ein Reset im Programm-Code einbauen ist einfach:
Code:
asm volatile ("  jmp 0");

Aber interessant wäre es trotzdem, was am COM-Port anders ist als bei normaler Übertragung.
Irgend ein Handshake-Code kann es nicht sein, das die Serielle Übertragung nur über 2 Leitungen plus Masse ist. Dies ist Pin 0+1 .

naja, dann schau Dir doch einfach, wie der vom Arduino auf den Mega328 installierte Bootloader funktioniert, das sollte alles im netz verfügbar sein, je nach dem, ob der alte Bootloader oder Opiboot oder ein anderer Bootloader installiert ist.
Ist alles im Ordner der Arduino-IDE zu finden. Da zum Programmieren aus der IDE AVRDude benutzt wird kann man auch die Kommandozeile suchen, die jeweils benutzt wird. In der AVRDude-Beschreibung sollte dazu dann näheres stehen usw.

Nichts davon ist ein Geheimnis, letztlich ist Arduino ein AVR (oder auch ein anderer Prozessor), in der IDE liegen irgendwo die boards.txt, die beschreiben, was wie mit welchem Arduino genutzt wird.

Die IDE ist nur ein Framework, die den Editor über einige Hilfsprogramme und etliche Scripte mit dem GCC-Compiler und AvrDude und noch einigen Zutaten verbindet.

Zu Deiner Anmerkung mit der SD-Card: schau Dir das Atmel-Datenblatt des genutzen AVR an (ATMEga328 bei Uno/Nano/PreMini), dann wirst Du feststellen, daß der AVR keine von-Neumann-Architektur ist und damit Programme nur aus seinem Flash ausführen kann. Theoretisch könnte man ein Konstrukt basteln, bei dem er selbst zur Laufzeit einen Teil seines Flash von SD-Card überschreibt. Praktisch nicht machbar. Du müßtest für jedes Teil vorher bestimmen, an welche Flashadresse Du es schreiben willt, um es dann dort aufrufen zu können.
Dabei natürlich genau auseinandernehmen, daß nit 2 Sacehn gleichzeitig genutzt werden, die im gleichen Flashbereich laufen müssen usw.

Ein Sprung auf Adresse 0 ist übrigens kein echter Reset. Bei einem Hardware-Reset sind alle internen Register des AVR auf bestimmten default-Werten, bei einem Jump auf 0 bleiben die aber erhalten, auch Timer, Interrupts usw. bleiben aktiv, wenn man das nicht vor dem JMP 0 alles im Programm von Hand aufräumt.

Gruß aus Berlin
Michael

Der komplette NeuInit eines Programmes ist das Eine.
Man könnte aber so eine Funktion etwa
void overload (char* ModulName)
schaffen
Nehmen wir an es gäbe Module etwa
void Modul1 (...)
void Modul2 (...) etc.
bei der Benutzung von overload (char* ModulName)
bliebe das gesamte Environment erhalten.
overload sorgt dafür, dass das Modul von SD-Karte an die passende Stelle im Speicher befördert wird, schiebt den Stack rein und macht den Aufruf von Modulx.
Gehörig Gehirnschmalz müsste man sicher dahingehend investieren, wie man die Module mit der IDE oder anderswie richtig herstellen könnte.
Damit liessen sich Programme entwickeln die den Speicherraum übersteigen.

Eine andere Lösung wäre natürlich, die Arduinos 50 Cent teurer zu machen und dafür ordentlich mit mehr Speicher aufzurüsten :-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Gartenbewässerung mit Arduino und/oder ESP8766 alpenpower 6 671 02.09.2016 19:30
Letzter Beitrag: NetRap
  Ethernetshield am Netz oder nicht Wampo 7 868 30.11.2015 21:53
Letzter Beitrag: Wampo
  [gelöst] ATtiny mit Arduino programmieren - Frage zur Hardware Gelegenheitsbastler 4 932 10.09.2015 11:55
Letzter Beitrag: Bitklopfer
  4.3" oder 5" TFT-LCD mit Touch wo kaufen? alpenpower 73 8.434 07.09.2015 19:53
Letzter Beitrag: fraju
  Anfänger braucht Hilfe: Serielle Daten auswerten und weiterverarbeiten Phreak2010 2 1.231 14.06.2015 18:34
Letzter Beitrag: Home38
  und wieder mal: schnelle Hardware-SPI Displays (oder UART) HaWe 2 1.231 08.05.2015 19:00
Letzter Beitrag: HaWe
  Wie Bootloader mit AVRisp mk II schreiben? gregors 9 1.557 01.05.2015 12:58
Letzter Beitrag: Thorsten Pferdekämper
  Wer hat pcDuino3 oder pcDuinoV2? HaWe 0 680 20.02.2015 15:52
Letzter Beitrag: HaWe
  "USV" zum Schreiben auf SD-Card Foto-Ralf 3 1.151 02.02.2015 18:49
Letzter Beitrag: ardu_arne
  Audio-Output oder so ähnlich?^^ luucdev 2 902 21.01.2015 16:58
Letzter Beitrag: luucdev

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste