mikrocontroller.net

Forum: Compiler & IDEs ADMUX problem


Autor: Gizmo (Gast)
Datum:

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

Autor: Gizmo (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Gizmo (Gast)
Datum:

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

Autor: Lutz Müller (Gast)
Datum:

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

Autor: Lutz Müller (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

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.