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
Das CAN-Frame kannst Du nicht aufbohren, mehrere CAN-Nachrichten schicken geht aber. Was ist dabei konkret das Problem?
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...
Vielen Dank für die Info. Aber wie kann ich das 182 Signal in 3 Teile aufteilen? Das Signal kommt in allen 15 Sekunden.
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
ich versuche gerade. Aber gibt's immer Fehlermeldung. ich schreibe so: tmp00[8]={0x00,temp00[7]}; Weisst du warum?
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!
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.