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