Forum: Mikrocontroller und Digitale Elektronik Mehrere SPI-Sachen


von Martin (Gast)


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

von Henry (Gast)


Lesenswert?

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

von Matthias L. (Gast)


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.
1
  CyclicRun ( scSensor1 );
2
  CyclicRun ( scSensor2 );
3
  ...
Somit brauchst du alles nur einmal programmieren, und hast sozusagen 
mehrere Instanzen.

Das muss natürlich initialisiert werden:
1
  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)
1
struct T_AccIC 
2
{
3
  //-- irgendwelche Init Daten ----
4
  ...
5
  //-- Nutzdaten ------------------
6
  int8_t    i8AccX;
7
  int8_t    i8AccY;
8
  int8_t    i8AccZ;
9
...
10
};
11
12
scSensor1  T_AccIC;
13
scSensor2  T_AccIC;
14
...

von Gast_08 (Gast)


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

von Matthias L. (Gast)


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

von Peter D. (peda)


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

von Gast_08 (Gast)


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

von Gast_08 (Gast)


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

von Martin (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.