Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 wieder einmal.


von nene (Gast)


Lesenswert?

Hallo alle,

ich weiss, dass es hiewr schon etliche male diskutiert wurden ist, aber 
ich habe zugegebenermaßen leider noch keine passende antwort bekommen. 
Ich suche eine Möglichkeit, an den AT90CAN128 die CAN-Datenleitung 
anzuschließen. ICh weiss jetzt nicht, ob ich einen CAN-Transreciever 
oder sowas brauche. BEi Reichelt habe ich u.A. sowas: SN 65HVD251D 
(Best-Nr.) gefunden. KAnn ich das benutzen oder brauche ich etwas 
anderes?

von Flo (Gast)


Lesenswert?

Du brauchst auf jeden Fall einen Transceiver.
Dein 65HVD251D müsste gehen.
Ich nehme immer den PCA 82C251 T.
Vref unconnected und RSlope mit Widerstand gegen Masse. Welcher 
Widerstand kommt auf die CAN Geschwindigkeit an.
RX und TX an den Atmel.

von nene (Gast)


Lesenswert?

na das nenne ich mal eine superschnelle und qualifizierte Antwort! 
Danke!

Hast Du auch ein fundamentales Beispiel mit Schaltung und GCC-Code? Bei 
diesen ganzen Beispielprojektem im Netz finde ich mich als Anfänger 
nicht zurecht.... Trotzdem Danke!

von tex (Gast)


Lesenswert?

@nene
Auch wenn das jetzt ganz böse klingt, aber das Schaltungsbeispiel 
findest Du im Datenblatt des 65HVD251D beachten (Spanungsbereich 
beachten!) und die Software empfehle ich dringend selber zu schreiben. 
Der Grund warum die Beispiele im Internet so komplex und unverständlich 
sind ist, dass, das der Can-Bus etwas komplizierter ist, als die 
USART-Schnittstelle mit zahllosen Einstellungen für Timing, 
Timing-Tolleranz usw.
By the Way
Ich habe kein Beispiel im Internet gefunden, dass funktioniert hätte. 
Wenn der Compiler nicht schon mit zig Fehlermeldungen abbrach lief 
spätestens nach dem Ausspielen nix mehr. Und viele Sachen die da mit 
eingebunden und benutzt werden braucht man nicht unbedingt.

von Juergen H. (harms)


Lesenswert?

Im wesentlich einverstanden mit der Antwort - muehsam. Lies doch den 
ausgezeichneten Artikel von Fabian Greif: 
http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515
Auch wenn er fuer andere Hardware geschrieben ist, er ist eine 
ausgezeichnete Einfuehrung. Ich halte die Dokumentation des AT90CANxxx 
im Bereich CAN fuer aeusserst duerftig, die des mcp2515 ist viel besser. 
Viele Eigenschaften des AT90CAN habe ich erst aus Extrapolieren vom 
mcp2515 verstanden, ganz abgesehen von den Erklaerungen im Dokument von 
Fabian Greif.

Noch ein paar Bemerkungen: ich bin vom mcp2515 auf den AT90CAN 
umgestiegen weil der SPI Zirkus zum internen Verschieben der Daten 
unnoetige Komplexitaet und Aufwand schafft, nicht unproblematisch in 
einer interruptgesteuerten Echtzeitanwendung. Auch hat der AT90CAN in 
seinen Spezifikationen viele Vorteile (z.B. Vielfalt der MoBs), auch die 
Architektur ist sauberer (trotz der Verschleierung durch unsaubere 
Dokumentation) - bleib bei der Wahl des AT90CAN!

Ich habe mir auch die Bibiliotheksvariante der erwaehnten Software und 
ihre AT90CAN  Variante angeschaut, gleiche Meinung wie schon 
ausgesprochen: interessant als Anregung, aber zweifelhaft als Schablone 
zum einfach Kopieren - der erwaehnte Artikel ist eine glueckliche 
Ausnahme.

Ehe Du anfaengst zu programmieren: die Beispiele sind verhaeltnismaessig 
leicht uebertragbar wenn Du ohne Interrupts arbeitest, mit Interrupts 
brauchst Du erst ein Konzept ueber die Echtzeitumgebung (falls 
benoetigt, meiner Meinung nach einfachstes: Idle Loop + Signalisierung 
von den Interrupt Handlern + Callback Handler von der Idle Loop zu den 
Anwendungen).

