Hallo,
ich bin gerade beim durcharbeiten des Codes dieser Seite.
Da kommunizieren 2 Arduinos über SPI. Der Master-Code ist für mich verständlich, beim Slave hab ich so meine Schwierigkeiten.
Wäre nett, wenn ihr meine Fragen beantworten könntet, besonders der Code in der ISR finde ich extrem kompliziert geschrieben :
ISR(SPI_STC_vect){
cli();
//while SS Low
while(!(PINB & 0b00000100)){ //1.
SPDR = dataEcho; //2.
//wait SPI transfer complete
while(!(SPSR & (1 << SPIF))); //3.
dataEcho = SPDR; //send back in next round //4.
}
sei();
}
Ich hab die Zeilen mit 1. bis 4. markiert, da mir diese unklar sind. Hier meine Fragen :
Was ist bei 1. der Inhalt von PINB ?
Warum wird in 2. SPDR der Wert von dataEcho, also immer 0, zugewiesen ?
Bei 3. blick ich gar nicht durch, da ich keine Ahnung habe, welche Werte SPSR und SPIF beinhalten.
In 4. wird dataEcho wieder der Wert 0 zugewiesen, obwohl dieser schon immer 0 ist und bleibt
Desweiteren dürfte er doch niemals in die Serial.write von loop reinspringen, da dataToPC mit 0 initialisert wurde und niemals seinen Wert ändert, oder ?
Könntet ihr mir bitte auf die Sprünge helfen ? Das Konzept von SPI ist mir klar, aber den Code hier....
Also, wer in einer ISR die Interrupts abschaltet, hat sowieso irgend eine Trommel überhört.
Er muss ja die Interrupts abschalten, da er ja gerade selber einen Interrupt ausführt. Zum Ende der ISR schaltet er sie ja wieder ein.
Das Datenblatt sagt dir, was möglich ist, aber das was konkret da drin steht, kannst nur du herausfinden.
Ich hab ja schon anhand eines Beispiels versucht, das ganze durchzuarbeiten. Aber keine Ahnung.
Was ich gefunden habe ist, dass SPDR die Daten beinhaltet, die über MISO geshiftet wurden. Nur warum im Code in der ISR das SPDR (mit SPDR = dataEcho) auf 0 gesetzt wird, kein Plan.
Was ich sonst noch finden konnte ist, dass SPCR das Arduino SPI Control Register ist. Aber welche Werte da drin stehen können und was die bedeuten können ???
zu SPIF hab ich nix gefunden.
UnoRookie:
Er muss ja die Interrupts abschalten, da er ja gerade selber einen Interrupt ausführt. Zum Ende der ISR schaltet er sie ja wieder ein.
Das ist Quatsch.
UnoRookie:
Was ich sonst noch finden konnte ist, dass SPCR das Arduino SPI Control Register ist. Aber welche Werte da drin stehen können und was die bedeuten können ???
zu SPIF hab ich nix gefunden.
Würd ich nicht sagen. Wenn er doch gerade eine ISR ausführt und innerhalb dieser nochmal ein Interrupt stattfindet, würde das Ganze eventuell mehr Zeit in Anspruch nehmen und dadurch Registerinhalte neue Werte bekommen.
Eine Suche nach "avr SPIE" liefert z.B.
Vielen Dank, aber was SPIE ist ist mir schon klar. Die Frage war, was SPIF bedeutet
UnoRookie:
Würd ich nicht sagen. Wenn er doch gerade eine ISR ausführt und innerhalb dieser nochmal ein Interrupt stattfindet,
würde das Ganze eventuell mehr Zeit in Anspruch nehmen und dadurch Registerinhalte neue Werte bekommen.
Die Interrupts werden vor Betreten der ISR automatisch abgeschaltet und nachher (via reti) wieder eingeschaltet.
Wer daran rumspielt ohne die Absicht zu haben einen weiteren Interrupt innerhalb der ISR Laufzeit zuzulassen,
hat das Datenblatt nicht gelesen, verstanden oder ein anderes bedauerliches Handicap.