www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik über SPI empfangene/gesendete Daten effizient zwischenspeichern


Autor: Samuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich möchte 4 bytes pro 50µsec Zyklus empfangen. Mein Controller 
(ADuC7021) hat keine FIFO sondern nur ein 1 byte Senderegister und 
Empfangsregister, welches ständig im Interrupt nachgeladen bzw. geräumt 
werden muß (siehe folgender Code). Im Moment speichere ich die geräumten 
bzw zum senden vorbereiteten Daten in 2 Feldern. Ich habe ziemliche 
Rechenzeitprobleme mit dem Nachladen und ich habe gesehen, dass 
Speichern in ein feld bzw laden aus einem Feld, recht aufwendig ist, 
weil zuerst der Index geholt werden muß etc..... Wie kann man das 
effizienter und doch elegant machen. Gibt es ausser der verwendung von 
Einzelvariablen eine andere Möglichkeit?

Gruß Samuel

unsigned char rec_data[4];
unsigned char snd_data[4];

ISR()
{
  if(fiqsta&SPI_SLAVE)
  {
    rec_data[num_spi_idx]=SPIRX;
    num_spi_idx++;
    SPITX=snd_data[num_spi_idx;
    //..................
    //.............
   }
   else
   if(....)
   //................
}

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo samuel.

auf einem 16bit-µC mit 40MHz hast du rechenzeitprobleme, eine 640kHz-SPI 
zu bedienen? kann ich ja kaum glauben... was machst du denn sonst noch 
mit dem teil?

mein vorschlag:
ein zeiger auf ein 8-byte-array.
dann müßte der µC nur das empfangsregister lesen, die zeigervariable 
inkrementieren (die ja auch auf ein array zeigen kann) und das 
senderegister schreiben.
also im idealfall zwei assemlberbefehle (ohne ISR-overhead und ohne 
rücksetzen des zeigers).

bei dieser möglichkeit liegt abwechselnd ein empfangenes und ein zu 
sendendes byte im selben array. nicht wirklich sauber, aber schnell.

gruß

michael

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
upsi. es wären natürlich drei assembler-befehle. :-)

gruß

michael

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.