Forum: Mikrocontroller und Digitale Elektronik Struktur für Programmierung des dsPIC30F Familie Daten auslesen und richtig abspeichern


von Uwe S. (tribe589)


Lesenswert?

Hallo liebe Mikrocontroller.net Member,

Problemstellung: Ich möchte mittels eines Mikrocontrollers Daten zu 
einer Platine schicken und auch empfangen. Die Kommunikation läuft über 
den CAN-BUS. Mittels Can-Befehle lassen sich die Einstellungen an der 
Platine vornehmen und die Platine sendet regelmäßig Informationen 
zurück.

Jetzt sind die Daten pro gesendete Nachricht 8 Byte lang. Mein Problem 
ist aber das z.B. Informationen nicht Byte weise Inhalten sind. Die 
ersten drei Bits ist eine Information. Die nächste zwei die nächste usw.

Die Daten empfangen funktioniert schon, jedoch weiß ich nicht wie ich 
die Daten sinnvoll abspeichern kann.

Jede Information möchte ich in eine Variable abspeichern. Verwende ich 
dafür ein struct? Wäre das sinnvoll? Habt ihr andere Vorschläge die ich 
nicht kenne?

z.B. struct Test{
unsigned int = Helligkeit; //3Bit Helligkeit
unsigned int = ProgrammStatus; // 4Bit ...
}

Test test; und hier die Variablen abspeichern?
Die Buffer sind immer in 2 Byte unterteilt aber jetzt können Nachrichten 
genau über die Grenze gehen. (zwischen zwei Buffern)
Kann ich irgendwie Bit Zahlen aneinander hängen? oder nur Teile einer 
binären Zahl an ein Teil einer anderen binären Zahl?

So möchte ich die Nachrichten richtig auf die Variablen selektieren.


Verwendeter Mikrocontroller dsPIC30F4011


Falls ihr Quellcode benötigt oder andere Informationen die ich vergessen 
habe bitte nennen :)

Desweiteren stelle ich gerade fest, wenn ich eine Nachricht bekomme, wie 
kann ich unterscheiden ob es die Nachricht mit der ID 500, 501 oder 502 
war? Ich möchte die Nachrichten aus der Übertragung mit der id500 z.B. 
in ein anderes struct gespeichert werden, als die Nachrichten aus der 
Übertragung mit der ID 501. Wie könnte man die Nachrichten 
unterscheiden?

: Bearbeitet durch User
von Irgendwer (Gast)


Lesenswert?

Uwe S. schrieb:
> z.B. struct Test{
> unsigned int = Helligkeit; //3Bit Helligkeit
> unsigned int = ProgrammStatus; // 4Bit ...
> }

https://msdn.microsoft.com/de-de/library/yszfawxh.aspx

>
> Test test; und hier die Variablen abspeichern?
> Die Buffer sind immer in 2 Byte unterteilt aber jetzt können Nachrichten
> genau über die Grenze gehen. (zwischen zwei Buffern)

Einfach das hi-Byte um acht Bit verschieben und zusammen mit dem lo-byte 
zu einem 16Bit-Wert verknoten. Und das ganze dann dem bit field 
zuordnen.

von BT (Gast)


Lesenswert?

Hallo Uwe S.

Über die Filter kann man eine "Nachrichtenbereichsbeschränkung" 
erreichen.
In dem Fall eben ID 500, 501 oder 502.
Den Identifier kann aus dem empfangsregister ausgelesen werden und so 
die Nachricht eindeutig zuordnen.

Gruß
BT

von Volker S. (vloki)


Lesenswert?

Uwe S. schrieb:
> Jetzt sind die Daten pro gesendete Nachricht 8 Byte lang. Mein Problem
> ist aber das z.B. Informationen nicht Byte weise Inhalten sind. Die
> ersten drei Bits ist eine Information. Die nächste zwei die nächste usw.

Möglicherweise wäre eine "Union" ganz praktisch.
1
typedef union {
2
    unsigned char bytes[8];
3
    struct {
4
        unsigned erste3bits_INFO     : 3;
5
        unsigned naechste2bits_INFO  : 2;
6
        unsigned whatever            : ?;
7
        ...
8
    } bits;
9
} ID500_NACHRICHT;
10
11
typedef union {
12
    unsigned char bytes[8];
13
    struct {
14
        ...
15
    } bits;
16
} ID501_NACHRICHT;
17
...

Abspeichern würdest du es dann zunächst aus den CAN RX Registern 
byteweise
    n500.bytes[i] = CANRX[i];
Zugriff hättest du über
    n500.erste5bit_INFO
(n500 wäre hier eine Variable ovm Typ ID500_NACHRICHT)

: Bearbeitet durch User
von Uwe S. (tribe589)


Lesenswert?

Vielen Dank die Antworten haben mir sehr weiter geholfen! :)

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.