mikrocontroller.net

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


Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kanzler Gorkon (Gast)
Datum:

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

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiese nicht 8 Bits, sondern 7 bits?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist schon klar. 182 / 8 =22.75. Nicht ganzzahlig.

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hasts nu hinbekommen?

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versuche gerade. Aber gibt's immer Fehlermeldung.
ich schreibe so:

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

Weisst du warum?

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ich versuche noch einmal.

Autor: Juan Carlos (Gast)
Datum:
Angehängte Dateien:
  • CAN128 (4,95 KB, 102 Downloads)

Bewertung
0 lesenswert
nicht 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

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Juan Carlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:)

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.