Hallo Zusammen,
hier wieder eine Frage zum AT90CAN128. Nun habe ich ein Signal, das 182
bits besitzt und in allen 15 Sekunden erzeugt wird, durch ein RS232
Interface in den AT90CAN128 zu senden. Dann wird das Signal durch CAN
Controller nach außen gesendet. Aber ein CAN Frame darf nur Datenlänge
max. 64 bits haben. Wie kann ich das weiter machen? Man kann vielleicht
dieses 182 bits Signal in 3 Signale (2 * 64 bits + 1 * 54 bits)
aufteilen. Ich weiss nicht, wie das geht. Danke für ihre Hilfe im
Voraus.
Viele Grüße
Juan
Ich habe ein 182 bits Signal durch CAN Schnittstelle auszusenden. Aber
im jeden CAN Frame kann ich max. 64 bits Nachrichten laden. D.h. dieses
182 Bits Signal kann man nicht einmal fertig per CAN aussenden.
Vielleicht muss man dieses 182 Bits Signal aufteilen, dann jeder Teil
kann per CAN ausgesendet.
Ja, aufteilen und einzeln senden. Die Gegenstelle muss sich das dann
eben wieder zusammensetzen, wie sie es braucht.
Wenns Dich freunt, dann kannst Du ja auch noch ein Protokoll drüberlegen
(z.B. im ersten der 8 CAN-Bytes eine Blockkennung einfügen oder sowas),
aber darum gehts vorerst ja einmal nicht...
Du wirst Dir das lokal zwischenspeichern müssen. Ein Bytearray mit min.
23 Einträgen reicht dafür.
Ist Deine RS232 eine 7Bit UART (sonst würd sich die Division nicht
ausgehen)? Wenn ja, würd ich eher ein 26 Byte Array nehmen (182/7). Der
Receive Interrupt auf der Seriellen kommt nämlich üblicherweise pro
Zeichen und nicht pro Bit.
Aus dem Bytearray brauchst dann nur mehr auf die maximale
Nachrichtengröße einer CAN-Nachricht entnehmen und senden (und das
ebenso lange, bis alles gesendet ist). Innerhalb vom 15 Sekunden geht
sich das ganz leicht aus, da brauchst Du auch keine doppelten Buffer
vorsehen.
Beim AVRStudio ist eh eine CAN-Library dabei (AFAIR), mit der Du leicht
einzelne CAN-Nachrichten versenden kann...
So in etwa.
Was oft gemacht wird: Es gibt auch für für grössere Datenfelder nur eine
ID. Das 1. Byte (oder irgendein anderes :-) ist dann die zusätzlich
benötigte Adressinformation. Senkt dann natürlich den Dateninhalt auf 7
Byte.
Also z.B. ID 0x500
0x500 0x00 7 Byte Daten
0x500 0x01 7 Byte Daten
0x500 0x02 7 Byte Daten
0x500 0x03 7 Byte Daten
Inder Annahme, dass der Code im groben so aussieht, wie ich
vorgeschlagen habe:
// Deklaration
unsigned char temp00[ 26 ];
// irgendwo im Code
void schreib_was_rein( unsigned char data, unsigned char position )
{
temp00[ position ] = data;
}
Was Du da machst ist nix gutes.
Hallo,
bei mir liegt nur ein AT90CAN128, so dass das Signal immer wieder von
CAN Controller ausgesendet wird. Es ist nicht mehr möglich, dass man das
144 bits , das vom anderen Mikrocontroller erzeugt, einmal durch CAN
Interface nach außen schickt. Nun möchte ich nur das erste 64-bits
Signal von 144 Signal aussenden. Aber im Oszi. kann ich im Datenfeld gar
keine Signale sehen, dort stehen nur 64 bits "0". Die von selbst
definierte ID ist im CAN Frame OK. Vielleicht kann jemand für mich die
angehängte Code durchlesen? Die Programme von CAN und USART sind i.O.
Main.c gibt's dort bestimmt Fehler. Vielen Dank für die Hilfe.
Viele Grüße
Juan
Hmm, unbedingt viel Lust hab ich nicht Deinen Code zu prüfen.
Wenn eh ein Oszi hast, dann musst Dich selber ein wenig
dahinterklemmmen.
Auf den ersten Blick:
Das geht so nicht, Array zu klein.
unsigned char temp[144] <-> temp[144] = USART0_Receive(); // RS232
receive
--
Du liest ein Zeichen ein, verwendest dieses aber nie wieder.
temp[0..143] werden nie verändert. Von dem her steht im msgbuffer auch
immer das selbe.
Sowas läßt sicher aber schon ganz einfach debuggen, das wäre
effizienter...
temp[144] zu klein? Ich habe ein 144 bits Signal als Eingangssignal und
jede Elemente im diesen Array ist ein bit. Ist das richtig? Dann würde
ich die erste 64 bits im diesen Array durch CAN Controller schicken.
Hast Du noch Vorschlag für mich. Ich kann noch nicht deguggen, weil ich
ein Anfänger bin.
:)
Du definierst ein Array mit 144 Einträgen. Die haben den Index 0..143
(sie Anzahl der Elemente ist 144). Der Eintrag an der 144. Stelle ist
somit außerhalb des Arrays.
Anm.: Die serielle Schnittstelle des AT90CAN128 liefert Dir keine Bits
sondern Bytes!