Forum: Mikrocontroller und Digitale Elektronik CAN-Bus mit AT90CAN32 und MCP2551.Hilfe benötigt!


von Erri (Gast)


Lesenswert?

Hallo,
ich

ich hab erstmal 2boards(selbst gemacht) jeweils mit dem AT90CAN32 und 
den tranceiver MCP2551 und die 120 Ohm widerstand Bus-Terminierung plus 
Schneckschnak für die Schaltung, programiert wird durch ISP.
auf dem ersten Board sind 8 Schalter(soll der sender sein), und auf dem 
2.Board sind 8 LED's(Empfänger) an jeweils ein Port von dem µC 
angeschlossen. ich hab zuerst ein kommunikation durch UART durchgeführt 
und ich konnte die daten zwischen die 2 µCs schicken, und es 
funktioniert.

jetzt zum CAN-Bus, ich hab mich grundsätzlich auf die Dokumentation von 
marko Glietsch hier beim codesammlung basiert, ich habe die register 
initialisiert und ich konnte im simulator schauen dass sie auch 
initialisert werden konnten.

meine frage ist:
soll ich für jedes µC ein anders programm schreiben, das heißt für den 
sender ein C Code schreiben wo ich das mode TRANSMIT_DATA aktiviere nach 
der Initialisierung der Register und für den empfänger ein anders C Code 
schreibe mit dem mode RECEIV_DATA... soll ich einfach die gleiche ID und 
ID maske überall gleich setzen???

kann mir jemand helfen mit einem tipp oder informationen wie man der 
can-bus zwischen 2 knoten (2µC) programmieren kann...die theorie über 
can-bus habe ich mehrmals durchgelesen, ich stehe allerdings immer noch 
auf dem schlauch...
es muss kein fertigs brot sein... aber ich freue mich auf jede hilfe.
mfg

von Rudolph R. (rudolph)


Lesenswert?

Ja, sicher, Du brauchst Code zum Senden und Code zum Empfangen.
Am Einfachsten geht das indem Du verschiedenen MOB's zum Senden und 
Empfangen initialisierst.
Das kann dann auch der gleich Code auf beiden Controllern sein, zum 
Testen jedenfalls, die können aber auch gleichzeitig senden, gibt halt 
nur einen Fehler auf dem Bus.

Wobei, das Empfangen habe ich im Interrupt gemacht, das kann dann 
"irgendwann" passieren.
Das Senden mache ich im "Scheduler" um zwei Botschaften zyklisch jeweils 
einmal alle 100ms absetzen zu können.

Doppelt-Blind ist garnicht gut übrigens.
Ein Teil wie das Hitex-CAN-USB Devboard mit dem man vom PC aus 
Botschaften senden und empfangen kann ist schon sehr hilfreich...

von Otto (Gast)


Lesenswert?

Hallo Erri,

> auf dem ersten Board sind 8 Schalter(soll der sender sein),

> auf dem 2.Board sind 8 LED's(Empfänger) ....angeschlossen.

> soll ich für jedes µC ein anders programm schreiben

kann man so machen, muss man aber nicht.....

Du kannst das selbe Programm für beide nehmen:

1. Werte die Schalter aus und sende diese z. B. nur
   über den CAN, wenn eine Änderung stattfindet.

2. werte empfangene Botschaften aus und steuere damit die LED

An dem Board, dass keine Schalter hat, wird auch nichts gesendet
und bei dem Board, dass keine LED hat, nichts angezeigt.

> soll ich einfach die gleiche ID und ID maske überall gleich setzen???

Sendest Du z. B. die Taster in der ID "0x100", so muss diese auf der 
Empfangsseite auch durch den Akzeptanzfilter gelangen.....

Gruss Otto

von Erri (Gast)


Lesenswert?

vielen dank für die schnelle Antwort
ich hab leider gerade die Hardware nicht hier und mit dem simulator kann 
ich leider nicht viel testen...
ich hab noch eine frage, da ich leider kein Devboard mit dem man vom PC 
aus daten sendet, und das wahrscheinlich auch nicht zur verfügung 
gestellt bekomme, wegen kosten und zeit gründen, gibt da irgend eine 
möglichkeit zu kontrollieren ob da überhaupt was tut... ich hab versucht 
daten zu senden und mit dem Ozcylloskop sowohl an den ausgangs pins 
CAN-H und CAN-Low von dem MCP2551 als auch TXCAN von dem µC zu sehen ob 
da was passiert, das ergebnis war leider negativ...
frage: wie kann ich testen ob meine Hardware funktioniert. besonders 
MCP2551?

ich freue mich falls jemand da ein tipp hat, das wird mir unheimlich 
weiter helfen.

viele Grüße

von Otto (Gast)


Lesenswert?

> ich hab versucht daten zu senden und mit dem Oszilloskop
> sowohl an den Ausgangspins CAN-H und CAN-Low von dem
> MCP2551 als auch TXCAN von dem µC zu sehen ob
> da was passiert, das ergebnis war leider negativ...
> frage: wie kann ich testen ob meine Hardware funktioniert. besonders
> MCP2551?

An RxD gegen GND und TxD gegeb GBD sowie zwischen CANL und CANH solltest 
Du mit dem Scope Signale messen können.

Wenn Du überall nichts misst, hast Du den CAN senderseitig noch nicht 
(vollständig) initialisiert oder programmiert.

Wenn Du einen preiswerten Anschluss für CAN an den PC suchst, kauf die 
vom Elektronikladen (www.elmicro.de) den CAN232.

Gruss Otto

von Erri (Gast)


Lesenswert?

Hallo Otto,
dass mein Programm nicht vollständig ist, kann ich leider nicht 
ausschliessen, da ich das zum ersten mal mache, und leider auf den 
Datenblätter von dem AT90can gibt es kein beispiel C-Code zum 
initialisieren von CAN... so habe ich mich einfach auf paar beispiele 
von hier verlassen. und so habe ich die Baudrate festgelegt (bei 8Mhz 
1Mbit/s) die interrupts initialisisert, Mob, ID, IDMaske,... also ich 
hab folgende Funktionen in meinem Code.

void CAN_setBaudrate(u16 baud);      //REgister: CANBT1-3
void CAN_setInterrupt(u8 mode);      //Register: CANGIE

void CAN_getMOb(u8 MOb);             //Reg.: CANPAGE
void CAN_setIDMask(u32 idm);         //Reg:  CANIDM1-4
void CAN_setID(u32 id);             //'' :  CANIDT1-4
u32 CAN_getID(void);
void CAN_setMode(u8 mode);
u8 CAN_getMode(void);
void CAN_setData(u8* data);
CAN_message CAN_getData(void);
void CAN_setMObInterrupt(u8 objekt);
u8 CAN_getMObInterrupt(void);
void CAN_ClrMObInterrupt(u8 objekt);
void CAN_Init(u16 baud, u8 intmode);
void CAN_EnableMOb(u8 objekt, u8 mode, CAN_message msg);
void CAN_DisableMOb(u8 objekt);
void CAN_SendData(u8 Mob, u8*data);
void CAN_SendRemote(u8 MOb);

wenn du willst kann ich dir mein Code zumailen... nur ich werde mich 
schämen es hier zu veröffentlichen, ich bin kein profi und meine 
programmierungskunst ist leider sehr beschränkt.
aber ich bin für jede hilfe dankbar.

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.