mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mehrere SPI-Sachen


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!

Ich bin gerade dabei, eine Biliothek für einen 
SPI-Beschleunigungs-Sensor zu schreiben. (Sprache C Codevision, 
Mikrocontroller AVR).
Diese soll möglichst variabel eingesetzt werden können und so offen 
programmiert sein, dass sie auch auf anderen µCern gut einsetzbar ist.
Die Programmiertechnik hierfür sollte keine große Hürde darstellen.

Ein kleines Problem: Dieser Sensor soll bei diesem Projekt gleich 2 oder 
3 mal zum Einsatz kommen und ich frage mich gerade, wie ich das 
programmiertechnisch am besten lösen kann.
Alle Ansteuerfunktionen für jeden einzelnen Baustein separat zu kopieren 
halte ich für unsinnig.
Es geht ja eigentlich nur darum, bei einer Ansteuerung, den richtigen 
CS-Pin auf Low zu ziehen.
Oder ginge es, den Port, der das CS-Signal darstellt als Parameter - 
Zeiger zu übergeben?

Danke für eure Hilfe.

Schöne Grüße

Martin

Autor: Henry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nummeriere alle Pins des Controllers von 0 bis X durch. Wenn du also Pin 
B1 ansprechen willst dann ist das die Nummer 9.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>einen SPI-Beschleunigungs-Sensor zu schreiben.

Welcher denn? Gib mal den Typ.


>programmiertechnisch am besten lösen kann.

Ja, du kannst das nur allgemein machen.

Ich würde etw so einen Ansatz verfolgen:

Du hast eine Funktion, die zyklisch aufgerufen wird. Dieser wird ein 
Zeiger auf eine Struktur mitgegeben. In dieser Struktur hast du alles 
din was du brauchst, um einen IC anzusprechen.
  CyclicRun ( scSensor1 );
  CyclicRun ( scSensor2 );
  ...
Somit brauchst du alles nur einmal programmieren, und hast sozusagen 
mehrere Instanzen.

Das muss natürlich initialisiert werden:
  Init ( scSensor1, ..weitere Daten , .. );
Das trägt irgendwas in die Struktur ein. Hier könntest du Zeiger auf die 
Schnittstelle übergeben, oder auf den CS-Port, oder was auch immer..

In der Struktur könnten dann zB die aktuellen Werte drin stehen, die 
durch die CyclicRun immer aktualisiert werden (könnten)
struct T_AccIC 
{
  //-- irgendwelche Init Daten ----
  ...
  //-- Nutzdaten ------------------
  int8_t    i8AccX;
  int8_t    i8AccY;
  int8_t    i8AccZ;
...
};

scSensor1  T_AccIC;
scSensor2  T_AccIC;
...

Autor: Gast_08 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
warum denn so kompliziert mit Zeigern und Strukturen ?
Du übergibst an die Funktion einfach die Sensor-Nr. (0,1,2,3...) und in 
der Funktion setzt Du über eine einfach switch..case-Auswertung den 
entsprechenden Port-Pin auf Low.
Der Rest der Funktion ist für alle Sensoren gleich.
Und das läuft garantiert auf jedem µC mit jedem C-Compiler.

Gruß
Gast_08

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sensor-Nr. (0,1,2,3...) und in
>der Funktion setzt Du über eine einfach switch..case-Auswertung den
>entsprechenden Port-Pin auf Low.

Und wie lang ist das CASE, resp. wieviele Sensoren hältst du somit in 
der Funktion vor?


>switch..case-Auswertung den entsprechenden Port-Pin auf Low.

Was ist, wenn diese Sensoren anders angeschlossen werden? Die 
Bibliotheksfunktion umschreiben? Genau das wollte er nicht...


Den mal drüber nach! Bei Funktionsbausteinen in der SPS wirds so 
gemacht, bei Instanzen von Classen wirds so gemacht?

Warum wohl nicht einfach mit switch-case...?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorzugsweise setzt Du alle /CE auf einen Port und übergibst dann der 
SPI-Routine nur die Bitmaske (0x01, 0x02, 0x04 usw.).
Damit sind bis zu 8 Sensoren adressierbar und es entsteht fast kein 
Overhead.


Peter

Autor: Gast_08 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,
Martin hat doch von 2-3 Sensoren gesprochen, und selbst bei 5-8 Sensoren 
ist das doch kein Problem (mehr als 3-8 solcher Sensoren machen am 
SPI-Bus eh keinen Sinn, dann sollte man auf I2C umsteigen).

Die CS-Port-Pins definierst Du direkt am Programm-Anfang (oder in der 
zugehörigen *.h-Datei) mit beliebigen Namen als globale Variablen und 
wenn die Sensoren anders angeschlossen werden, änderst Du einfach die 
Port-Pin-Adressen in der *.h-Datei. Denn diese Adress-Anpassungen mußt 
Du auch bei Deinem Konzept immer ganz konkret durchführen, sonst 
funktionierts nicht.

Auf der Ebene der 8-Bit Mikros muß man nicht immer versuchen, Konzepte 
von größeren Rechnern, wie SPSsen etc., zu implementieren, es geht oft 
auch einfacher und übersichtlicher.

Gruß
Gast_08

Autor: Gast_08 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
das ist auch eine sehr einfache und übersichtliche Lösung !!
(wenn die CS\ alle an einem einzigen Port hängen)

Gruß
Gast_08

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Danke für eure tollen Vorschläge, ich werde mir eure Argumente durch den 
Kopf gehen lassen und eine entsprechende Umsetzung anstreben.

Ich verwende den SCA3000.

Schöne Grüße

Martin

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.