SPI in C-Syntax (ohne lib) "gemischt" mit Arduino-Syntax in Arduino IDE

Hi Leute,

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..

Danke und LG

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.

Gruß Tommy

Tommy56:
Ich bezweifle sehr stark, dass SPCR ein C-Befehl (was immer das sein soll) ist.

Gruß Tommy

SPCR ist das SPI Control Register im Atmega. Darin muss ich diverse Bits setzen. "SPCR" als Befehl zu bezeichnen war mein Fehler. Sorry.

Prinzipiell sollte das gehen, beispielsweise für einen ATtiny85:

  // Configure counter/timer0 for fast PWM on PB0 and PB1
  TCCR0A = 3 << COM0A0 | 3 << COM0B0 | 3 << WGM00;
  TCCR0B = 0 << WGM02 | 3 << CS00; // Optional; already set
  // Configure counter/timer1 for fast PWM on PB4
  GTCCR = 1 << PWM1B | 3 << COM1B0;
  TCCR1 = 3 << COM1A0 | 7 << CS10;

agmue:
Prinzipiell sollte das gehen, beispielsweise für einen ATtiny85:

  // Configure counter/timer0 for fast PWM on PB0 and PB1

TCCR0A = 3 << COM0A0 | 3 << COM0B0 | 3 << WGM00;
  TCCR0B = 0 << WGM02 | 3 << CS00; // Optional; already set
  // Configure counter/timer1 for fast PWM on PB4
  GTCCR = 1 << PWM1B | 3 << COM1B0;
  TCCR1 = 3 << COM1A0 | 7 << CS10;

Interessant.. ich habe jetzt mal den Code einfach stur "Copy-Paste" in die IDE geschrieben..

Ergebnis: "TCCR0A does not Name a Type"

Hast Du auch den Attiny85 als Prozessor gewählt?

Gruß Tommy

Tommy56:
Hast Du auch den Attiny85 als Prozessor gewählt?

Gruß Tommy

Jap.. da lag der Hund begraben :cold_sweat: dankeschön erstmal.

Also wenn das jetzt soweit schon geht, sollte auch die "Mischung" der beiden Syntax funktionieren oder?

agmue:

  // 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

Ich habe gerade mal in das Datenblatt des ATtiny84 geschaut und dies probiert:

USICR |= 6 << 1;

Der Compiler ist zufrieden.

Nur weil der Compiler das schluckt heißt nicht dass es sinnvoll ist

Hallo,

maker_berni:
Jap.. da lag der Hund begraben :cold_sweat: 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.

Gruß aus Berlin
Michael

Dankeschön! :slight_smile:
Ich werde jetzt aber doch den kompletten Code in C schreiben. Trotzdem Danke :slight_smile:

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.

Hallo,

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.

C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr\

   int main(void)        // entspricht setup
{  
    
    
    while (1)             // entspricht loop
    {   
       
    }
}

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 :wink: )

Doc_Arduino:
Hallo,

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 :slight_smile:

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 :slight_smile:

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 :slight_smile:

Die Arduino IDE nutze ich hier und da für ältere Projekte die noch in .ino sind oder so schnelle Versuche