Forum: Mikrocontroller und Digitale Elektronik Arduino - zeitkritische Signale


von Johannes (johannes_13579)


Lesenswert?

Hallo liebes Forum,

Ich habe auf der Arbeit ein Problem mit einem Arduino.
Die Aufgabe des Arduino soll es sein, ein Signal für eine bestimmte 
vorher eingestellte Zeit auszugeben, am besten sehr genau.
Dass die delay()-Funktion dafür nicht gut geeignet ist, ist mir bekannt, 
also habe ich es mit der millis()-Funktion versucht, aber auch hier ist 
das Ergebnis nicht viel genauer. (Beispiel: 500ms Soll-Schalten, 634ms 
Ist-Schalten). Beim Vermessen des Signals mit dem Oszi habe ich das 
Gefühl bekommen, dass die Zeiten rein zufällig sind, teils genau 500ms, 
dann aber auch mal 680ms. Hinzukommen andere komische Verhaltensweisen 
bei der Verwendung von Millis, zum Beispiel dass sich das ganze nicht 
wiederholen lässt, sondern der Arduino in einer "unsichtbaren" Schleife 
hängt.
Ich habe vor etwas längerer Zeit schon mal etwas mit Timer-Interrupts 
gemacht. Die waren dann auch ziemlich genau, aber das scheint mir hier 
irgendwie ungeeignet.

Jetzt zu meiner eigentlichen Frage:
Gibt es eine andere Möglichkeit, den Arduino zeitlich genauer zu nutzen 
oder ist er für zeitkritische Signale schlicht nicht gemacht?

Ich freue mich auf Eure Antworten, vielen Dank schonmal.

von A. Z. (donvido)


Lesenswert?

Du kannst einen Arduino (so ziemlich egal welcher) auch 
mikrosekundengenau verwenden. Zeitkritikalität wird je nach Umfang des 
Programms erst im Nanosekundenbereich interessant.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Arduino geheim
Code geheim
Schaltplan geheim

Johannes schrieb:
> sondern der Arduino in einer "unsichtbaren" Schleife
> hängt.
Rege Fantasie!
Tipp:
Es sind immer die anderen Schuld.
Und Arduino sowieso.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Johannes schrieb:
> andere komische Verhaltensweisen bei der Verwendung von Millis
millis() verhält sich nicht "komisch", denn es ist lediglich ein 
Millisekundenzähler. Wenn du bei dessen Verwendung Probleme mit 
Abweichungen und Jitter hast, dann liegt das konkret allein an deinem 
Programm.

> Ich habe vor etwas längerer Zeit schon mal etwas mit Timer-Interrupts
> gemacht. Die waren dann auch ziemlich genau, aber das scheint mir hier
> irgendwie ungeeignet.
Worauf basiert dieser Schein? millis() basiert auch auf einem 
Timer-Interrupt: vereinfacht kommt jede ms ein Interrupt, der den 
millis-Timer hochzählt.

Johannes schrieb:
> ein Signal für eine bestimmte vorher eingestellte Zeit auszugeben, am
> besten sehr genau.
Quantifiziere "sehr genau" in Zahlen. Ich verstehe unter "sehr genau" 
Zeiten im ns-Bereich.

> Timer-Interrupts gemacht. Die waren dann auch ziemlich genau
Wenn man ein Signal "sehr genau" high und low schalten will, dann nimmt 
man nicht mal einen Timerinterrupt, sondern man lässt den Timer per 
Compare-Register den Pin direkt toggeln.

von Georg M. (g_m)


Lesenswert?

Johannes schrieb:
> Beispiel: 500ms Soll-Schalten

500.0ms Impuls bei 16MHz Takt sollte eigentlich kein Problem sein.

von Falk B. (falk)


Lesenswert?

Johannes schrieb:
> Ich habe auf der Arbeit ein Problem mit einem Arduino.
> Die Aufgabe des Arduino soll es sein, ein Signal für eine bestimmte
> vorher eingestellte Zeit auszugeben, am besten sehr genau.

Wie genau? Siehe Netiquette!

"Das Problem in Zahlen fassen! Nicht einfach schreiben "so schnell wie 
möglich", "so stromsparend wie möglich" etc, sondern mal ein paar Zahlen 
nennen. X MHz, Y ms, Z µA etc. Wenn man keine exakte Vorstellung davon 
hat, sollte wenigstens eine Größenordnung angegeben werden (1..5 MHz, 
<1mA etc.)"

> Dass die delay()-Funktion dafür nicht gut geeignet ist, ist mir bekannt,

Das stimmt so allgemein nicht.

> also habe ich es mit der millis()-Funktion versucht, aber auch hier ist
> das Ergebnis nicht viel genauer. (Beispiel: 500ms Soll-Schalten, 634ms
> Ist-Schalten).

Dann hast du maximalen Murks programmiert oder gemessen. millis() ist 
auf 1ms genau mit max. 1ms Jitter.

> Beim Vermessen des Signals mit dem Oszi habe ich das
> Gefühl bekommen, dass die Zeiten rein zufällig sind, teils genau 500ms,
> dann aber auch mal 680ms.

Siehe oben.

> Hinzukommen andere komische Verhaltensweisen
> bei der Verwendung von Millis, zum Beispiel dass sich das ganze nicht
> wiederholen lässt, sondern der Arduino in einer "unsichtbaren" Schleife
> hängt.

Siehe oben.

> Ich habe vor etwas längerer Zeit schon mal etwas mit Timer-Interrupts
> gemacht. Die waren dann auch ziemlich genau, aber das scheint mir hier
> irgendwie ungeeignet.

So ein Unsinn!

> Jetzt zu meiner eigentlichen Frage:
> Gibt es eine andere Möglichkeit, den Arduino zeitlich genauer zu nutzen

Sicher.

> oder ist er für zeitkritische Signale schlicht nicht gemacht?

Quark.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Johannes schrieb:
> Dass die delay()-Funktion dafür nicht gut geeignet ist, ist mir bekannt,
> also habe ich es mit der millis()-Funktion versucht, aber auch hier ist
> das Ergebnis nicht viel genauer.

