Forum: Compiler & IDEs ADMUX problem


von Gizmo (Gast)


Lesenswert?

noch mal ein kleines Problem

und zwar habe ich mir das beispiel im GCC Tutorial mal angsehehn.
was hat es mit folgenden Zeilen auf sich ?

ADMUX = CHANNELOFFSET+channel;    // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

die erste Zeile kommt mir etwas komisch vor was bedeutet
CHANNELOFFSET+channel sind das vorher definierte variablen ode was ist
das ?

danke für eure Hilfe

von Gizmo (Gast)


Lesenswert?

ich habe noch ein anderes Problem hier noch mal mein Code:

#include <avr/io.h>
#include <stdbool.h>

int main(void)
{
  unsigned char x;
  bool conversion;
  ADCSRA = 0b10100110; //ADCSRA initialisieren

  conversion =1;

  if(conversion==1)
  {
  ADCSRA = 0b11100110;  // Konvertierung starten
    if(bit_is_set(ADCSRA,6))
    {
      x = ADCL;      // ADCL auslesen
    x += (ADCH<<8);// ADCH auslesen

    }
      else
    {
      sbi(ADCSRA,6);
    }
  }
  /* Endlosschleife */
  for (;;);

  return 0;
}

und zwar möchte ich auf irgend eine Art und weise erfahren was nun in
variable x drin steht habt ihr ne Idee wie man das machen könnte ?

von Chris (Gast)


Lesenswert?

Du könntest den Wert der Variablen mit "PORTB = x" auf einen Port
legen, an den LEDs angeschlossen sind. Diese zeigen dann den Wert im
Binärcode an.

von Gizmo (Gast)


Lesenswert?

okay hab ich gemacht funktioniert auch nun habe ich aber noch eine
Bedingung eingaut, die überprüft ob die wandlung abgeschlossen wurde
indem prüfe ob das ADIF bit in ADCSRA gesetzt worden ist.
und das ADIF bit wird nicht gesetzt, was kann das daran liegen das ich
in ADMUX nix gesetzt habe, also damit kein Multplixer Kanal gesetzt ist
?

hier der aktuelle code:

#include <avr/io.h>
#include <stdbool.h>

int main(void)
{
  DDRC =0xff;
  unsigned char x;
  bool conversion;
  ADCSRA = 0b10100110; //ADCSRA initialisieren

  conversion =1;

  if(conversion==1)
  {
      ADCSRA =0b11100110;  //Konvertierung starten
      if(bit_is_set(ADCSRA,6))
      {
          if(bit_is_set(ADCSRA,ADIF))
          {
             x = ADCL;
             x += (ADCH<<8);
             PORTC=0x00;
           //  PORTC=x;
          }
          else
          {
            sbi(PORTC,7);
             ADCSRA = 0b111001110;
          }
      }
      else
      {
      ADCSRA =0b11100110;

      }
  }
  /* Endlosschleife */
  for (;;);

  return 0;
}

von Lutz Müller (Gast)


Lesenswert?

Hallo Gizmo,
nach 10 Sekunden Überflug als C-Anfänger ist mir folgendes
aufgefallen:
- Datentyp bool erst ab C99; muß im MFile als Option berücksichtigt
werden. Auch die stdbool.h kenne ich nicht, war aber auch im Urlaub,
vielleicht ist die ja neu
- Das mit unsigned char x (8 bit) und dem anschließenden 16
Bit-geschiebe hast Du bestimmt nicht so gemeint ...Außerdem benutze
doch einfach unsigned int x = ADCW (je nach includiertem io-header/uC
auch nur ADC)und der Compiler behandelt für Dich die zwei
8bit-Zugriffe.
- Nicht sbi benutzen, da deprecated.
Ganz allgemein ist die Mischung zwischen (nicht-C-) binärer
Bitdarstellung und den Bitnamen sehr unübersichtlich. Auch ist es
besser, ein Register mit |= zu ändern und nicht wieder die komplette
Bitmaske anzugeben. Zumindest bei größeren Programmen wird man dadurch
sehr unflexibel und hat evtl. zur Laufzeit ein Registerbit geändert,
welches jetzt durch die statische Bitmaske beim Funktionsaufruf wieder
überschrieben wird.

Gruß
Lutz

von Lutz Müller (Gast)


Lesenswert?

Nun ja, das mit bool hat sich wohl schon geklärt, wie ich gerade gelesen
habe. http://www.mikrocontroller.net/forum/read-2-190909.html#new

von Jörg Wunsch (Gast)


Lesenswert?

Naja, er hat bool natürlich trotzdem eher unsinnig benutzt.  Wenn
schon bool, dann sind die einzigen beiden Werte, die er annehmen soll,
true und false.

Für den Rest gebe ich dir aber auch Recht.

Bezüglich deiner Anmerkung mit dem Setzen eines einzelnen Bits in
einem IO-Register wie ADCSRA kommt noch dazu, dass ADCSRA in dem
Registerbereich liegt, in dem der Compiler ein |= zu einem SBI
optimieren kann.  Für IO-Register, die außerhalb desse liegen, kann es
u. U. günstiger sein, tatsächlich jedesmal alle Bits neu darüber zu
schreiben, aber dann natürlich trotzdem noch symbolisch bleiben für
die Bitnamen und nicht numerisch.

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.