Forum: Mikrocontroller und Digitale Elektronik Daten in mehrere Register schreiben


von Johannes (Gast)


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

von danvet (Gast)


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

von Martin (Gast)


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.

von Johannes (Gast)


Lesenswert?

habe es mir mit der bit-deklaration mal angeguckt. in der p30f4011 
header datei, ist es ja auch so gelöst. aber über zwei register ist das 
nicht möglich oder?

von danvet (Gast)


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.

von danvet (Gast)


Lesenswert?

Mist jetzt hab ich doch glatt "über zwei bits" gelesen.
Das Ganze geht auch über zwei Register, sofern sie adresstechnisch 
hintereinander liegen.

von Johannes (Gast)


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.

von Johannes (Gast)


Lesenswert?

Oh nein, es geht doch nicht. Da muss ich erst noch einmal gucken.

von Johannes (Gast)


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

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.