Forum: Mikrocontroller und Digitale Elektronik zwei MCP2515 über eine Bibl. ansprechen


von qwertz (Gast)


Lesenswert?

Hallo,

ich habe eine Schaltung mit einem ATmega88 und zwei CAN Schnittstellen.
Zwei CAN Schnittstellen bedeuten 2 MCP2515, welche über SPI angesprochen 
werden.
Jeder dieser Controller hat ein extra CS und ein extra INT.
Nutzen möchte ich die gängige CAN-Bibliothek:
http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek#downloads

Der ganze Code baut auf die config.h auf, in welcher u.a. definiert 
wird, welche Pins am µC CS und INT darstellen.

#define  MCP2515_CS  D,3
#define  MCP2515_INT  D,4

nun habe ich ja aber alles doppelt...

Kann ich irgendwie während der Laufzeit des Programmes diese Belegung 
ändern,
sodass ich beide MCP2515 nach Wunsch ansteuern kann?

Oder muss ich die gesamte Bibliothek anpassen?

Grüße

von Falk B. (falk)


Lesenswert?

@qwertz (Gast)

>Kann ich irgendwie während der Laufzeit des Programmes diese Belegung
>ändern,
>sodass ich beide MCP2515 nach Wunsch ansteuern kann?

Nein.

>Oder muss ich die gesamte Bibliothek anpassen?

Teilweise.

von qwertz (Gast)


Lesenswert?

Falk Brunner schrieb:
> Teilweise.

hm... ich hab es geahnt.

Dazu hab ich mir folgendes gedacht:

#define  MCP2515_CS  D,3
#define  MCP2515_INT  D,4

#define  MCP2515_CS_1  D,5
#define  MCP2515_INT_1  D,6

Immer wenn die Bibl. MCP2515_CS oder MCP2515_INT verwendet bau ich eine 
kleine Entweder-Oder Bedingung drumherum und ergänze die beiden neuen 
defines.
Um zu wählen muss ich dann vorher natürlich immer angeben welchen MCP 
ich meine.

Wäre das eine möglichkeit?

Oder wie sollte ich das machen?

von Falk B. (falk)


Lesenswert?

@qwertz (Gast)

>#define  MCP2515_CS  D,3
>#define  MCP2515_INT  D,4

>#define  MCP2515_CS_1  D,5
>#define  MCP2515_INT_1  D,6

>Immer wenn die Bibl. MCP2515_CS oder MCP2515_INT verwendet bau ich eine
>kleine Entweder-Oder Bedingung drumherum und ergänze die beiden neuen
>defines.

Könnte man machen, dazu muss man den Quellcode sehen.

Ok, gerade mal geschaut. Das Problem ist deutlich größer, denn es werden 
ja diverse Datenstruktiren für die Verwaltung angelegt, das muss man 
alles aufbohren, damit man mehrere parallel verwalten kann. Klingt nach 
ner Menge Arbeit. Und WENN man die schon mal investiert, sollte man es 
nicht hart codiert für N=2 machen, sondern variabel für N=1-X. Ist fast 
der gleiche Aufwand, am Ende aber deutlich flexibler.

von guest (Gast)


Lesenswert?

Nein, defines werde nicht zur Laufzeit ausgewertet. Da musst du schon 
den Code anpassen und z.B. die entsprechenden Register, die gerade 
verwendet werdene sollen, als Parameter angeben.

von qwertz (Gast)


Lesenswert?

> Ok, gerade mal geschaut. Das Problem ist deutlich größer, denn es werden
> ja diverse Datenstruktiren für die Verwaltung angelegt, das muss man
> alles aufbohren, damit man mehrere parallel verwalten kann. Klingt nach
> ner Menge Arbeit. Und WENN man die schon mal investiert, sollte man es
> nicht hart codiert für N=2 machen, sondern variabel für N=1-X. Ist fast
> der gleiche Aufwand, am Ende aber deutlich flexibler.

..hm das klingt ja schwirig.
Gibt es andere Möglichkeiten?
Vielleicht eine Bibl. die das schon kann? :-)

von qwertz (Gast)


Lesenswert?

Wo genau werden denn Datenstrukturen erzeugt?

von Falk B. (falk)


Lesenswert?

Z.B in can_buffer.c, Ich hab es nur mal überflogen.

von qwertz (Gast)


Lesenswert?

aber da wird doch gar nichts mit dem CS und dem INT angestellt!?

von Karl H. (kbuchegg)


Lesenswert?

Ist ziemlich egal.
Die ganze Verwaltung ist nicht darauf ausgelegt, dass da mehrere 
CAN-Ströme verwaltet werden können.

Die paar Pin-Sachen sind dein geringstes Problem.

von Karl H. (kbuchegg)


Lesenswert?

Du könntest trotzdem Glück haben. Bei vielen Dingen ist der Aufrufer 
dafür zuständig die Datenstruktur bereit zu halten. Zb die Filter.

Allerdings hab ich bis jetzt im Code einige Funktionen noch nicht 
gefunden, wie zb can_static_filter um mal zu sehen, wie das 
funktioniert.

Muss ich mir doch ein Testprojekt aufsetzen, damit mir die IDE hilft, 
die Relevanten Sachen zusammenzusuchen?

von nepf (Gast)


Lesenswert?

> Allerdings hab ich bis jetzt im Code einige Funktionen noch nicht
> gefunden, wie zb can_static_filter um mal zu sehen, wie das
> funktioniert.

Die Funktion ist doch unter mcp2515_static_filter.c

> Muss ich mir doch ein Testprojekt aufsetzen, damit mir die IDE hilft,
> die Relevanten Sachen zusammenzusuchen?

Ich wäre wirklich überaus dankbar wenn du mir dadurch Tipps geben 
könntest, wie ich das ganze am besten anstellen sollte.

von Peter D. (peda)


Lesenswert?

Das einfachste ist, Du duplizierst den Code komplett.
Und einmal werden sämtliche Variablen- und Funktionsnamen mit "_0" 
erweitert und das andere mal mit "_1".
Dann kommt sich nichts ins Gehege und es gibt keine Konflikte.

von nepf (Gast)


Lesenswert?

den Gedanken hatte ich auch schon.
Wobei ich dann lediglich einmal alles mit _1 erweitern wollte ;-)

Es erscheint mir trotzdem sehr aufwändig.
Es gibt ja hunderte #defines etc., was dann alles abgeändert werden 
muss.

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.