Mir hat bei der Entwicklung der AT90CAN Software geholfen, dass ich 
schon  laufende MCP2515 Module hatte, und die Funktion der neu 
entwickelten AT90CAN Bausteine im Dialog mit den funktionierenden Moduln 
pruefen konnte - ein aehnliches Vorgehen koennte auch woanders helfen 
(und den MCP2515 nach Vorlage zum Laufen bringen ist eine gute Uebung 
zum Anfangen).

von nene (Gast)


Lesenswert?

@Juergen Harms: Gibt es auch keine nützliche, leicht übertragbare 
Bibliotheken, mit dem ich einfach ein PDO(ID, LEN, Data[0]...Data[7]) 
uebertragen kann? Mehr will ich eigentlich gar nicht machen. Achso, und 
die Baudrate muss ich auf 500 stellen. ID-zuweisung ich denke ich auch 
ganz sinnvoll.

von Juergen H. (harms)


Lesenswert?

Ich habe keine gefunden. Der Grund ist wohl, dass jeder der in solch ein 
Abenteuer einsteigt den AT90CAN fuer ein wohl eher komplexes und fuer 
ihn spezifisches Projekt braucht, das Ganze (oh deutsche 
Rechtschreibung!) fuer "Einsteiger" zu vereinfachen und banalisieren ist 
dann ein erheblicher Mehraufwand.

Florian Greif hat das im wesentlichen mit seinen Kollegen (Aachener 
Chaos Klub - Roboterklub?, oder irgend sowas, ich habe mir die Referenz 
nicht aufgehoben) getan, aber das Resultat ist in meinen Augen zu 
komplex. Aehnlicher Schluss bei den Bibliotheksprozeduren bei 
http://www.chip45.com/, fuer mich auch nicht das Gelbe vom Ei.

Ich haette Lust meine Bibliothek einmal aus ihrer Anwendung 
herauszuloesen und in ein paar einfache Demo Beispiele einzugliedern. 
Mit dem dazu gehoerigen Begleittext schaetze ich das auf eine Woche 
Arbeit - vielleicht im Winter.

von nene (Gast)


Lesenswert?

Ja, das wäre sehr schön. Mir geht es in erster Linie nur um das Senden 
und Empfangen von PDO's ohne viel schnickschnack drumherum.. ;-)

von tex (Gast)


Lesenswert?

Es ist ja nicht so, dass wir Dir die Sachen vorenthalten wollen,
aber das Problem ist eben, dass Du es damit nicht zum laufen bringst, 
obschon es eben bei uns super läuft.
1
#define init_mob_rx_0 init_mob_rx(0,8192,536862720);
2
3
void Can_bit_timing (void)
4
{
5
CANBT1= 0x08;
6
CANBT2= 0x6C;
7
CANBT3= 0x37;
8
}
9
10
void can_init (void)
11
{
12
  Can_bit_timing();
13
  Can_clear_all_MOB();
14
  setbit(CANGCON,1);               
15
  init_mob_rx_0;
16
}
17
18
void can_send_time_date (void)
19
{
20
char sendcode[8]="00000000";
21
sprintf(sendcode,"%02d%02d%02d",stunde,minute,sekunde);        can_send_mg (sendcode,Controller_ID +  8192,14,0);
22
}
23
24
25
void can_send_mg (char *sendstring, long msid, int m_box,int remote)
26
{
27
CANPAGE = (m_box << 4); 
28
CANIDT4 = (uint8_t)((msid<<3) & 0xFF);
29
CANIDT3 = (uint8_t)((msid>>5) & 0xFF);
30
CANIDT2 = (uint8_t)((msid>>13) & 0xFF);
31
CANIDT1 = (uint8_t)((msid>>21) & 0xFF);
32
CANSTMOB = 0x00;
33
CANCDMOB = 80 + (strlen(sendstring)); //0x58;   // 80 +                    for (int counter = 0; counter < (strlen(sendstring)); counter++)
34
    {
35
    CANMSG = sendstring[counter];             
36
    }
37
}

von Juergen H. (harms)


Lesenswert?

Ging schneller, als ich dachte. Hier ist der Artikel [[CAN Bibiliothek 
für AT90CAN Prozessoren]] (Links zur Software liegen am Ende des 
Textes).

Ich nehme an, dass der Betrieb mit Interrupts zum "Schnuppern" nicht 
ganz ideal ist - bin aber ueberzeugt, dass eine Anwendung, die CAN 
sinnvoll einsetzt, ohne Interrupts kaum zu denken ist.

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.