Zitat Zitat von Sisor Beitrag anzeigen
Das hast du falsch verstanden: millis()

Natürlich hat eine allgemeine Bibliothek / Framework seine Grenzen. Aber das heißt nicht, dass es nicht geht [Beispiel], sondern vielmehr, dass man für spezielle Anwendungen wieder LowLevel gehen kann / muss, falls das nicht jemand anderes z.B. in Form einer Bibliothek entwickelt hat.


Das würde ich eher der Qualitätssicherung eines Unternehmens zuschreiben als einer sehr gut getesteten HighLevel-Bibliothek, mit der man viele Fehler gar nicht erst machen kann. Auch hier das [obige Beispiel]. Im ersten Fall sieht das Setup der Analogsignalmessung so aus:
Code:
  pinMode(A0, INPUT);
im zeitoptimierten so:
Code:
 ADCSRA = 0;             // clear ADCSRA register
  ADCSRB = 0;             // clear ADCSRB register
  ADMUX |= (0 & 0x07);    // set A0 analog input pin
  ADMUX |= (1 << REFS0);  // set reference voltage
  ADMUX |= (1 << ADLAR);  // left align ADC value to 8 bits from ADCH register

  // sampling rate is [ADC clock] / [prescaler] / [conversion clock cycles]
  // for Arduino Uno ADC clock is 16 MHz and a conversion takes 13 clock cycles
  //ADCSRA |= (1 << ADPS2) | (1 << ADPS0);    // 32 prescaler for 38.5 KHz
  ADCSRA |= (1 << ADPS2);                     // 16 prescaler for 76.9 KHz
  //ADCSRA |= (1 << ADPS1) | (1 << ADPS0);    // 8 prescaler for 153.8 KHz

  ADCSRA |= (1 << ADATE); // enable auto trigger
  ADCSRA |= (1 << ADIE);  // enable interrupts when measurement complete
  ADCSRA |= (1 << ADEN);  // enable ADC
  ADCSRA |= (1 << ADSC);  // start ADC measurements
Falls ein Fehler vorliegt, wo finde ich ihn schneller?


Zitat Zitat von frabe Beitrag anzeigen
Danke für eure reichhaltigen Einblicke !-)

In der Tat brauche ich keinen Ersatz für delay(), sonder um Timer-Interrupt gesteuertes Zeitmanagement in [ms].
Wenn millis() Interruptbasiert arbeitet, kann ich damit auch eine saubere Statemaschine aufbauen.
Bei Respberry Pi könnte ich mir ein "Anzapfen" der internen Linux-Uhr vorstellen - ist aber ein anderes Thema.

An den beiden Bsp von @Sisor ist der Unterschied zum herkömmlichen C im AVR-uC gut zu erkennen.
Mit dem 2ten Code kann der ADC natürlich viel genauer und sauberer eingestellt werden.
Wichtig ist mM nach nur die Kenntnis um die Grenzen des Arduino-C und um die eigene Anforderung - "brauche ich (im akt.Projekt) diese Präzision überhaupt?" - ich nicht!
noch was anderes hierzu:
bei AVR-Studio gelten diese Registerdinger natürlich nur für AVRs.
Willst du einen ARM Cortex M0, M3, M4 oder ESPs damit programmieren, funktionieren sie natürlich nicht mehr, weil die Register dort ganz andere sind - da musst du dann einzeln wieder ganz neue Registerbefehle lernen, mit anderern Entwicklungsumgebungen.
Auch bei Arduino kannst du die AVR-Registerbefehle genau so verwenden, musst es aber nicht - stattdessen gehen AUCH die highLevel Befehle pinMode, digitalRead, digitalWrite, analogRead, AnalogWrite.
Weieterer Vorteil:
sie sind Interrupt-safe programmiert (dadurch sind sie zwar etwas länger und zeitintensiver, aber runtime-sicherer).
Weiterer Vorteil:
pinMode, digitalRead, digitalWrite, analogRead, AnalogWrite funktionieren auch genau so bei ARM Cortex M0, M3, M4 oder ESP, in der selben Arduino IDE.

Und das wäre für mich der wichtigste Grund, jetzt von AVR-Studio zu Arduino zu wechseln, und sofort mit leistungsfähigen ARM Cortex oder ESP Boards zu arbeiten.