Bits anschalten richtig verstanden?

Gast #1144664
Lesenswert?

Dieser Text ist aus einem AVR-Datenblatt zum Thema SPI:

  /* Set MOSI and SCK output, all others input */
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);

damit die Zeile compiliert, müßte ich erstmal definieren

#define DDR_SPI DDRB

aber was für DD_MOSI? Ist das schon irgendwo vordefiniert? Ich lese das 
so, daß eine "1" von rechts in ein leeres Byte gschoben wird, und dann 
werden diese Bytes "oder"-Verknüpft ond dem DDRB zugewiesen. Aber wäre 
es nicth besser, erst zu lesen? Falls ich noch andere Bits verwende, die 
unverändert bleiben sollen?

Sorry, ich finde das in C ein bischen kompliziert. In Assembler kann ich 
einfach "SBI DDRB,7" machen, in Bascom "DDRB.7 = 1" ..
Gast #1144671
Lesenswert?

In C kannst Du auch

statt   SBI DDRB,7       // Setze Bit 7 in DDRB
auch    DDRB |= (1<<7)   // Setze Bit 7 in DDRB


statt   CBI DDRB,7       // Loesche  Bit 7 in DDRB
auch    DDRB &= ~(1<<7)  // Loesche Bit 7 in DDRB

machen.




Die Dinge mit den Defines, so was gibt es auch in Assembler.
Sie sind dafür gedacht das ganze übersichtlicher und 
Hardwareunabhängiger aufbeuen zu können.
Persönliche Seite #1144672
Lesenswert?

> aber was für DD_MOSI?

Das entscheidest Du - an welchem Pin von Port B ist MOSI und wo ist SCK?

Die Bitnummern (0..7) dieser Pins weist du den Konstanten DD_MOSI und 
DD_SCK zu.

Beispiel: MOSI ist PortB.3, also #define DD_MOSI 3

> Aber wäre es nicth besser, erst zu lesen? Falls ich noch
> andere Bits verwende, die unverändert bleiben sollen?

Richtig.

   DDR_SPI = DDR_SPI | (1<<DD_MOSI)|(1<<DD_SCK);

oder, C-typisch knapper geschrieben:

   DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);

Allerdings sagt der Kommentar oberhalb Deiner Zeile, daß alle anderen 
Pins Eingänge werden sollen, und dem entspricht die direkte Zuweisung.
Gast #1144853
Lesenswert?

Ah ja, danke. Ich hab eben gedacht, wenn man schon 
controller-spezifische Dateien einbindet, respektive einstellt im 
AVR-Studio, dann wären vielleicht controller-passend schon Konstanten 
wie MOSI, MISO, CLK darin definiert..? So wie für die Portadressen 
PORTA, PORTB usw.
#1144935
Lesenswert?

CAnfänger wrote:
> Ah ja, danke. Ich hab eben gedacht, wenn man schon
> controller-spezifische Dateien einbindet, respektive einstellt im
> AVR-Studio, dann wären vielleicht controller-passend schon Konstanten
> wie MOSI, MISO, CLK darin definiert..?

Sowas ist immer ein zweischneidiges Schwert.

Für dich mag das jetzt nach Arbeitserleichterung aussehen und im Prinzip 
geb ich dir damit sogar recht.

Für jemanden der sich eine Software Implementierung baut und daher diese 
Funktionen auf ganz andere Pins verteilt ist das ein Grund für heftiges 
Fluchen.

Je mehr defines vordefiniert sind, desto höher sind die Chancen, dass 
sie mit den Vorstellungen des Anwendungsprogrammierers kollidieren.

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