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
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
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,
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
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)
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
Hallo, besten Dank! Das waren genau die Sachen, die ich irgendwie im Handbuch nicht in dieser Deutlichkeit finden konnte. Gruß, Harald
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,
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.