Weder delay noch millis erzeugen für sich gesehen ein Signal. Auf das
Drumherum kommt es an, und da hast du offensichtlich Käse gebaut.
Beseitige diesen Käse, und das Ganze wird funktionieren.

von Falk B. (falk)


Lesenswert?

Yalu X. schrieb:
> und da hast du offensichtlich Käse gebaut.
> Beseitige diesen Käse, und das Ganze wird funktionieren.

Nein Quark! Käse wird erst draus, wenn man den zu lange liegen läßt! ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Falk B. schrieb:
> Yalu X. schrieb:
>> und da hast du offensichtlich Käse gebaut.
>> Beseitige diesen Käse, und das Ganze wird funktionieren.
>
> Nein Quark! Käse wird erst draus, wenn man den zu lange liegen läßt! ;-)

Woher weißt du, wie lange der TE an seinem Code schon herumgemacht hat?
;-)

: Bearbeitet durch Moderator
von Helmut -. (dc3yc)


Lesenswert?

Falk B. schrieb:
> Yalu X. schrieb:
>> und da hast du offensichtlich Käse gebaut.
>> Beseitige diesen Käse, und das Ganze wird funktionieren.
>
> Nein Quark! Käse wird erst draus, wenn man den zu lange liegen läßt! ;-)

Dann sollten wir uns auf Milch einigen! Denn Milch ist die Grundlage 
allen Quarks und Käses!

Und wie ein Vorschreiber schon schrub, mit millis() kommt man auf eine 
Genauigkeit von einer Millisekunde +1ms Toleranz.

von Rainer W. (rawi)


Lesenswert?

Johannes schrieb:
> Die Aufgabe des Arduino soll es sein, ein Signal für eine bestimmte
> vorher eingestellte Zeit auszugeben, am besten sehr genau.

"sehr genau" wird vom Aufwand nur noch von "möglichst genau" 
übertroffen.

Ein erster Schritt wäre, eine Atomuhr als Zeitbasis für den Taktes des 
Arduinos zu verwenden ;-)

von Falk B. (falk)


Lesenswert?

Rainer W. schrieb:
> Ein erster Schritt wäre, eine Atomuhr als Zeitbasis für den Taktes des
> Arduinos zu verwenden ;-)

Geht nicht mehr, Deutschland hat den Automausstieg vollzogen!

von Jan H. (jan_h74) Flattr this


Lesenswert?

Das "ungenaue" ist wahrscheinlich in ihre "loop" durchlauf. Lass mal 
ihre code sehen.

von Joachim B. (jar)


Lesenswert?

Falk B. schrieb:
> Geht nicht mehr, Deutschland hat den Automausstieg vollzogen!

und was ist damit?
https://www.base.bund.de/DE/themen/kt/kta-deutschland/kta-uebersicht/forschungsreaktoren/forschungsreaktoren.html

von M. K. (sylaina)


Lesenswert?

Johannes schrieb:
> Ich habe vor etwas längerer Zeit schon mal etwas mit Timer-Interrupts
> gemacht. Die waren dann auch ziemlich genau, aber das scheint mir hier
> irgendwie ungeeignet.

Warum sollten die ungeeignet sein, sind sie doch grade für zeitkritische 
Aktionen unumgänglich?
millis() arbeitet IMHO auch mit Timerinterrupts aber das wurde ja schon 
erwähnt. Ich tippe darauf, dass das Problem zwischen Stuhl und Tastatur 
zu suchen ist ;)

von Rainer W. (rawi)


Lesenswert?

M. K. schrieb:
> millis() arbeitet IMHO auch mit Timerinterrupts aber das wurde ja schon
> erwähnt.

millis() tut da recht wenig. Es fragt nur den Wert der Variablen 
timer0_millis ab und schaltet während des Zugriffs Interrupts ab, 
damit niemand dazwischen funken kann. (s. wiring.c)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Johannes schrieb:
> Ich habe vor etwas längerer Zeit schon mal etwas mit Timer-Interrupts
> gemacht.

Interrupts sind das Mittel der Wahl, wenn die Mainloop noch nen ganzen 
Schrunz an anderen Tasks auszuführen hat.
Prinzipiell ist das kürzesete in der Mainloop zu erreichende 
Zeitintervall die maximale Durchlaufzeit der Mainloop (worst case).

von Klaus S. (kseege)


Lesenswert?

Johannes schrieb:
> Gibt es eine andere Möglichkeit, den Arduino zeitlich genauer zu nutzen
> oder ist er für zeitkritische Signale schlicht nicht gemacht?

Um Ergebnisee wie die von Dir beschriebenen zu erzielen, muß man 
irgendwo granatenmäßig danebenliegen. Respekt!

Zum Erfolg könnte beitragen, die zwei Blinkprogramme in den Beispielen 
auszuprobieren. Einmal in Beispiele-01.Basics-Blink und einmal in
Beispiele-02.Digital-Blinkwithoutdelay. Dort wird die millis-Funktion 
korrekt verwendet.

Beide Beispiele arbeiten sehr genau, wie man mit einer Stoppuhr 
(Smartphone reicht) leicht selber nachmessen kann.

Gruß Klaus (der soundsovielte)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Interrupts sind das Mittel der Wahl
Allerdings darf man sich nicht wundern, dass es auch da ab und zu mal 
hakt, wenn dann z.B. das in der SIO-ISR das gerade empfangene Zeichen 
zur Kontrolle gleich per Bitbanging auf ein Display ausgegeben wird.

von Brüno (dominic_m833)


Lesenswert?

Den Ausgang direkt an den Timer binden funktioniert super: 
Beitrag "Re: Präzise Pulse aus Arduino Leonardo"

von Rainer W. (rawi)


Lesenswert?

Klaus S. schrieb:
> Beide Beispiele arbeiten sehr genau, wie man mit einer Stoppuhr
> (Smartphone reicht) leicht selber nachmessen kann.

Lothar M. schrieb:
> Ich verstehe unter "sehr genau" Zeiten im ns-Bereich.

Die Vorstellungen von "sehr genau" sind halt sehr verschieden ;-)

von Sebastian W. (wangnick)


Lesenswert?

Johannes schrieb:
> teils genau 500ms, dann aber auch mal 680ms

