PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierung in Arduino vs. RepberryPi



frabe
27.08.2019, 15:38
Hallo Zusammen.

Zukünftig möchte ich meine Programmieraktivitäten in C auf AVR uCs (Bsp:ATTiny) umstellen.
Hierbei liebäugel ich aus Hardwaregründen, mit Arduino oder RespberryPi. Beide Systeme sind auf einer kompakten LP voll ausgebaut und recht günstig.

Vorwiegend beschäftige ich mich in kleine Codes von 50-100 Zeilen, mit binären/analogen IO-Ports und zeitbasierten Interrups im [ms]-Bereich.

Wo seht ihr die grundlegenden Vorteile eines Arduino?
Mit welchen Programmier-Hochsprachen kann man hier arbeiten?
Mit der dauernden Register-Schieberei in C tuhe ich mich immer noch schwer. Gibt es Vereinfachungen unter Arduino?

HaWe
27.08.2019, 15:54
Arduino ist zunächst ein IDE- und API-Konzept zur Programmierung.
"Arduino-Boards" haben verschiedenste MCUs, von 8-bit AVR über 32-bit ARM Cortex M0, M3, M4 und ESP8266 bis zum dualcore ESP32 und noch einige andere mehr.
Der Vorteil: Alle MCUs können mit fast identischem Code programmiert und gesteuert werden (außer low-level Hardware-Register Code, aber dafür gibt es universelle high-Level API Funktionen). Außerdem gibt es irrsinnig viele Libs für alle mögliche Hardware und Softwareprojekte.

Original- Arduino-Boards: https://store.arduino.cc/ - die gibt es auch teilw. billiger als China-Klone;
daneben noch weitere von 3rd parties, wie Adafruit, Teensy, ESP

Arduinos werden üblicherweise per IDE in C++ programmiert, daneben gbt es noch z.B. Scratch und Java.

Sisor
27.08.2019, 18:14
Raspberry Pi's haben ein oder mehrkernige Prozessoren mit 32 oder 64 Bit und Gigahertz Taktraten. Also weit weg von 8 Bit AVR. Man kann die Hardware-IO aber mit C/C++, Python und eigentlich allen Sprachen, die über ein C-Interface verfügen, ansprechen.


Die Idee von Arduino war immer dem Interessierten möglichst viele Hürden des Einstiegs in die Microcontrollerwelt zu nehmen.
Man muss keine Datenblätter lesen, nicht wissen, wie und mit welchem Kompiler man ausführbare Programme baut und wie man die auf einem Microcontroller zur Ausführung bringt.

Wenn du mit Microcontrollern arbeiten willst, ist ein gewisses Verständnis vom deren Aufbau / Funktion aber immer gut. Arduino ist quelloffen, sodass man immer 'unter die Haube' schauen kann und so Stück für Stück dazu lernt.

frabe
28.08.2019, 08:40
Man muss keine Datenblätter lesen, nicht wissen, wie und mit welchem Kompiler man ausführbare Programme baut und wie man die auf einem Microcontroller zur Ausführung bringt.

Das Datenblatt ist der heilige Gral der AVR uCs. Ich selber wurschtel bis quäle mich oft dort hinein und durch.
Wie kann ich solche Mühen mit Arduino umgehen?
Vermtlich legt man sich auf ein Arduino-Modell fest. Verlutlich gibt es hierbei reichlich deutsche "Datenblätter".

Noch etwas;
Bei welchem Arduino kann man sehr einfach ein Digitalanzeige oder Monitor zur visuellen Ausgabe, Bsp. von Zeiten, etc. anschließen?
Bei meinem akt. uC muss ich erst eine aufwendige Code-Routine schreiben. Ich denke da eher an Plug&Play...

