www.mikrocontroller.net

Forum: Compiler & IDEs Bits anschalten richtig verstanden?


Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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" ..

Autor: NurEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.