Das liegt an den anderen delay() oder ähnlichen Warteschleifen die in 
deinem Code (oder in von deinem Code benutzten Bibliotheken) noch 
irgendwo drin sind. Solange der Arduino in so einem delay() hängt kommt 
er nicht zu den millis() zurück!

LG, Sebastian

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Sebastian W. schrieb:
> Solange der Arduino in so einem delay() hängt kommt
> er nicht zu den millis() zurück!

Tipp:
Es gibt ein Leben neben delay()

---
Aber der TO ist sowieso schon lange weg.....

von Klaus S. (kseege)


Lesenswert?

Rainer W. schrieb:
> Die Vorstellungen von "sehr genau" sind halt sehr verschieden ;-)

Und vom Sujet abhängig. Ich finde  beispielsweise bei einer 
Gehaltszahlung zum Monatsanfang die Nanosekundengenauigkeit übertrieben 
;-)

Gruß Klaus (der soundsovielte)

von Peter (pittyj)


Lesenswert?

Ich habe einen Kollegen, der hat das gleiche Problem.
Nur konnte ich da mal auf den Sourcecode schauen.
Alles lief prima, bis die Details mit serial.printf() ausgegeben wurden.
Und da hat diese Funktion eben eine ganze Zeit dafür benötigt. Ist halt 
ein Uart.

Irgendein Code von Johannes gibt's anscheinend nicht. Mehr ein 
Freitagstroll?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Er ist immerhin schon mehr als einen Monat hier angemeldet. Den Echten 
Troll erkennt man an zeitnaher Anmeldung, und ward nie wieder gesehen.

Die Arduino-Welt versteckt ja alles was den jungen Anwender verwirren 
könnte. Interrupts sind viel zu kompliziert.
https://de.wikipedia.org/wiki/Ad_usum_Delphini

Wenn man das Timing in Assembler oder C programmiert sind Impulse <1µs 
kein Problem. Der Arduino hat einen 16 MHz-Quarz, ein Takt dauert also 
1/16 µs.

von Uwe (sailectric)


Lesenswert?

Für zeitkritische Aufgaben haben Microcontroller idR Timer-Einheiten. 
Aber so lange Du die Aufgabe nicht genauer spezifizieren kannst, kann 
man auch keine vernünftige Antwort darauf geben.
Was verstehst du unter "Signal genau ausgeben"? Ein Signal in der 
Nachrichtentechnik kann alles sein. Ein Puls, ein Ton, ein Lichtsignal, 
eine Radiosendung, ein Radar-Chirp, eine Gravitationswelle... Was ist 
dein "Signal"?
Soll ein Rechteckpuls oder eine Folgen von Pulsen oder nur eine Flanke 
ausgegeben werden? Falls es ein Rechteckpuls sein soll, wie breit und 
mit welchen Toleranzen. Ist es egal, WANN er ausgegeben werden soll oder 
soll das Signal durch irgendwas getriggert werden. Wie soll der 
zeitliche Zusammenhang zum Trigger sein?
Welcher Arduino soll verwendet werden oder ist das offen? Es gibt zig 
Arduinos mit den unterschiedlichsten Microcontrollern mit sehr 
verschiedenen Möglichkeiten, genaue Signale zu erzeugen.
Deine Frage gleicht der Frage: ich möchte etwas schweres transportieren. 
Geht das mit einem Gabelstapler?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> Timer-Einheiten
Er will ja anscheinend in der Arduino-Entwicklungsumgebung 
programmieren. Da muss er nehmen was die anbietet. Die genannten 
Funktionen

> delay()-Funktion ...  millis()-Funktion
benutzen im Hintergrund vermutlich auch die Timer, vielleicht sogar 
Interrupts, aber für den Anwender bleibt das verborgen.

: Bearbeitet durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

Christoph db1uq K. schrieb:
> Er will ja anscheinend in der Arduino-Entwicklungsumgebung
> programmieren. Da muss er nehmen was die anbietet.

Nö; man kann auch in der Arduino-Entwicklungsumgebung direkt mit den 
Timern arbeiten, und man kann sogar eigene Interruptroutinen dafür 
schreiben.

Man sollte nur nicht den Timer verwenden, der für das ganze delay() und 
millis-Gehampel verwendet wird, aber die meisten µCs haben ja mehrere 
davon ...

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> mehrere davon
Eins, zwei oder viele? Der Atmega328 hat drei. CNT0 bis 2
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
Kapitel 14-18. Weiß man, welche davon belegt sind?

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Christoph db1uq K. schrieb:
> Weiß man, welche davon belegt sind?

https://forum.arduino.cc/t/ubersicht-moglichkeiten-timer/193803

Timer gehen auf allen Prozessoren, aber der Mega hat mehr. Timer0 wird 
von millis() belegt. Timer2 ist sehr beliebt weil er sehr flexibel mit 
den einstellbaren Zeiten ist (durch die vielen Prescaler Optionen).

Gute deutsche Erklärung
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR 
15

von Alexander (alecxs)


Lesenswert?

vielleicht meint er aber auch einfach die Zeitabweichung ±10 Sekunden 
pro Woche und sucht ein RTC Modul

von Sebastian W. (wangnick)


Lesenswert?

Christoph db1uq K. schrieb:
>> mehrere davon
>> Eins, zwei oder viele? Der Atmega328 hat drei. CNT0 bis 2
>>
> 
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
>> Kapitel 14-18. Weiß man, welche davon belegt sind?

Christoph, deine Anmerkungen zu den Zitaten werden bei mir hier immer an 
das Zitat angehängt. Da ist es schwierig, zu sehen, was du geschrieben 
hast ...

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Christoph db1uq K. schrieb:
> Eins, zwei oder viele? Der Atmega328 hat drei. CNT0 bis 2
> 
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
> Kapitel 14-18. Weiß man, welche davon belegt sind?

Ja sicher. Beim Arduino UNO/MICRO/NANO ist es Timer 0. Timer 1 und 2 
sind frei.

von Joachim B. (jar)


Lesenswert?

Christoph db1uq K. schrieb:
> Weiß man, welche davon belegt sind?

