mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Senderoutine mit Interrupts & Busy


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei AVRs tauschen Daten über SPI aus.
Damit das ganze auch mit hohen Datenraten läuft, gibt der Slave ein
Busy aus, da dieser eventuell mit länger dauernden Berechnungen
beschäftigt ist, und somit keine Zeit hat sich mit dem Master zu
unterhalten.

Die Datenausgabe des Master läuft über Interrupts. Ich habe dazu einen
Sendepuffer, den ich fülle und der dann im Hintergrund an den Slave
übertragen wird.
Soweit läuft das ganze problemlos.

Jetzt habe ich aber das Busy Signal. Der Master fragt dieses also ab,
und wartet bis Busy weg ist ehe er Daten sendet. Daher kann es
vorkommen, dass der Master mehrere ms im Interrupt hängen bleibt, wenn
der Slave beschäftigt ist.

Leider habe ich keine Idee, wie man das geschickt lösen könnte.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der ISR (SPI fertig) nur ein Flag für die Mainloop setzen?

Das Senden des nächsten Bytes übernimmt dann die Mainloop bei gesetztem
Flag, vorhandenem nächsten Byte (Ringbufferpointer) und gültigem Busy.
Das Flag löscht die Mainloop nur, wenn sie ein neues Byte gesendet
hat.

So würde diese Routine auch selbsttätig erkennen, wenn neue Bytes zur
Übertragung im Ringbuffer anstehen/eintreffen.

...

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

ich würde das ganze so lösen:

Im Interrupthandler des Slaves wird nur das empfangene Byte in den
Buffer geschrieben und ein Flag gesetzt, dass ein neues Byte empfangen
wurde. In deiner Main Loop fragst du dann das Flag ab und verarbeitest
das empfangene Byte. Bei einem erneuten Senden vom Master unterbricht
der Interrupt einfach das Hauptprogramm. Somit sparst du dir dein Busy
Flag und kannst einfach drauf los senden. Ein Problem bekommst du erst
wenn der Buffer voll ist (würde einen Ringbuffer verwenden, der so groß
ist, dass sichergestellt ist dass der Slave die empfangenen Daten
schnell genug verarbeiten kann). Du kannst dir ja damit helfen, wenn du
die Übertragungsgeschwindigkeit möglichst langsam machst (CLK/128)!
Somit hat der Slave mehr Zeit zum rechnen.

Mfg, Mathias

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jedesmal, wenn der Slave ein Byte abgeholt bzw. eins ins Senderegister
gestellt hat, macht er auf dem Busy einen 0-1-0 Impuls. Der löst dann
beim Master einen externen Interrupt aus und der kann dann das nächste
Byte takten.

D.h. die SPI-Lese/Schreibroutine wird im externen oder SPI Interrupt
ausgeführt, wer eben als letzter kommt.


Peter

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ peter: bei der spi übertragung werden doch die datenreg. des master
und slaves ausgetauscht oder? wenn ich also die mosi des slaves an die
miso des masters hänge muss ich doch nur nach beendigung der
übertragung  überprüfen ob im datenreg. tatsächlich das gesendete bye
ist..

ein problem hab ich halt dann wenn ich 2x hintereinander das selbe byte
sende oder?

mfg, mathias

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mathias
die Idee mit dem Ringpuffer geht nicht, da ich nebenher noch vieles
andere mache, und der Slave nicht gestört werden darf (er muss etwas
Hardware ansteuern und da ist das Timing kritisch).
fclk/128 scheitet aus, ist einfach viel zu langsam.

@Peter
Die externe Interrupt Routinen Idee ist echt gut.
Ich denke ich werde es so machen.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht noch einfacher:

externer Interrupt:
- SPI-Interrupt enablen

SPI-Interrupt:
- SPI-Interrupt disablen
- Byte senden

Ist quasi ne UND-Verknüpfung beider Interrupts


Peter

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder gleich Master und Slave vertauschen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HanneS

???

Einer muß Slave und einer Master sein.

Und der Master muß irgendwie mitbekommen, wann der Slave das Byte
abgeholt bzw. eins reingestellt hat.

Oder der Master macht riesige Wartezeiten nach jedem Byte.

Tja, wenn das SPI eine FIFO hätte, hats aber nicht.


Peter

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:

Ich meinte damit (scherzhaft), dass der höher belastete AVR als Master
geschaltet werden sollte und die Übertragung managt. Damit bestimmt er,
wann das nächste Byte geholt wird. Das geht natürlich nur, wenn keine
weiteren Geräte am SPI-Bus hängen.

Wobei das jetzt nicht zu Ende gedacht ist, denn über die SS-Leitung
kann ja auch ein Multimastersystem erreicht werden. Wenn ich das
richtig verstanden habe, kann jeder Teilnehmer, der "sich zum Master
erklärt", über die SS-Leitung alle anderen Teilnehmer "zu Slaves
degradieren" (sofern es AVRs sind).

Aber die Idee mit dem Ack-Impuls via ext.-Interrupt ist schon nicht
schlecht.

Ja, Fifo für SPI und UART wäre schon eine echte Bereicherung. Aber man
kann leider nicht alles haben.

Bit- & Bytebruch...
...HanneS...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.