Daten in mehrere Register schreiben

Gast #4110000
Lesenswert?
• ▲
▼
Hallo,
ich habe zwei Fragen, wegen denen ich diese Woche nocht nicht wirklich 
weit gekommen bin. Es geht um den Identifierprogrammierung an einem 
dsPIC30F4011.
Dabei soll ich den Standard Identifier, sowie den Extended Identifier 
benutzen. Bit 0-17 gehören zum extendet identifer und bit 16-28 zum 
standard identifier.
jetzt soll in bit 0-8 ein befehl stehen. Der Befehl ist z.B.
11110000
das ist Bit 0 und Bit 1 in C1TX0EID,
sowie Bit 10-15 in C1TX0DLC
dazu meine zwei Fragen

möchte ich ein ganzes Register beschreiben, schreibe ich
1
C1TX0DLC = 0xC000;
damit habe ich das ganze Register bis auf Bit 14 und 15 auf null 
gesetzt.
oder ich schreibe
1
C1TX0DLCbits.EID4 = 1;
2
C1TX0DLCbits.EID5 = 1;
hier beschreibe ich auch bit 14 und 15 vom Regesiter mit einer eins.

1. Frage:
ist es möglich, dieses irgendwie zusammenzufassen? Also z.B. alle EID 
vom Register?
so dass ich im prinzip schreiben könnte
1
C1TX0DLCbits.EID = 0x30
hiermit würde ich nur die Bits 10-15 beschreiben (EID<5:0>).

Jetzt geht mein Befehl auch noch ins nächste Register. So steht bei 
EID<13:6> in Bit 0 und 1 eine eins.

2. Frage:
muss ich die daten, die ich mit dem Befehl schicken möchte aufteilen? 
oder gibt es irgendwie eine Möglichkeit, diese zwei teile 
zusammenzufassen?


Ich hoffe, dass ich das Problem und die Fragen gut genug erklärt habe 
und wäre über jeden hinweis dankbar.

mfg
Johannes
Gast #4110027
Lesenswert?
• ▲
▼
ODER und UND sind deine Freunde:
1
C1TX0DLC = 0xC000;              // Register genau so setzen
2

3
C1TX0DLC =  C1TX0DLC | 0xC000;  // die oberen Bits auf 1, alles andere lassen wie es ist
4

5
C1TX0DLC = C1TX0DLC & (~0xC000); // die oberen Bits auf 0, alles andere so lassen wie es ist
Gast #4110045
Lesenswert?
• ▲
▼
Dafür bieten sich in C Bit-Deklarationen an. Wie die Notation ist, und 
ob der Compiler diese "versteht" hängt vom Compiler ab.

Bsp.:

typedef struct {
   unsigned short Counter:6;   // bit 0-5 counter (0-63)
   unsigned short flagA:1;     // 1 bit flag
   unsigned short flagB:1;     // 1 bit flag
   unsigned short restlicheBits: 8 // der rest der 16 bit variable
} neuerTyp;

// Deklaration
neuerTyp variable;

// Verwendung
variable.counter = 33;
variable.flagA = 1;

Im Maschinencode werden daraus in der Regel drei Befehle: Register 
Lesen, Modifizieren, Schreiben.
Gast #4110117
Lesenswert?
• ▲
▼
Wenn du es unbedngt über Bitdeklaration lösen möchtest, kannst du 
natürlich auch zwei Bits zusammenfassen
1
typedef struct{
2
  unsigned short bit_15_14   :2;
3
  unsigned short bit_13      :1;
4
  unsigend short bit_12_11_10:3;
5
  etc...
6

7
}

Um das auf das Register zu mappen brauchst du wahrscheinlich eine union.
Gast #4110188
Lesenswert?
• ▲
▼
habe es nun so gemacht
1
typedef struct tagCxTXxSIDBITS{
2
    unsigned         : 11;
3
    unsigned SID10_6 : 5;
4
}CxTXxPRIOBITS;
5

6
extern volatile unsigned int C1TX0PRIO __attribute__((__sfr__));
7
extern volatile CxTXxPRIOBITS C1TX0PRIObits __attribute__((__sfr__));
8
extern volatile unsigned int C1TX1PRIO __attribute__((__sfr__));
9
extern volatile CxTXxPRIOBITS C1TX1PRIObits __attribute__((__sfr__));
10
extern volatile unsigned int C1TX2PRIO __attribute__((__sfr__));
11
extern volatile CxTXxPRIOBITS C1TX2PRIObits __attribute__((__sfr__));

jetzt kann ich eingeben
1
C1TX0PRIO = 0x0000;
Damit sind die Bits 6-10  gesetzt.

Aber wie mache ich es, wenn ich über zwei Register gehen möchte?
mit tagCxTXxSIDBITS sage ich ja im prinzip welches Register bearbeitet 
werden soll.
Gast #4110274
Lesenswert?
• ▲
▼
Der Fehler ist

build/default/production/CAN_function.o(.text+0x66): In function 
`.LSM19':
: undefined reference to `_C1TX0PRIO'
make[2]: *** [dist/default/production/blink.X.production.hex] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

aber eigentlich habe ich es wie in der p30f4011.h geschrieben. Also ich 
verstehe nicht ganz den Fehler.
Er kommt auch erst beim aufruf
C1TX0PRIO = 0x0000;

aber wenn ich schreibe
C1TX0PRIObits. .. schlägt er mir schon SID10_6 vor. also eigentlich hat 
er doch die beziehung

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