Sisor
28.08.2019, 10:03
Das Datenblatt ist der heilige Gral der AVR uCs. Ich selber wurschtel bis quäle mich oft dort hinein und durch.
Wie kann ich solche Mühen mit Arduino umgehen?
Vermtlich legt man sich auf ein Arduino-Modell fest. Verlutlich gibt es hierbei reichlich deutsche "Datenblätter".
Beispiel: Ich will Zeit messen: In Arduino gibt's millis(). Keine Timerregister initialisieren und dann lesen (das wird automatisch gemacht).
Beispiel: Interrupt bei Flanke von Low auf High am Pin 2 soll Funktion ISR aufrufen: attachInterrupt(2, ISR, RISING)
Beispiel LCD (https://www.roboternetz.de/community/threads/64163-20x4-Display-mit-I2C-Controller-Setup-und-Hello-World)
Ansonsten haben viele Arduino-Boards USB mit einer seriellen Schnittstelle, über die man Daten aus- bzw. eingeben kann.
Hier gibt's ne gute Übersicht über Arduino. (https://www.arduino.cc/)

frabe
28.08.2019, 16:10
Habe mir einige kleine Codes angeschaut - hier scheint gegenüber AVR uCs eine Vereinfachung mit C möglich zu sein.
Alleine die analogen Eingänge auszulesen ist beim AVR wesentlich aufwendiger/komplizierter.
Auch die I/O-Interrupt-Routine scheint einfacher. Wie sieht es mit Timer-Interrupts aus?

Auch habe ich noch nicht den Unterschied zw. Micro und Nano gefunden.

Mxt
28.08.2019, 16:53
Wie sieht es mit Timer-Interrupts aus?

Die Standard Arduino API umfasst keine Timer Funktion. Es gibt aber Libraries wie Timer1 und Timer3, die einfachen Zugriff auf Timer bieten, selbst auf einigen Controllern anderer Chipfamilien, wo die Timer eigentlich ganz anders heißen.

Einige entferntere Verwandte der Arduino Familie haben relativ guten einfachen Timer Support, z.B. die Teensy Boards
https://www.pjrc.com/teensy/td_timing_IntervalTimer.html




Auch habe ich noch nicht den Unterschied zw. Micro und Nano gefunden.
Was den USB angeht, kann man die Arduinos in zwei Gruppen aufteilen, die wo ein USB-seriell Wandler verbaut ist (als spezielle Chip-Lösung oder als entsprechend programmierter zweiter Controller), sowie die, wo der mit Arduino programmierte Controller die USB-Anbindung selbst macht.

Ein Nano gehört zur ersten Gruppe. Beim Micro macht der Controller den USB-Verkehr selbst, er kann als USB-Verbundgerät arbeiten und neben der seriellen Verbindung Maus, Tastatur usw. simulieren. Manche ARM basieren Arduinos beherschen komplexe USB-Protokolle wie USB-Audio.

White_Fox
28.08.2019, 17:37
Wo seht ihr die grundlegenden Vorteile eines Arduino?

Der Vorteil ist, daß du ohne irgendetwas zu wissen schon allerhand erreichen kannst. Und da bin ich auch schon bei den Nachteilen: Ich hatte bisher zwei Berührungspunkte mit Arduino. Einmal wollten wir u.a. mit dem AD-Wandler eine Sprungantwort aufnehmen. Ein Komilitone zeigte mir begeistert, wie schnell und fix man mit dem Arduino-Zeugs einen Analogwert auslesen kann (war nur ein simpler Funktionsaufruf).
Die Begeisterung war genauso schnell wieder weg als ich ihn fragte, wie man mit dieser Bibliothek denn jetzt eine Samplerate einstellen kann. Oder ob überhaupt sichergestellt ist, daß man nicht zweimal hintereinander denselben Wert im Speicher ausliest.

Und das oben erwähnte millis() ist, wenn ich das richtig verstanden habe, keine Zeitmessung. Sondern man wartet eine Zeitspanne ab. Beides ist nicht dasselbe, auch wenn es manche für dasselbe halten.

Für die Zielgruppe, Leute, deren Ziel eben nicht die Technik ist wie z.B. Künstler, ist es natürlich super. Auch für Prototypen kann man es mal verwenden, wenn man schnell etwas zusammenkleistern muß. Ansonsten: Arduino ist dafür gemacht daß jeder Idiot etwas programmieren kann. Und daraus folgt, daß auch in der Industrie jeder Idiot programmiert, auch solche, die davon definitiv besser die Finger gelassen hätten. Das Ergebnis ist in vielen Alltagsprodukten zu beklag...bewundern.

Mxt
28.08.2019, 17:55
Und das oben erwähnte millis() ist, wenn ich das richtig verstanden habe, keine Zeitmessung. Sondern man wartet eine Zeitspanne ab. Beides ist nicht dasselbe, auch wenn es manche für dasselbe halten.

Kann es sein, dass du millis() mit delay(x) verwechselst ? millis() wird meines Wissens nach per Timer Interrupt hochgezähllt, beim Uno glaube ich von Timer0, beim Teensy von SysTick.

Sisor
28.08.2019, 18:14
...Und das oben erwähnte millis() ist, wenn ich das richtig verstanden habe, keine Zeitmessung. Sondern man wartet eine Zeitspanne ab. Beides ist nicht dasselbe, auch wenn es manche für dasselbe halten.
Das hast du falsch verstanden: millis() (https://www.arduino.cc/reference/en/language/functions/time/millis/)

Die Begeisterung war genauso schnell wieder weg als ich ihn fragte, wie man mit dieser Bibliothek denn jetzt eine Samplerate einstellen kann. Oder ob überhaupt sichergestellt ist, daß man nicht zweimal hintereinander denselben Wert im Speicher ausliest.
Natürlich hat eine allgemeine Bibliothek / Framework seine Grenzen. Aber das heißt nicht, dass es nicht geht [Beispiel (http://yaab-arduino.blogspot.com/2015/02/fast-sampling-from-analog-input.html)], 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.


Ansonsten: Arduino ist dafür gemacht daß jeder Idiot etwas programmieren kann. Und daraus folgt, daß auch in der Industrie jeder Idiot programmiert, auch solche, die davon definitiv besser die Finger gelassen hätten. Das Ergebnis ist in vielen Alltagsprodukten zu beklag...bewundern.
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 (http://yaab-arduino.blogspot.com/2015/02/fast-sampling-from-analog-input.html)]. Im ersten Fall sieht das Setup der Analogsignalmessung so aus:
pinMode(A0, INPUT); im zeitoptimierten so:
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?

frabe
29.08.2019, 08:10
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!

Ceos
29.08.2019, 08:43
Lass es mich so formulieren, einen Atmel für Arduino einzusetzen entspricht ungefähr dem Vergleich mit einem Porsche Einkaufen zu fahren.

Kann man machen, ist aber Verschwendung, viel besser wäre es den Porsche auf einer Rennstrecke bis zum Heckschleudern aus zu reizen.

Und um hier einen Gegenkommentar vorweg zu nehmen:
ja, Arduino kann z.B. Hardware PWM in ziemlich dem gleichen Umfang nutzen wie Bare Metal, aber mit Bare Metal kann ich auch ungewöhnliche Konfigurationen machen, welche nützliche Seiteneffekte haben, die man mit Arduino nicht relasieren kann.

Ein kleines Beispiel aus der Praxis: Mit einem XMega, 2 DMA Kanälen und 1 PWM kann ich z.B. einen Pulsgenerator bauen der mir aufeinanderfolgend 100 Pulse mit individuell unterschiedlicher Periode und Dauer (im 1Mhz Bereich) erzeugen kann, ohne dass die CPU auch nur einmal irgendwas rechnen muss (außer vielleicht die nächste Folge berechnen und im Speicher ablegen) und somit Zeit für wichtigere Dinge hat. Mit Arduino direkt geht das nicht (hier wird man eher Taktbasiert mit vollem CPU Einsatz Bitbanging betreiben, siehe WS2812 Lib, ein Frame Update blockiert die CPU vollständig, mit DMA und geschicktem SPI Einsatz brauche ich nur eine größere Menge RAM im vergleich und die CPU langweilt sich)

Holomino
29.08.2019, 10:19
Falls ein Fehler vorliegt, wo finde ich ihn schneller?

Der Fehler ist doch schon gemacht.
Wo stelle ich beim Arduino die SampleRate ein? Und was bleibt ohne ISR von der Rechenzeit übrig, wenn ich auf allen 8 Kanälen fullspeed nacheinander messen will? Wie werde ich den Jitter los, der zweifellos bei dieser synchronen Pollgeschichte auftritt, wenn ich auch nur ein einziges "if" bei der Datenauswertung verwende?

Ich will das jetzt nicht gänzlich verreißen, aber die ADC-Geschichte nach Arduino Referenz (siehe AnalogRead) ist für mich ein typisches Beispiel. Bei der Verwendung aller 8 Kanäle bekommt man mit der ISR und 16MHz eine Taskscheibe von etwa 1000 Befehlzyklen zum Bearbeiten der Werte und Umsetzen des ADMux.
Mit Arduino bekommt man statt knapp 2kHz noch 1,25kHz SampleRate und damit ist auch gleich die komplette Rechenzeit weg.

Schon das Beispiel aus der Referenz


void loop() {
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
}

kann doch nicht jitterfrei laufen.

Ceos
29.08.2019, 11:00
was man hier machen kann, wenn man auch dem Arduino Forum folgt ist eben Bare Metal einzugreifen, sich an den Sample Ready Interrupt zu hängen und eine Statemachine über den Interrupt laufen zu lassen, welcher immer erst 2 samples aus dem sample register wegwirft ... siehe Atmel Doku ... und dann den 3ten Sample in eine Tabelle oder Ringpuffer speichert und den kanal wechselt)

Aber dann ist man schon raus aus der Arduino Welt, aber das schöne ist, solange man die Platform nicht wechselt, kann man das bequem mischen und mit Arduino übersetzen und einspielen ... (nur auf die Include achten)

Sisor
29.08.2019, 11:16
@Holomino:
Prinzipiell hast du Recht. Die hohe Abstraktionsebene von Arduino 'verbrät' in einigen Fällen Rechenzeit. Dafür ist der Code halt einfach und portabel, da gilt es halt abzuwägen. Ich will nur sagen, dass man mit Arduino einfache Probleme in der Regel einfach lösen kann, und dass diese Art von Problemen die häufigsten sind. Am Ende ist es immer eine Frage der Anwendung und der sich daraus ergebenden Anforderungen.

frabe
29.08.2019, 15:22
@Holomino:
Prinzipiell hast du Recht. Die hohe Abstraktionsebene von Arduino 'verbrät' in einigen Fällen Rechenzeit. Dafür ist der Code halt einfach und portabel, da gilt es halt abzuwägen. Ich will nur sagen, dass man mit Arduino einfache Probleme in der Regel einfach lösen kann, und dass diese Art von Problemen die häufigsten sind. Am Ende ist es immer eine Frage der Anwendung und der sich daraus ergebenden Anforderungen.

Genau darum geht es MIR!
Von Atmel möchte ich nur weg, da die beiden anderen sofort eine Hardware-Infrastuktur zur Verfügung stellt und ich mich gerne im "KleinKlein" verknote...

Ich bin und bleibe Anfänger, da ich durch Prog keine Geld generiere. Also einfach - mini-Jitter spielen keine Rolle - [ms]-Takt reicht mir als Basistimer - einfachere Sprache == schnelle Problemlösung, ist genau mein Ding.
Weder die AVR/Atmel-, Arduino- noch die RPi-Familie steht für Unzuverlässigkeit oer Spielzeug - hier wäre meine Grenze.

Sisor
29.08.2019, 18:25
Dann würde ich dir als Einstieg den Arduino Nano empfehlen. Der ist sehr günstig, klein und einfach mit USB zu programmieren.

Rabenauge
30.08.2019, 10:28
Arduinos können-nur ergänzend erwähnt- keineswegs nur Millisekunden-genau arbeiten.
Es gibt auch micros()- Mikrosekunden.
Die kann man genauso als Basis für einen Timer verwenden...wobei man dann allerdings nachgucken sollte, ob das noch wirklich präzise wird....eben weil Arduino in manchem ein wenig Eigenleben entwickelt.

frabe
30.08.2019, 11:14
Dann würde ich dir als Einstieg den Arduino Nano empfehlen. Der ist sehr günstig, klein und einfach mit USB zu programmieren.

Wie im Beitrag von @Mxt zu lesen, kann der "Micro" noch etwas flexibler mit dem USB-Port umgehen. Da USB-Steuerung im uC integriert.

Mxt
30.08.2019, 12:13
Wie im Beitrag von @Mxt zu lesen, kann der "Micro" noch etwas flexibler mit dem USB-Port umgehen. Da USB-Steuerung im uC integriert.

Das ist richtig, aber wenn du wirklich einen entsprechenden Arduino für ein Projekt mit USB benötigst, dann würde ich eher den Teensy LC oder 3.2 empfehlen. Das Problem beim USB ist, wenn man den vermurkst, dann hat man keine Verbindung mehr zum PC. Beim Micro/Leonardo muss man dann genau im richtigen Moment während der Programmübertragung den Reset Knopf loslassen, damit der Bootloader die Verbindung zum PC herstellt. Das kann schon ziemlich Nerven kosten. Das ist beim Teensy deutlich besser gelöst, der Taster darauf ist nämlich kein Reset Taster, sondern schaltet den Controller in den Programmiermodus, bzw. bei 15 Sekunden drücken das Board zurück in den Auslieferzustand.

Man kann auch mit einigen neueren original Arduino Modellen mit SAMD21 Controller USB machen, die sind aber längst nicht so weit verbreitet.

frabe
30.08.2019, 14:47
dann würde ich eher den Teensy LC oder 3.2 empfehlen. Das Problem beim USB ist, wenn man den vermurkst, dann hat man keine .

Wenn ich das richtig verstanden habe, ist die Teensy-Serie ein Clone der Arduinos.
https://www.pjrc.com/teensy/
Werden die Teensy´s genau so programmiert wie Arduino? Oder gibt es hier andere Bibliotheken und veränderte C-Syntax?
___________________________

Damit ich in der Qual der Wahl nicht versinke, noch folgende Frage;

Welche Literatur (Papierform) würdet ihr mir für Arduino-C empfehlen?
Meine Schwerpunkte sind;
Display-Ansteuerung,
analoge/binäre IO,
Tastenentprellung via Interrupt,
Timer, Zähler,
Eingangs- und Timer-Interrupts,
PWM.

Bücher über C habe ich genug - Arduino sieht hier etwas anders (einfacher/schlanker) aus - vermutlich Bibliotheken im Hintergrund.

- - - Aktualisiert - - -

Ich sehe gerade, dass es für Teensy unterschiedliche Hersteller gibt; PJRC, Adafruit, Joy-It.
Die 3 werden zB. bei Conrad und Distrelec angeboten. Sind euch zw. diesen Herstellern Qualitätsunterschiede bekannt?
Sollte man(n) von bestimmeten Herstellern die Finger lassen?
PS:
Bei Qualität kommt´s mir nicht auf ein paar Euro an.

oberallgeier
30.08.2019, 15:32
.. Das Problem beim USB ist, wenn man den vermurkst, dann hat man keine Verbindung mehr zum PC ..Das klingt jetzt drastisch nach Henne-Ei-Geschichten: ich clone mir (wann immer es geht) einen mit Firmware ausgelieferten Controller "bare metal", zumindest Download der Firmware vom Chip. Ist aber keine wirkliche Lösung, weil es eben aufs Programmierverfahen OHNE Bootloader zurückgreift. Lohnte sich für mich fast immer. Ich habe so schon Bootloader vom asuro, arduino-clone, STM32F4DISCOVERY, usw.

PS/OT: uuups, der achte Tausender ist voll :.-.)

Mxt
30.08.2019, 15:40
Also erstmal ein paar Punkte zur Software:

Auch wenn im Hintergrund verschiedene Compiler werkeln (normalerweise entweder avr-gcc oder gcc-arm-none-eabi) ist die Programmiersprache in Arduino normalerweise C++, derzeit meist in Form von C++14, bei einigen ältern Boards C++11. Einige speicherfressende Teile der Standardbibliothek und an ein Betriebssystem gebundene Teile von C++ wie Threading oder Filesystem fehlen.

Dazu kommen dann die normalen Prozessor Bibliotheken für den Low Level Registerzugriff usw.

Dazu kommt dann die Standard Arduino Funktionalität, wie in der Doku beschrieben
https://www.arduino.cc/reference/en/

Projekte wie der Teensy, erweitern die Arduino Bibliotheken um zusätzliche Funktionen. Die normalen Arduino Entwickler sind da eher konservativ.

Literatur: Z.B. Arduino Kochbuch bzw. Cookbook ist ganz nützlich. Natürlich auch die Datenblätter. Beim Teensy auch das Forum. Webseiten wie die von Adafruit.


Hardware kann man in drei Kategorien einteilen:

- Originale Arduinos. Etwas teuer, aber es fliesst auch Geld an die Entwickler der IDE, die Webseite usw.

- Firmen mit eigenenen selbst entwickelten Arduino kompatiblen Produkten und Zubehör, Webseiten mit Informationen usw. z.B. Adafruit, Sparkfun, Seeed, PJRC, Watterott

- Klone, meist aus China, billig von da, oder mit Logo von Importeuren, MakerFactory, JoyIt usw. Das sind dann meist nur Nachbauten von existierenen Boards. Solange man einen Arduino nicht als solchen (originalen) verkauft, ist der Nachbau ja ausdrücklich erlaubt.


Teensys sind von PJRC das andere sind Reseller, siehe
https://forum.pjrc.com/threads/23601-Official-Distributors
(da gibt es in D auch günstigere als Conrad ...)

Klebwax
30.08.2019, 15:55
DANKE!Das Prinzip und die Schreibweise des C99 scheint gleich zu sein.


Werden die Teensy´s genau so programmiert wie Arduino? Oder gibt es hier andere Bibliotheken und veränderte C-Syntax?


Welche Literatur (Papierform) würdet ihr mir für Arduino-C empfehlen?


Bücher über C habe ich genug - Arduino sieht hier etwas anders (einfacher/schlanker) aus - vermutlich Bibliotheken im Hintergrund.

Das zieht sich durch diesen ganzen Thread. C ist C. Und das unabhängig vom Prozessor, auf dem es läuft: AVR oder Mainframe. Die Sprache hat sich von der ursprünglichen Form (C ohne Zahl oder auch K&R genannt) über C99 usw weiterentwickelt. Die Syntax hat sich eigentlich nicht verändert. Es gibt Dokumente, die den Standard beschreiben. Eine Sprache, die sich nicht an den C99 Standard hält, darf sich nicht so nennen.

Arduino ist eine C++ Umgebung. C++ ist mitnichten einfacher oder schlanker als C. Auch dazu gibt es einen Standard.

Hardware kommt im C-Standard ncht vor, auch Interrupte nicht. Also: Display-Ansteuerung, analoge/binäre IO, Tastenentprellung via Interrupt, Timer, Zähler, Eingangs- und Timer-Interrupts, PWM haben mit C primär nichts zu tun. C kennt nichts, außer einigen reservierten Worten wie if, else, while, for ... , Variable verschiedener Typen und Funktionen.

Wenn man die Hardware seines Systems kennt, von Neuman/Harvard, Memory mapped I/O oder verschiedene Busse oder Adressräume, Interruptvektoren etc, kann man in C und/oder Assembler von C aufrufbare Funktionen schreiben, die sich um die Hardware kümmern. Manches muß auch der Linker erledigen, wie SFRs auf feste Adressen mappen. Wie die Hardware selbst funktioniert, steht in ihrer Doku, dem Datenblatt oder Users Manual. Das gilt natürlich auch für C++. Man kann auch Methoden schreiben und sie von C++ benutzen. Wenn man Glück hat, hat schon einer das Passende geschrieben. Im Arduino Bereich ist das oft der Fall, wobei man immer berücksichtigen muß, daß nicht jeder Code wirklich gut und brauchbar ist.

MfG Klebwax

P.S. avr-gcc oder gcc-arm-none-eabi ist der gleiche Compiler, der gcc. Er erzeugt nur Code für verschiedene Hardware. Unter dem Namen gcc erzeugt er auf einem Linux-PC auch Code für diesen. Der Langname ist nur nötig, wenn Crosscopiliert werden muß.

Mxt
30.08.2019, 16:00
Hier kann man sich C und C++ in der Übersicht ansehen
https://en.cppreference.com/w/
das ist quasi der "unabhängige Teil", der auf Arduino, Raspberry Pi und eigentlich überall sonst, verfügbar ist

(*) Wie gesagt, minus Dinge wie std::thread, Filesystem, auf den 8-Bittern auch std::vector usw.


Ach ja, wo wir bei Büchern sind
http://www.cppbuch.de/

Sisor
30.08.2019, 17:43
ps/ot: Uuups, der achte tausender ist voll :.-.)

:cool: :cool: :cool: :cool: :cool: :cool: :cool: :cool:

HaWe
30.08.2019, 19:07
Das hast du falsch verstanden: millis() (https://www.arduino.cc/reference/en/language/functions/time/millis/)

Natürlich hat eine allgemeine Bibliothek / Framework seine Grenzen. Aber das heißt nicht, dass es nicht geht [Beispiel (http://yaab-arduino.blogspot.com/2015/02/fast-sampling-from-analog-input.html)], 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 (http://yaab-arduino.blogspot.com/2015/02/fast-sampling-from-analog-input.html)]. Im ersten Fall sieht das Setup der Analogsignalmessung so aus:
pinMode(A0, INPUT); im zeitoptimierten so:
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?




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.