Forum: Mikrocontroller und Digitale Elektronik Data length für AT90CAN128


von Juan Carlos (Gast)


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

von Kanzler Gorkon (Gast)


Lesenswert?

Das CAN-Frame kannst Du nicht aufbohren, mehrere CAN-Nachrichten 
schicken geht aber.
Was ist dabei konkret das Problem?

von Juan Carlos (Gast)


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.

von Kanzler Gorkon (Gast)


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...

von Juan Carlos (Gast)


Lesenswert?

Vielen Dank für die Info.
Aber wie kann ich das 182 Signal in 3 Teile aufteilen? Das Signal kommt 
in allen 15 Sekunden.

von Kanzler Gorkon (Gast)


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...

von Juan Carlos (Gast)


Lesenswert?

Wiese nicht 8 Bits, sondern 7 bits?

von crazy horse (Gast)


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

von Juan Carlos (Gast)


Lesenswert?

es ist schon klar. 182 / 8 =22.75. Nicht ganzzahlig.

von Kanzler Gorkon (Gast)


Lesenswert?

Hasts nu hinbekommen?

von Juan Carlos (Gast)


Lesenswert?

ich versuche gerade. Aber gibt's immer Fehlermeldung.
ich schreibe so:

tmp00[8]={0x00,temp00[7]};

Weisst du warum?

von Kanzler Gorkon (Gast)


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.

von Juan Carlos (Gast)


Lesenswert?

Danke. Ich versuche noch einmal.

von Juan Carlos (Gast)


Angehängte Dateien:

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

von Kanzler Gorkon (Gast)


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...

von Juan Carlos (Gast)


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.
:)

von Kanzler Gorkon (Gast)


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!

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.