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
Nummeriere alle Pins des Controllers von 0 bis X durch. Wenn du also Pin B1 ansprechen willst dann ist das die Nummer 9.
>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 | ...
|
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
>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...?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.