Data length für AT90CAN128

Gast #785350
Lesenswert?

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
Gast #785357
Lesenswert?

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.
Gast #785360
Lesenswert?

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...
Gast #785375
Lesenswert?

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...
Gast #785389
Lesenswert?

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
Gast #785498
Lesenswert?

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.
Gast #785700
Lesenswert?

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
Angehängte Dateien:
Gast #785709
Lesenswert?

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...
Gast #785727
Lesenswert?

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.
:)
Gast #785836
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren