mein Projekt hat beinhaltet eine Atmega328P als Master, einen ESP8266 als Slave1 (Webanbindung) und einen ATTiny84 als Slave 2. Der Atmega und der ESP kommunizieren über UART, funktioniert herrlich und auch kein Problem.
Der Atmega und der ATTiny sind über SPI verbunden. Den ATTiny programmiere ich komplett in C, wobei der ATmega noch mit der Arduino Syntax läuft (bequemlichkeit, das Projekt bestand schon vorher und wurde um den ATTiny erweitert.)
Ich habe einen guten Ansatz wie ich die SPI Kommunikation sauber hinbekommen kann - in C.
Ist es möglich, in einen bestehenden Arduino Code, eine C-Syntax einzubauen ( z.B. SPCR |= (1<<MSTR) usw.), oder soll ich doch den Code besser ganz in neu aufsetzen? Bis jetzt bekomme ich nur den Fehler "SPCR was not declared in this scope" "MSTR was not declared in this scope" - sprich, die Befehle werden als undefinierte Variable angesehen..
maker_berni:
Ist es möglich, in einen bestehenden Arduino Code, eine C-Syntax einzubauen ( z.B. SPCR |= (1<<MSTR) usw.), oder soll ich doch den Code besser ganz in neu aufsetzen? Bis jetzt bekomme ich nur den Fehler "SPCR was not declared in this scope" "MSTR was not declared in this scope" - sprich, die Befehle werden als undefinierte Variable angesehen..
Ich bezweifle sehr stark, dass SPCR ein C-Befehl (was immer das sein soll) ist.
// Configure counter/timer0 for fast PWM on PB0 and PB1
TCCR0A = 3 << COM0A0 | 3 << COM0B0 | 3 << WGM00;
Da hat jemand diese Syntax nicht verstanden. Man schiebt immer eine 1 nach links. Hinter den Bit-Bezeichnungen steht die Position des Bits im Register.
z.B.
0000 0001 << 2
0000 0100
Oder man nimmt das _BV() (bit value) Makro. Das macht das im Hintergrund. Dann ist man gar nicht versucht das falsch zu machen
maker_berni:
Jap.. da lag der Hund begraben dankeschön erstmal.
Also wenn das jetzt soweit schon geht, sollte auch die "Mischung" der beiden Syntax funktionieren oder?
geht ohne Probleme. Ob die ArduinoIDE alle .h Files einbindet, die Deine Sachen brauchen, merkst Du ja beim compilieren. Mußt Du dann eben selbst includen.
Aufpassen mußt Du eben nur, daß Du mit den nutzungen der IDE nicht in Konflikt kommst (Timer z.B.).
Außerdem initalisiert die IDE ein paar Sachen selbst, Du findest die Hardwareregister also nicht zwingend im "AVR-Reset" Zustand vor und mußt dann selber für Ordnung sorgen.
maker_berni:
Den ATTiny programmiere ich komplett in C, wobei der ATmega noch mit der Arduino Syntax läuft
Es gibt eigentlich keine 'Arduino-Syntax'. Was Du in deinem Sketch schreibst, wird von einem ganz normalen C++ Compiler (gcc) übersetzt. Die Arduino IDE bietet nur ein Grundgerüst und diverse Bibliotheken, die das Programmiererleben vereinfachen sollen. Die .ino Datei wird gegebenenfalls auch etwas ergänzt, falls die IDE das für nötig hält ( Funktionsdeclarationen ). Wobei das nicht immer 100%tig funktioniert.
Das C-übliche 'main()' gibt es ebenfalls, nur ist es in dem 'Grundgerüst' versteckt. Auch die vordefinierten Namen der Prozessorregister sind vorhanden ( passend zum in der IDE eingestellten Prozessor). Da wird die AVR Toolchain verwendet. Du musst die vorhandenen Bibliotheken/Funktionen auch nicht nutzen. Statt z.B. digitalWrite() kannst Du auch die entsprechenden Portbits direkt setzen. Im Prinzip also auch nichts anderes als in AVR Studio. Die Möglichkeit einen Code für verschiedene Prozessoren zu schreiben vergibst Du dann aber.
Wenn Du in 'reinem' C programmieren willst, musst Du eventuell etwas aufpassen - der Compiler erwartet im Sketch C++ Code. Gegebenenfalls musst Du diese Codesegmente als 'C' kennzeichnen, damit der Compiler weis, dass das kein C++ ist.
wenn du alles zu Fuss programmieren möchtest, warum auch immer, dann nimm als Rahmen das übliche Codeschema. Dann funkt dir kein Arduino Framework rein. Die richtigen Registernamen, weil es oben Probleme damit gab, findest du entweder im Manual vom µC und/oder im Headerfile vom µC. Die Namen von Interrupt Vectoren lese ich darin nach. Letztlich ist alles was im Header steht bindend, nur das aktzeptiert der Compiler. Falls es Druckfehler oder Unklarheiten mit dem Manual gibt.
Interessant, das wusste ich noch nicht, dass man das Arduino-Framework so ausblenden kann. Ich hätte eher eine Fehlermeldung wegen doppelter Definition von 'main' erwartet.
Danke für die Info ( auch wenn sie nicht direkt für mich gedacht war )
wenn du alles zu Fuss programmieren möchtest, warum auch immer
Weil ich finde Arduino ist eine super Basis zum einsteigen, aber zur weiteren Anwendung und wenn man auch mal (beruflich) tiefer damit gehen will, sollte man bei 0, ganz unten anfangen.
Außerdem braucht ein "reiner C-Code" lange nicht soviel Speicher.
Die Wire.h oder SPI.h Libs (Beispiele) sind toll, doch wenns mal wo zwickt, ist es nicht mehr so lustig
MicroBahner:
Es gibt eigentlich keine 'Arduino-Syntax'. Was Du in deinem Sketch schreibst, wird von einem ganz normalen C++ Compiler (gcc) übersetzt. Die Arduino IDE bietet nur ein Grundgerüst und diverse Bibliotheken, die das Programmiererleben vereinfachen sollen. Die .ino Datei wird gegebenenfalls auch etwas ergänzt, falls die IDE das für nötig hält ( Funktionsdeclarationen ). Wobei das nicht immer 100%tig funktioniert.
Das C-übliche 'main()' gibt es ebenfalls, nur ist es in dem 'Grundgerüst' versteckt. Auch die vordefinierten Namen der Prozessorregister sind vorhanden ( passend zum in der IDE eingestellten Prozessor). Da wird die AVR Toolchain verwendet. Du musst die vorhandenen Bibliotheken/Funktionen auch nicht nutzen. Statt z.B. digitalWrite() kannst Du auch die entsprechenden Portbits direkt setzen. Im Prinzip also auch nichts anderes als in AVR Studio. Die Möglichkeit einen Code für verschiedene Prozessoren zu schreiben vergibst Du dann aber.
Wenn Du in 'reinem' C programmieren willst, musst Du eventuell etwas aufpassen - der Compiler erwartet im Sketch C++ Code. Gegebenenfalls musst Du diese Codesegmente als 'C' kennzeichnen, damit der Compiler weis, dass das kein C++ ist.
Bei der Auswahlmöglichkeit mit den verschiedenen µC stimme ich dir zu, aber das sollte man vor dem Projekt abstimmen. Ich bin grundsätzlich überzeugt von Atmel
maker_berni:
zur weiteren Anwendung und wenn man auch mal (beruflich) tiefer damit gehen will, sollte man bei 0, ganz unten anfangen.
Dann bietet dir die Arduino IDE aber eigentlich keinen Vorteil mehr. Der Sinn des Arduino-Systems ist ja gerade, dass man eben nicht von 0 anfangen muss.
Warum nutzt Du dann nicht gleich AVR-Studio? Da hast Du alles selbst im Griff ( musst/darfst dann aber auch alles selbst machen ). In AVR Studio hast Du auch sehr ausgefeilte Debugging-Möglichkeiten ( brauchst aber noch entsprechende HW dazu ).
MicroBahner:
Dann bietet dir die Arduino IDE aber eigentlich keinen Vorteil mehr. Der Sinn des Arduino-Systems ist ja gerade, dass man eben nicht von 0 anfangen muss.
Warum nutzt Du dann nicht gleich AVR-Studio? Da hast Du alles selbst im Griff ( musst/darfst dann aber auch alles selbst machen ). In AVR Studio hast Du auch sehr ausgefeilte Debugging-Möglichkeiten ( brauchst aber noch entsprechende HW dazu ).
Ich nutze seit kurzem Atmel Studio 7 und den Atmel ICE als debugTool
Die Arduino IDE nutze ich hier und da für ältere Projekte die noch in .ino sind oder so schnelle Versuche