Forum: Mikrocontroller und Digitale Elektronik Setzen von Registern


von Florian H. (florian2840)


Lesenswert?

Hallo,

ich habe das Problem, dass ich nicht weiß, wie man am elegantesten die 
Register für die SPI-Initialisierung setzt. Ich habe die 
SPI-Initialisierungsmethode. Und der MEthode sollen die Registerwerte 
übergeben werden.

Dazu habe ich eine allgemeine SPI-Initialisierungsroutine. Der Methode 
wird jetzt übergeben, dass die SPI-Schnittstelle als Master agieren 
soll.

Wie schreibe ich das am besten, dass das passende Bit im Register 
UCA0CTL0 1 gesetzt wird bzw. bei Slave 0?

Ich hoffe, ihr versteht, was ich meine:S

von Oliver (Gast)


Lesenswert?

Nix verstehen.

Was? Womit? Wieso? Welche Methode? Was steht in der Doku?

und überhapt: Warum?

Oliver

von Peter D. (peda)


Lesenswert?

Florian Hinrichs schrieb:
> Ich habe die
> SPI-Initialisierungsmethode.

Recht blauäugig, zu denken, es gäbe nur eine.
Und auch nur einen MC-Typ auf der ganzen Welt
Und auch nur eine Compilerversion, nur eine IDE, nur eine Schaltung usw.

von Martin S. (sirnails)


Lesenswert?

Florian Hinrichs schrieb:
> Wie schreibe ich das am besten, dass das passende Bit im Register
> UCA0CTL0 1 gesetzt wird bzw. bei Slave 0?

Na indem Du den bestehenden Wert aus dem Register holst, mit der Maske 
von Dir ver-xor-st und anschließend zurückschreibst. Idealerweise gibt 
es ein #define von Deinem Register und dann schreibst Du eigentlich nur:

<definitions.h>
#define REGISTER_NAME (*(0xFFFFFF));
#define IRGENDEIN_WERT 0x04;
</definitions.h>

<main.c>
REGISTER_NAME |= 0x04;
</main.c>

bzw.

<main.c>
REGISTER_NAME |= IRGENDEIN_WERT;
</main.c>

von Florian H. (florian2840)


Lesenswert?

Also nochmal:D Ich will eine SPI-Initialiseirungsroutine, der ich sagen 
kann, ob sie sich zb. als Master oder als Slave initialisieren soll. Wie 
mache ich das, ohne zwei seperate Routinen zu schreiben?

Benutzen tue ich den MSP430F5310 und programmiere mit C.

Auszug aus solch einer Initialisierungsroutine:

void SPI(void){

...

UCA0CTL0 |= UCMST;

...

}

Damit habe ich jetzt mein Master-SPI initialisiert. Jetzt will ich aber 
einen Slave-SPI haben. Dazu muss eigentlich nur aus UCA0CTL &= ~UCMST 
werden. Ich will jetzt aber nicht zwei solcher routinen haben, sondern 
nur eine, indem ich diesen Teil variabel setze. ABer ich habe keine 
Ahnung, wie ich das machen kann.

von Karl H. (kbuchegg)


Lesenswert?

Florian Hinrichs schrieb:

> Ich hoffe, ihr versteht, was ich meine:S

So ungefähr :-)
1
#define SPI_MASTER 0
2
#define SPI_SLAVE  1
3
4
void InitSPI( uint8_t asWhat )
5
{
6
  if( asWhat == SPI_MASTER )
7
  {
8
    .... mache die Initialisierung als Master
9
    .... und setze alle notwendigen Werte in den entsprechenden Registern
10
  }
11
  else
12
  {
13
    .... mache die Initialisierung als Slave
14
    .... und setzte alle dafür notwendigen Werte in den entsprechenden Registern
15
  }
16
17
  ... setzte noch die Werte, für die es egal ist, ob die Initialsierung
18
  ... als Master oder als Slave erfolgen soll
19
}

wenn du noch weitere Dinge hast, die du der InitSPI mitgeben willst, wie 
zb irgendwelche Geschwindigkeitsangaben oder dergleichen, dann führst du 
halt weitere Parameter dafür ein.


Oder ....
... du machst 2 getrennte Funktionen für die Initialisierung als Master 
oder als Slave
1
void InitSPICommonPart()
2
{
3
  ... das was alle SPI Konfigurationen gemeinsam haben.
4
}
5
6
void InitSPIMaster()
7
{
8
  ... den Master-spezifischen Teil
9
  InitSPICommonPart();
10
}
11
12
void InitSPISlave()
13
{
14
  ... den Slaveö-spezifischen Teil
15
  InitSPICommonPart();
16
}

und rufst dann eben die auf, die du im konkreten Anwendungsfall 
benötigst.

Oder ....
.... denk dir was anderes aus. Wie immer gilt: Es gibt mehr als einen 
Weg nach Rom, und sowas wie 'am besten' hängt ganz vom Anwendungsfall 
und zu einem nicht unerheblichen Teil auch von den persönlichen 
Vorlieben ab.

: Bearbeitet durch User
von Florian H. (florian2840)


Lesenswert?

Ja, ich habe massenweise Parameter. INsgesamt sind es 7 an der Zahl. 
Somit gäbe es einen ziemlich langen Code, wenn ich alles mit If und Else 
Prüfungen machen würde.

von Karl H. (kbuchegg)


Lesenswert?

Florian Hinrichs schrieb:
> Ja, ich habe massenweise Parameter. INsgesamt sind es 7 an der Zahl.

Da würde sich dann  zb anbieten, diese Parameter in eine struct zu 
packen und die als Parameter an die Funktion zu übergeben.

> Somit gäbe es einen ziemlich langen Code, wenn ich alles mit If und Else
> Prüfungen machen würde.

Ah geh.
7 if-else untereinander.
Das ist doch nicht ziemlich lang

von Florian H. (florian2840)


Lesenswert?

Ok super, dann werde ich es so machen. Dachte es wäre eine sehr 
umständliche Variante. Danke euch für eure schnelle Hilfe:)

von Purzel H. (hacky)


Lesenswert?

Ist ein Slave Betrieb ueberhaupt sinnvoll? Da sind die Prozessoren 
eigentlich eine rechte Kruecke...

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.