Forum: Compiler & IDEs Bits anschalten richtig verstanden?


von CAnfänger (Gast)


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" ..

von NurEinGast (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von CAnfänger (Gast)


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.

von Karl H. (kbuchegg)


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.

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.