https://forum.arduino.cc/t/ubersicht-moglichkeiten-timer/193803

 Timer gehen auf allen Prozessoren, aber der Mega hat mehr. Timer0 wird
 von millis() belegt. Timer2 ist sehr beliebt weil er sehr flexibel mit
 den einstellbaren Zeiten ist (durch die vielen Prescaler Optionen).

Gute deutsche Erklärung
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR

bevor die Antwort im Grundrauschen untergeht

von Rainer W. (rawi)


Lesenswert?

Christoph db1uq K. schrieb:
> benutzen im Hintergrund vermutlich auch die Timer, vielleicht sogar
> Interrupts, aber für den Anwender bleibt das verborgen.

... jedenfalls solange der Anwender sich standhaft weigert, in den 
Arduino Core Code zu gucken.

Dort steht z.B. in wiring.c, wie als Zeitbasis Timer0 mit 
Overflow-Interupt genutzt wird und wie millis() auf diese Zeitbasis 
zugreift.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

>Timer0 mit Overflow-Interupt

Ok das ist eine Aussage. Aber dass man dazu tief im Quelltext wühlen 
muss, halte ich für einen Mangel. Klar, das wird alles zur Vereinfachung 
für Einsteiger getan. Aber irgendwann will sich jemand weiterbilden. 
Dann geht die Sucherei los.

Für zeitkritische Anwendungen könnte der Interrupt schon stören, wenn er 
vor dem eigenen Programm privilegiert ist.

Wenn man wirklich die Mikrosekunden optimiert, darf man keine 
Systemroutine benutzen, die unkontrolliert Rechnerzeit kostet.

Aber wir kennen ja die Anforderungen des TO immer noch nicht.

