Bits anschalten richtig verstanden?

Gast #1144664
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
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
> 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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.