www.mikrocontroller.net

Forum: Compiler & IDEs wie kann man variable Bits in C Code setzen?


Autor: Aurel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer wieder stoße ich auf folgendes Problem. In einem Register möchte
ich ein oder mehrere Bits setzen und den Rest unverändert lassen.
Leider weiß ich nicht ob das jeweilige Bit eine 0 oder eins sein wird
weil es z. B. aus einer Variablen kommt. Sonst könnte ich ja mit:

x |= (1 << Bitnummer);  // wird ein Bit in x gesetzt
x &= ~(1 << Bitnummer); // wird ein Bit in x geloescht

arbeiten.

Im Aktuellen Fall möchte ich beim ATmega8 den Analogwert an belibigen
Pins auslesen. Dazu soll dann nur noch der Pin in ADMUX angepasst
werden. Der Rest zum einstellen des ADC´s wurde bereits in einer Init
erledigt:


unsigned int Read_ADC(unsigned char pin)
   {
   unsigned int AD_Result;

   ADMUX = ?????????;             // Kanal / Pin einstellen
   ADCSRA |= (1<<ADSC);           // ADC Starten
   while(ADCSRA & (1<<ADSC));     // AD Wandlung abwarten

   AD_Result = ADCL;         // Unteren 8 Bit des Meßwertes auslesen
   AD_Result |= (ADCH<<8);   // Oberen 8 Bit des Meßwertes auslesen

   return AD_Result;
   }


Gesucht ist also für ????????? so was wie "pin<<0" aber ohne das der
Rest (Bit7:4) des Registers verändert wird.
Hat da jemand eine Idee?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADCSRA = (ADCSRA & 0xf0) | ...;

Autor: SeppK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So was kann man mit einer XOR-Verknüpfung erledigen.

ADMUX ^= 1<<PIN

negiert das Bit an der gewünschten Bitposition.

Ist es das was du suchst???

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sepp

ADMUX ^= 1<<PIN

toggelt das Bit an der gewünschten Bitposition!!

Autor: J. Ustiz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Reiner:

toggeln = 'negieren' = invertieren = umschalten...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Nummer des auszuwählenden Kanals in einer Variablen steht und
Du nen Einzeiler willst, dann müsste

ADMUX = (ADMUX & 0xf0) | (kanal & 0x0f);

funktionieren, wobei die 4 MSB (Bit 7:4) unverändert bleiben. In der
Variablen 'kanal' steht die Nummer des auszuwählenden Kanals.

Gruß

Johnny

Autor: Aurel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perfekt, Ostern ist gerettet!

ADCSRA = (ADCSRA & 0xf0) | ...;
und
ADMUX = (ADMUX & 0xf0) | (kanal & 0x0f);

funktionieren!

Danke und wünsche euch allen dicke Eier (-:

Aurel

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.