von Stefan F. (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> Aber dass man dazu tief im Quelltext wühlen muss,

Nicht tief. Schau dir mal die HAL von ST an!

Das Arduino Framework verbirgt viele Details mit Absicht. Direkte 
Registerzugriffe sind nicht vorgesehen. Schließlich sollen die Sketche 
im Idealfall auf allen Arduino Boards kaufen können.

Wer das blöd findet, kann ja gerne am Framework vorbei Programmieren. 
Doch wer halb Arduino und halb auf Registerebene kombiniert 
programmieren will, profitiert von den frei zugänglichen Quelltexten. Da 
muss man dann schon selbst wissen was man tut. Arduino hat eine andere 
Zielgruppe.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

>am Framework vorbei programmieren

So mache ich es auch. Für mich ist der Arduino eine Platine mit 
ATmega328, mehr nicht. Das Framework ignoriere ich geflissentlich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Sebastian W. schrieb:
> Christoph, deine Anmerkungen zu den Zitaten werden bei mir hier immer an
> das Zitat angehängt
Das passiert, wenn beim zitieren nach dem '>' kein Leerzeichen kommt. 
Dann wird aus dem hier:

> Zitat
Antwort

Sowas:

>Zitat
Antwort

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> kein Leerzeichen
Ich habe jetzt schon eine Leerzeile eingefügt, und dachte, dass damit 
jeder Browser zurechtkommt. Ich finde es nur nervig, wenn andere einen 
ganzen Text zitieren, und dann mit einer Zeile darauf antworten.
Also werde ich noch ein Leerzeichen einfügen, danke für die Belehrung.

Den Bootloader ignoriere ich auch, früher war es PonyProg, danach 
Benedikts USBProg, bis die Entwicklung einschlief. Heute ist es ein 
USB..easy..blahblah, egal, für 16,95 von Conrad. Alles mit dem 
Atmel-Studio 4.19, das den für ein originales Atmel Eval-Board hält. 
Hauptsache Nachbauer können das ohne Hardwareprobleme nutzen.

von Michael B. (laberkopp)


Lesenswert?

Johannes schrieb:
> es eine andere Möglichkeit, den Arduino zeitlich genauer zu nutzen

Hardwaretimer.

von Helmut -. (dc3yc)


Lesenswert?

Wenn man init() und main() statt setup() und loop() verwendet, kann man 
die ganze Arduino-IDE verwenden und man ist Herr über alle Timer. Sogar 
Serial.begin und pinMode funktionieren, nur das delay() geht halt nicht 
mehr. Dafür kann man mit Timer 0, 1 und 2 herumprogrammieren, wie es 
einem beliebt!

von Rainer W. (rawi)


Lesenswert?

Christoph db1uq K. schrieb:
>> kein Leerzeichen
> Ich habe jetzt schon eine Leerzeile eingefügt, und dachte, dass damit

Wen zitierst du denn da. Fummel doch nicht immer an dem automatisch 
erzeugten Zitattext rum. Markiere den zu zitierenden Text und dann 
drücke auf "Markierten Text zitieren".

von Gerhard O. (gerhard_)


Lesenswert?

Helmut -. schrieb:
> Wenn man init() und main() statt setup() und loop() verwendet,
> kann man
> die ganze Arduino-IDE verwenden und man ist Herr über alle Timer. Sogar
> Serial.begin und pinMode funktionieren, nur das delay() geht halt nicht
> mehr. Dafür kann man mit Timer 0, 1 und 2 herumprogrammieren, wie es
> einem beliebt!

Dieser Sachverhalt ist natürlich gut zu wissen. Andrerseits finde ich 
die Arduino-Framework-Beanspruchung der uC Ressourcen als nicht zu 
störend um nicht nutzbringend die Arduino Framework "Vorarbeit" nicht 
einsetzen zu wollen.

Augenscheinlich wird ja nur der Timer0 und die USART HW vom Arduino 
Framework beansprucht. Timer1 und 2 sind vollkommen frei und können in 
der üblichen Weise "Bare Metal" konfiguriert werden.

Für gewisse Anwendungsfälle kann man einen zusätzlich Interrupt für 
Timer0 sinnvoll hinzufügen, um eigene Zusatzfunktionen mit 
hineinzuzwängen.

Abgesehen davon meckert der Compiler ohnehin gleich, Wenn man dem 
Arduino Framework ins Gehege kommt.

Was meine üblichen Anwendungen betrifft, empfinde ich die Arduino 
Framework Ressourcen-Beanspruchung eigentlich nicht als wirklich 
störend.

Die SERIAL und Timer0 Services sind ja in vielen Fällen ohnehin nützlich 
und fallen nur sehr selten störend auf. Und wenn es wirklich nicht geht, 
dann kann man ohne Framework auskommen.

Was mich betrifft, verläuft die Framework Belastung des uC nur in 
mässigen Bahnen.

Gerhard

von Rainer W. (rawi)


Lesenswert?

Helmut -. schrieb:
> Wenn man init() und main() statt setup() und loop() verwendet, kann man
> die ganze Arduino-IDE verwenden und man ist Herr über alle Timer.

init(), setup() und loop() werden im Arduino Framework durch main() 
aufgerufen
(s. main.cpp).

Was genau meinst du mit "statt"?

von Manfred P. (pruckelfred)


Lesenswert?

Gerhard O. schrieb:
> Augenscheinlich wird ja nur der Timer0 und die USART HW vom Arduino
> Framework beansprucht. Timer1 und 2 sind vollkommen frei und können in
> der üblichen Weise "Bare Metal" konfiguriert werden.

Arduino ist für mich primär ATMega328. Da ist schon auffällig, dass die 
PWM-Ausgänge zwei unterschiedliche Frequenzen haben.

Mal kurz G* gefragt und da gelandet:
https://nerd-corner.com/de/arduino-timer-interrupts-arduino-register-programmieren/#Arduino_Uno_Mikrocontroller_ATMEGA328P

8 Bit-Timer0: wird genutzt für die Funktionen millis(), micros(), 
delay() und für PWM an Pin D5 und D6

16 Bit-Timer1: wird z. B. für die Bibliothek Servo, VirtualWire, 
TimerOne und für PWM an Pin D9 und D10 genutzt

8 Bit Timer2: wird genutzt für Funktion tone() und für PWM an Pin D3 und 
D11

Das heißt, dass jegliche Fingerei an den Timern zu Kollisionen mit 
Arduino-Funktionen führen kann.

Aber sein Problem wird im Gesamtablauf liegen, meinem Datenlogger ist 
der 1-Sekunden-Zyklus zu Beginn auch aus dem Ruder gelaufen.

Sebastian W. schrieb:
>> teils genau 500ms, dann aber auch mal 680ms
> Das liegt an den anderen delay() oder ähnlichen Warteschleifen die in
> deinem Code (oder in von deinem Code benutzten Bibliotheken) noch
> irgendwo drin sind. Solange der Arduino in so einem delay() hängt kommt
> er nicht zu den millis() zurück!

Das muß nicht unbedingt "das böse delay" sein: Ich habe in der 
Hauptschleife meiner Anwendung(en) mehrere Abfragen auf millisec(). Wenn 
da gerade z.B. die Aktualisierung des Displays angestoßen wurde und 
diese 80ms dauert, erwische ich die nächste Abfrage erst entsprechend 
verzögert, das ist nicht kalkulierbar.

Wenn die 500ms zuverlässig sein sollen, darf in loop() keine weitere 
Aktion stattfinden, was ich für wenig realistisch halte.

von Gerhard O. (gerhard_)


Lesenswert?

Moin,

"Das heißt, dass jegliche Fingerei an den Timern zu Kollisionen mit
Arduino-Funktionen führen kann."

Gut, daß Du das hier klar gestellt hast. Was aber meine meisten 
Anwendungen betrifft, programmiere ich alles andere selber und ich lasse 
nur das USART und T0 in Ruhe. Auf alles andere habe ich dann 
unbehinderten Zugang. So meinte ich das in meinen Ausführungen.

T1 und T2 werden ja erst bei Einsatz der besagten Bibliotheken 
beansprucht und liegen sonst brach.

Gerhard

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rainer W. schrieb:
> Was genau meinst du mit "statt"?

Wenn man eine eigene main() baut, bleibt die originale links liegen. 
Wird nicht verwendet.

von Gerhard W. (dd4da) Flattr this


Lesenswert?

Und dies

Arduino F. schrieb:
> Arduino geheim
> Code geheim
> Schaltplan geheim
>
> Johannes schrieb:
>> sondern der Arduino in einer "unsichtbaren" Schleife
>> hängt.
> Rege Fantasie!
> Tipp:
> Es sind immer die anderen Schuld.
> Und Arduino sowieso.

Und diese Antwort hilft wie?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Gerhard W. schrieb:
> Und diese Antwort hilft wie?
Wenn du den Zweck/Sinn der Antwort nicht aus eigener Kraft verstehst, 
glaube ich nicht, dass ich ihn dir erklären könnte.

von Jens B. (dasjens)


Lesenswert?

Arduino F. schrieb:
> Arduino geheim
> Code geheim
> Schaltplan geheim
>
Was bringt der Schaltplan, Code?

von Rainer W. (rawi)


Lesenswert?

Johannes schrieb:
> Gibt es eine andere Möglichkeit, den Arduino zeitlich genauer zu nutzen
> oder ist er für zeitkritische Signale schlicht nicht gemacht?

"Den Arduino" gibt es nicht. Es gibt eine ganz Reihe von Arduino Boards, 
die z.T. deutlich unterschiedliche Mikrocontroller verwenden. "Arduino" 
bezeichnet ein Softwareframework und eine (abgespeckte) IDE, die 
versucht, alle diese Boards unter eine Haube bringen. Das ist teilweise 
mit eingeschränkter Nutzung der HW verbunden.
Wenn du ein genaues Timing erzeugen willst, kannst du bspw. direkt einen 
der nicht genutzten Timer benutzen. Welche bei dir frei sind, hängt von 
deinem Programm und von deinem Controller ab. Lediglich Timer0 ist IMHO 
normalerweise immer durch durch die Zeitfunktionen (millis(), delay () 
usw. belegt.
s. verlinkte GitHub Doku zur Timerinterrupt-Library
https://www.arduino.cc/reference/en/libraries/timerinterrupt/

Bei 500ms ist ein eigener Timer allerdings nicht nötig, falls die Zeit 
nicht auf die Mikrosekunden stimmen muss. Du könntest dich dafür in den 
Timerinterrupt reinhängen und direkt dort deinen Pin kontrollieren. Dann 
bist du weitgehend unabhängig von blockierenden Programmen in deiner 
Hauptschleife - so keines boshafter-/ungeschickterweise den 
Timerinterrupt sperrt - und gibst aber möglicherweise die direkt 
Nutzbarkeit deiner SW auf anderen Arduino-Boards auf.

: Bearbeitet durch User
von Wastl (hartundweichware)


Lesenswert?

Alle die hier scheinbar Scheuklappen auf haben: der TO hat
sich letzten Freitag (Trolltag) gemeldet und seitdem nicht
mehr. Demnach ist alle Liebesmüh um das Thema vergeblich
bzw. für die Katz. Nur wenn hier ein Dialog zwischen TO
und der Community entstehen würde, würde der Thread hier
noch irgendwie Sinn machen, ausser dass hier auf den TO
geschimpft wird und die Forums-Teilnehmer sich profilieren.

von Joachim B. (jar)


Lesenswert?

Wastl schrieb:
> Alle die hier scheinbar Scheuklappen auf haben: der TO hat
> sich letzten Freitag (Trolltag) gemeldet und seitdem nicht
> mehr

und alle zielführenden Antworten wurden auch schon gegeben!

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> zielführenden Antworten
Ja, das war interessant. In Interruptprogrammen musste man schon immer 
auf Konflikte mit dem Hauptprogramm achten, das ist ja nichts neues.

Noch eine kleine Frage:
Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich trotzdem 
den Bootloader benutzen um eine "Binärdatei" zu flashen, oder brauche 
ich unbedingt irgendeinen USB-Programmer?
Es geht um das Problem, wenn ich eine Binärdatei veröffentliche, kann 
man die auch ohne Zusatzhardware flashen, oder kauft sich ein Nachbauer 
besser einen Programmer. Mein letzter hat <20€ gekostet, früher war das 
wesentlich teurer.

von Falk B. (falk)


Lesenswert?

Christoph db1uq K. schrieb:
> Noch eine kleine Frage:
> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich trotzdem
> den Bootloader benutzen um eine "Binärdatei" zu flashen,

Sicher.

> oder brauche
> ich unbedingt irgendeinen USB-Programmer?

Nein.

> Es geht um das Problem, wenn ich eine Binärdatei veröffentliche, kann
> man die auch ohne Zusatzhardware flashen,

Sicher. Man braucht dann halt avr dude & Co.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Danke Falk

https://github.com/avrdudes/avrdude/releases
https://www.nongnu.org/avrdude/

Die Info zum Arduino Bootloader ist recht knapp:
"The Arduino (which is very similar to the STK500 1.x) is supported via 
its own programmer type specification “arduino”. This programmer works 
for the Arduino Uno Rev3."
"Following programmer types are currently implemented:
arduino   - Arduino programmer ..."

Aber hier in der Artikelsammlung steht es besser:
https://www.mikrocontroller.net/articles/AVRDUDE#AVRDUDE_mit_Arduino_Bootloader_benutzen
in der Kommandozeile
"beispielsweise avrdude -c arduino -p m168 -P usb -U flash:w:<filename>"

Das kann man auch einem Nachbauer irgendeiner Hardware zumuten, wenn er 
nichts anderes hat. Einen Funktionsgenerator, Messender oder ein 
Amateurfunkgerät dessen PLL über SPI eingestellt wird könnte man damit 
betreiben.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Christoph db1uq K. schrieb:
> Noch eine kleine Frage:
> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich trotzdem
> den Bootloader benutzen um eine "Binärdatei" zu flashen, oder brauche
> ich unbedingt irgendeinen USB-Programmer?

Vielleicht diskutierst du das in einem separazen Thread. Mit der 
Erzeugung zeitkritischer Signale durch einen Arduino hat das doch nun 
wirklich herzlich wenig zu tun.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Doch, schon. Wenn man eine sehr zeitkritische Software braucht, kann man 
die komplett selbst z.B. im AVR-Studio schreiben und vom Arduino nur 
noch den Bootloader benutzen.
Aber Johannes meldet sich ja nicht mehr, also könnten wir noch tagelang 
weiterrätseln.

von Axel S. (a-za-z0-9)


Lesenswert?

Christoph db1uq K. schrieb:
> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich
> trotzdem den Bootloader benutzen um eine "Binärdatei" zu flashen

Natürlich. Der Bootloader ist einfach nur ein Programm im Flash, das vor 
dem Hauptprogramm abgearbeitet wird. Sobald das Hauptprogramm 
abgearbeitet wird, macht der nichts mehr. Außer Flash zu belegen.

Allerdings ist der Arduino Bootloader weder besonders klein noch bietet 
er besondere Features. Er wird halt nur gerne genommen, weil er 
standardmäßig auf den meisten [1] Arduinos vorinstalliert ist. Du kannst 
genausogut einen anderen Bootloader verwenden.

Allerdings hat das Programmieren per Bootloader ein paar Macken. So 
kannst du z.B. keine Fuses setzen. Und der Bootloader verändert i.d.R. 
einige Hardware-Register, die stehen dann nicht mehr auf den 
Reset-Defaults.


[1] allerdings lassen einige Billiganbieter den Bootloader auch gerne 
mal weg. Das erwischt dann die Arduino-Fraktion kalt. Deswegen ist es 
immer ratsam, einen ISP-Programmer griffbereit zu haben.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

War auch nur so eine Idee für den Hardcore-Hardwaremenschen ohne 
AVR-Programmer. Das Elektronikhobby ist seit langem in das Lager der 
Software- und Hardwareleute gespalten, man meidet meistens das andere, 
kann den Kontakt aber nicht immer verhindern.

> z.B. keine Fuses setzen
Für drei Fuses braucht man sogar einen speziellen 
"Hochspannungs"-Programmer, das geht auch nicht mit einem einfachen 
USB-Programmer:
https://www.mikrocontroller.net/articles/AVR_Fuses#SPIEN,_DWEN_und_RSTDISBL

> einen anderen Bootloader
das klassische Henne-Ei-Problem, wenn noch keiner drin ist brauche ich 
einen externen Programmer um den reinzubekommen.

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

die Mehrzahl von Fuß ist Füße oder gab's da nicht noch ein anderes Wort 
dafür

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Und für Quadratfüße gibts Quadratlatschen.

von Rainer W. (rawi)


Lesenswert?

Christoph db1uq K. schrieb:
> das klassische Henne-Ei-Problem, wenn noch keiner drin ist brauche ich
> einen externen Programmer um den reinzubekommen.

Der Trend geht ganz klar zum Zweitboard.

Arduino hat das Problem dahingehend gelöst, dass sich in den Beispielen 
der Sourcecode findet, um temporär einen in einen ISP-Programmer zu 
verwandeln - Henne-Ei-Problem gelöst.
Nimm einfach einen Arduino als Programmer.

: Bearbeitet durch User
von Turbine K. (Gast)


Lesenswert?

Rainer W. schrieb:

> Der Trend geht ganz klar zum Zweitboard.
>
> Arduino hat das Problem dahingehend gelöst, dass sich in den Beispielen
> der Sourcecode findet, um temporär einen in einen ISP-Programmer zu
> verwandeln - Henne-Ei-Problem gelöst.
> Nimm einfach einen Arduino als Programmer.

Das gilt dann, und nur dann, wenn Du einen AVR-Arduino benutzt. Die 
Boot-Loader der neuen Boards (z.b. Arduino Uno Rev 4(!)) kannst Du so 
einfach nicht mehr programmieren, Du brauchst einen Programmer (Renesas 
Flash Programmer).

Gruesse

Turbine

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rainer W. schrieb:
> Henne-Ei-Problem gelöst.

Einige Arduino AVR Boards haben eine 16U2 als USB-Serial Adapter on 
Board.
Diesen kann man per Flip zum ISP Programmer machen.

Auch so kann man das Henne Ei Problem geschickt umschiffen, selbst wenn 
nur 1 einziges Board zur Verfügung steht.

Axel S. schrieb:
> Allerdings ist der Arduino Bootloader weder besonders klein
Der UNO Bootloader hat 512 Byte. Ist auch problemlos auf dem Nano 
verwendbar.

Christoph db1uq K. schrieb:
> Die Info zum Arduino Bootloader ist recht knapp:
Alle Arduino Bootloader liegen im Quellcode in der Arduino AVR 
Boarddefinition vor incl. Makefile.

von Turbine K. (Gast)


Lesenswert?

Aber noch einmal zum Problem des TOs zurueckzukommen: Er benutzt einen 
Arduino (nehmen wir mal an, AVR mit 16MHz) und moechte 500ms (=0.5s) 
"abwarten". Das ist eine halbe Ewigkeit fuer den ATMEGA328P! Oder habe 
ich mich ein paar Zehnerpotenzen verrechnet?

-> Entweder Troll oder BWLer.

Gruesse

Turbine

von Rainer W. (rawi)


Lesenswert?

Turbine K. schrieb:
> Das ist eine halbe Ewigkeit fuer den ATMEGA328P!

Sein Problem ist, dass er mit seinem unbekannten Programm die halbe 
Ewigkeit nicht einmal auf 25% genau eingehalten bekommt. Ich nehme an, 
dass das nicht an der Genauigkeit des Taktgenerators liegt - aber wer 
weiss ...

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Moin,

Es ist mir bewußt, daß ihr mich für das Folgende verhauen werdet:-)

Diese ganze Fragen um die Zeitpräzision von uC Prozessen mit HW liegen 
m.A. darin begründet, daß man versucht durch besondere 
Programmiertechniken genaue Zeitabläufe zu erzwingen um HW aus falschem 
Ehrgeiz zu ersparen. Das ist ähnlich wie jemanden in eine Zwangsjacke 
stecken zu wollen.

Ich finde aber, dass gerade dies, falsches Denken ist.

Genaue Zeitabläufe sollte man auschließlich mit entkoppelter 
spezifischen HW realisieren. Die uC FW sollte nur für Parametrisierung 
und Überwachung und Bedienung zuständig sein und mit der entsprechenden 
HW nur bei Änderungen der Aufgaben eingreifen. So funktionieren 
bekanntlich auch die Timer/Capture/Compare Ressourcen, wo man 
beträchtlichen Aufwand treibt, um Registerzugriffe zu entkoppeln.

Damit wären dann Steuerung, Bedienung und Communication weitgehend 
entkoppelt. Bei komplexen Anwendungen ohnehin zwingend notwendig um 
Latenzen zu verringern. Das würde auch vermeiden, Jitterprobleme  mit 
unregelmäßigen ISR Abläufen oder zeitweisen ISR Sperrungen im Main-Line 
Prozess zu haben. Das Anwendungsprogramm sollte idealerweise 
hauptsächlich als "großer Ccordinator" dienen, aber sonst die 
"Underlinge" in Ruhe lassen.

Das Einzwängen des Programms in das Timing-Gefüge führt oft typisch 
notwendigerweise zu vielen unbequemen Kompromissen.

Das Einzwängen der FW in Timing Prozessen führt notwendigerweise auch zu 
erheblichen Erweiterungsschwierigkeiten.

Jedenfalls ziehe ich HW intensive Realisierung kritischer HW vor, um 
viele dieser Kompromisse von vornherein auszuschließen. Das Resultat 
eines solchen Vorgehens ist dann ein robustes, gleichmässig 
funktionierendes Gerät.

Gerhard

von Rainer W. (rawi)


Lesenswert?

Gerhard O. schrieb:
> Genaue Zeitabläufe sollte man auschließlich mit entkoppelter
> spezifischen HW realisieren. Die uC FW sollte nur für Parametrisierung
> und Überwachung und Bedienung zuständig sein

Genau dafür sind z.B. die Timer im uC vorhanden - werden durch die 
Software konfiguriert und laufen dann unabhängig.
In Zeiten von Mikroprozessoren hattest du die Komponenten noch einzeln 
auf dem Board, jetzt sind sie auf einem Chip in den uC integriert.

: Bearbeitet durch User
von Sebastian W. (wangnick)


Lesenswert?

Christoph db1uq K. schrieb:
> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich trotzdem
> den Bootloader benutzen um eine "Binärdatei" zu flashen, oder brauche
> ich unbedingt irgendeinen USB-Programmer?

Es geht sogar auch andersherum. Ich habe zum Beispiel einen 
CAN-Bootloader für AVR geschrieben, der per Arduino-IDE generierte 
HEX-Dateien über eine MQTT-CAN-Brücke entgegennimmt und flasht.

LG, Sebastian

Beitrag #7491939 wurde vom Autor gelöscht.
von Sebastian W. (wangnick)


Lesenswert?

Gerhard O. schrieb:
> Genaue Zeitabläufe sollte man auschließlich mit entkoppelter
> spezifischen HW realisieren.

Diese Ausschließlichkeit halte ich aus meiner Erfahrung heraus für 
falsch. Man kann sehr wohl auf einem uC vielfältige Aufgaben abarbeiten, 
und dennoch zeitkritische Anforderungen erfüllen. Natürlich braucht es 
dafür ein gutes Konzept, so zum Beispiel eine Analyse und dann 
Zusicherung maximaler Verarbeitungszeiten von Einzelaktionen. Wenn dann 
die Aktualisierung des Displays 80ms dauert, dann muss diese 
Aktualisierung halt in eine Vielzahl kleinere Updates zerlegt werden, 
zwischen denen dann Aktionen höherer Priorität stattfinden können. Für 
jede Aufgabe separate Hardware vorzusehen führt dagegen u.U. sogar zu 
noch weniger deterministischem Zeitverhalten ...

LG, Sebastian

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Christoph db1uq K. schrieb:
> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich trotzdem
> den Bootloader benutzen um eine "Binärdatei" zu flashen, oder brauche
> ich unbedingt irgendeinen USB-Programmer?

Ja, Nein, Vielleicht - suche es Dir aus.

Zuerst muß eine Datei erzeigt werden, deren Lage im Speicher und deren 
Resetvektor den vorhandenen Bootloader berücksichtigt.

Und dann muß ein Programm her, was den Bootloader füttert. Die 
Arduino-IDE löst einen Reset aus, der µC meldet sich - und nun liefert 
die A*-IDE die Daten. Das musst Du wohl irgendwie nachbauen.

Axel S. schrieb:
> Christoph db1uq K. schrieb:
>> Wenn ich das Arduino Softwarebiotop komplett vermeide, kann ich
>> trotzdem den Bootloader benutzen um eine "Binärdatei" zu flashen
> Natürlich. Der Bootloader ist einfach nur ein Programm im Flash, das vor
> dem Hauptprogramm abgearbeitet wird. Sobald das Hauptprogramm
> abgearbeitet wird, macht der nichts mehr. Außer Flash zu belegen.

Das gilt für jeden Bootloader, nicht nur Arduino.

> Allerdings ist der Arduino Bootloader weder besonders klein noch bietet
> er besondere Features.

Doch: Ein Bootloader bietet das Feature, ein fertiges Gerät ganz einfach 
über eine eh vorhandene Schnittstelle updaten zu können, ohne spezielle 
Hardware zu brauchen.

> Allerdings hat das Programmieren per Bootloader ein paar Macken. So
> kannst du z.B. keine Fuses setzen.

Das ist egal, die werden einmal gesetzt und nicht mehr verändert.

> Und der Bootloader verändert i.d.R.
> einige Hardware-Register, die stehen dann nicht mehr auf den
> Reset-Defaults.

Warum glaube ich das nicht? Das macht die A*-IDE bei der Erzeugung des 
Binärfiles.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Manfred P. schrieb:
> Warum glaube ich das nicht?

Weil du die Opti Bootloader Quellen nicht untersucht hast.
Wenn du hättest.... dann bräuchtest du nicht zu glauben, oder nicht zu 
glauben

von Axel S. (a-za-z0-9)


Lesenswert?

Manfred P. schrieb:
> Axel S. schrieb:

>> Der Bootloader ist einfach nur ein Programm im Flash, das vor
>> dem Hauptprogramm abgearbeitet wird. Sobald das Hauptprogramm
>> abgearbeitet wird, macht der nichts mehr. Außer Flash zu belegen.
>
> Das gilt für jeden Bootloader, nicht nur Arduino.

Deswegen schrieb ich auch "Der Bootloader". Und nicht "der 
Arduino-Bootloader".

>> Allerdings ist der Arduino Bootloader weder besonders klein noch bietet
>> er besondere Features.
>
> Doch: Ein Bootloader bietet das Feature, ein fertiges Gerät ganz einfach
> über eine eh vorhandene Schnittstelle updaten zu können, ohne spezielle
> Hardware zu brauchen.

Nun, dieses Feature hätte man auch kaum weglassen können, ohne den 
Anspruch auf die Bezeichnung "Bootloader" zu verlieren. Aber ich schrieb 
ja auch "besondere Features". Etwa einen Prüfsummencheck. Oder eine 
Verschlüsselung der Firmware.

>> Allerdings hat das Programmieren per Bootloader ein paar Macken. So
>> kannst du z.B. keine Fuses setzen.
>
> Das ist egal, die werden einmal gesetzt und nicht mehr verändert.

Das ist keineswegs egal. Dir vielleicht, dem Rest der Welt nicht. Und 
schon gar nicht, wenn es (wie hier) um die Verwendung von nicht-Arduino 
Code geht.

>> Und der Bootloader verändert i.d.R.
>> einige Hardware-Register, die stehen dann nicht mehr auf den
>> Reset-Defaults.
>
> Warum glaube ich das nicht? Das macht die A*-IDE bei der Erzeugung des
> Binärfiles.

Hast du überhaupt verstanden, was ich gesagt habe? Wenn der 
Arduino-Bootloader den UART initialisiert, dann haben dessen Register 
nicht mehr den Zustand wie nach dem Reset. Zwar könnte der Bootloader 
den Zustand wie nach den Reset wiederherstellen, aber ich weiß nicht ob 
er es tut.

Und weil ich auch diesmal nicht "Arduino-Bootloader" geschrieben habe: 
bei einem anderen Bootloader weiß ich es auch nicht. Deswegen kann mein 
Programm sich auch nicht darauf verlassen (ohne Bootloader aber schon).

Im Idealfall steht das in der Dokumentation des Bootloaders. Im 
schlimmsten Fall muß ich den Bootloader dafür sezieren.

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.