Forum: Mikrocontroller und Digitale Elektronik CAN: Senden mit AT90CAN128


von Harald (Gast)


Lesenswert?

Hallo,

ich studiere im Moment dir Doku zum AT90CAN128. Was sich mit dabei 
einfach nicht erschließen will, ist, wie ich den CAN-Kontroller dazu 
veranlassen kann, ein bestimmtes MOb zu senden bzw. welche Registerbits 
dafür zuständig sind.
Könt ihr mit mal auf die Sprünge helfen?

TIA,
Harald

von Rene Zimmermann (Gast)


Lesenswert?

Hallo,

schaust du bitte da: Beitrag "AVR GCC CAN Library"

Gruß Rene

von Harald (Gast)


Lesenswert?

Hi,

das hatte ich bereits gefunden. Was mit bei dem Ganzen allerdings noch 
nicht so richtig klar wurde, ist eben, welche Aktion genau denn nun das 
Senden eines Frames veranlasst (D.h., welches Bit wo gesetzt wird etc.(. 
Da werden irgendwelche MAkros und Funktionen aufgerufen, die ich 
teilweise auch nicht vollständig zurückverfolgen kann.

Gruß,
Harald

von Michael S. (mst)


Lesenswert?

Hi,

also ich geh jetzt mal von C aus, da gehts eigentlich ganz einfach... 
data[ i ] ist ein Array in einer Struct wo meine Datenbytes drin stehen, 
also auch nichts Hexerisches... .-)

Wo genau ist den dein Problem?

1
// Datenbytes in die Mailbox stecken
2
for( unsigned char i = 0; i < 8; i++ ){
3
   CANMSG = pmsg->data[ i ];
4
}
5
  
6
// CAN Frame verschicken
7
CANCDMOB |= ( 1 << CONMOB0 );
8
  
9
// Warten bis Frame verschickt ist
10
while( !( CANSTMOB & ( 1 << TXOK ) ) );
11
  
12
// TX Falg zurücksetzten
13
CANSTMOB &= ~( 1 << TXOK );

Das wars eigentlich, genauere Erläuterungen zu den einzelnen Bits stehen 
im Datenblat... zu finden bei atmel.com... :-) fg

Gruß Micha,

von Harald (Gast)


Lesenswert?

Hallo Micha,

vielen Dank für Deine Antwort. Hilft schon mal weiter.

> Wo genau ist den dein Problem?

Vermutlich durchblicke ich dei Zugriffsmechanismen
auf die einzelnen MOb-Pages noch nicht ganz.

<code>

// Datenbytes in die Mailbox stecken
for( unsigned char i = 0; i < 8; i++ ){
   CANMSG = pmsg->data[ i ];
}

</code>

Ich verstehe das jetzt folgendermaßen:
Das AINC-Bit in CANPAGE wurde auf 0 gesetzt;
daher schaltet der Controller nach jedem Schreibzugriff
CANMSG auf das nächste Byte in der MOb-Page.
Am Ende habe ich in der Page also ein Set aus 8
Nutzdatenbytes abgelegt. Habe ich das so richtig
verstanden?

Frage: Wodurch werden die Daten einem der 15 MObs
nub zugeordnet?

<code>

// CAN Frame verschicken
CANCDMOB |= ( 1 << CONMOB0 );

</code>

Hallelujah! Genau das wollte ich die ganze Zeit wissen:
Wenn also die Steuerbits in CANCDMOB entsprechend gesetzt
werden, dann leitet das die physikalische Datenübertragung ein.
Aber auch hier wieder die Frage: Wie wird festgelegt,
von welchem MOb das Telegramm abstammen soll?

<code>

// Warten bis Frame verschickt ist
while( !( CANSTMOB & ( 1 << TXOK ) ) );

// TX Falg zurücksetzten
CANSTMOB &= ~( 1 << TXOK );

</code>

Das ist dann soweit klar.
Besten Dank!

Gruß,
Harald

von Matthias (Gast)


Lesenswert?

Die MOBs musst Du in einer speziellen Reihenfolge beschreiben.

Glaub IDs, Masken Datefeld und dann zum Schluss das Register mit dem CAN
DLC. Wenn Du das beschreibst und dort wird glaub auch festgelegt, ob es 
ein RX oder TX MOB ist, dann wird automatisch ein Bit gesetzt glaub in 
MOBCON
oder CONMOB oder so ähnlich (Ist ne Weile her bei mir).

Ist das Bit in dem Connect Register gesetzt, dann sendet der CAN Teil 
das Mob automatisch bei der nächsten Gelegenheit! (Glaub auch solange, 
bis ein ACK
kommt)

Achtung ein Warnhinweis: Der DLC kann nur einmal festgelget werden, da 
beim
Überschreiben das MOB automatisch aktiviert wird! (siehe Datenblatt)
Das passiert jedes Mal wenn Du das Register mit dem DLC beschreibst.

(bin ich mal drüber gestolpert)

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
die message objects sind "ge-shadowed" (arme deutsche sprache)

auswahl mittels des CANPAGE-registers. also vorher setzen, dann hast du 
zugriff auf eben das MOb.

hth,
bye kosmo

von Harald (Gast)


Lesenswert?

Hallo,

besten Dank! Das waren genau die Sachen, die ich irgendwie
im Handbuch nicht in dieser Deutlichkeit finden konnte.

Gruß,
Harald

von Michael S. (mst)


Lesenswert?

Harald, ich sags mal so...

Ich brauchte auch eine "kleine Weile" bis mir die CAN-Engine so wirklich 
geheuer war... :-)

Zumal, als ich mit dem CAN128 eingestiegen bis, hatte ich damals noch 
ein silicon-release mit fehlern und das Datenblatt hatte noch 
preliminary Status...

Einige Zeit, Revisions und Errata's später hat dann auch die CAN-Engine 
funktioniert und das Datenblatt war auf heutigem Stand... .-

Aber falls du nun noch hilfe brauchst, bescheid geben!

Gruß Micha,

von Harald (Gast)


Lesenswert?

Hallo,

an alle in herzliches Dankeschön, hat mir alles sehr geholfen.
Werde auf diech zurückkommen, Michael

Gruß,
Harald

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.