www.mikrocontroller.net

Forum: Compiler & IDEs ADC funzt net so wie er soll


Autor: Markus R. (nil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe eine Frage zum ADC. Er soll bei Aufruf den Port auslesen und das
Ergebnis zurückgeben. So weit scheint das alles auch zu funktionieren.
Aber die If-Else Anweisung nicht. Egal welche Spannung ich anlege oder
welche Werte ich bei dem If Teil eingebe, er führt immer die Else
Schleife aus... Woran liegt das?


#include <avr/io.h>


uint16_t auswertung (void);
volatile uint16_t wert=0;

int main (void)
{
  uint16_t i=0,ergebnis=0;

  //Ports initialisieren
  DDRC  = 0xFF; //Port C als Ausgang für die LED's
  PORTC = 0XFF; //Pull Up's aktiviert


  while(1)
  {
    ergebnis = auswertung();


    if (1023 > ergebnis > 1)
    {
      PORTC = (0b00001111);
    }
    else PORTC = (0b10101010);

  }
}



uint16_t auswertung (void)
{


//Initialisieren
ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
ADMUX = ((1<<MUX0) | (1<<MUX1) | (1<<MUX2));

//Dummy Auslesung als Warm-Up wie im Tutorial
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));

//Messung
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));

wert = ADCL; //ERR
wert += (ADCH<<8); //Alternativ 'wert = ADCW;'

ADCSRA &= ~(1<<ADEN); //ADC Disable

return wert;

}

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Markus,

als das
if (1023 > ergebnis > 1)
ist mir persönlich in der Form noch nicht untergekommen.
Versuch doch mal
if ( (ergebnis < 1023) && (ergebnis > 1) )

Wobei Du beachten solltest, dass die Werte von einem ADC meiner
Erfahrung nach sehr stark schwanken können. Daher sei dir vielleicht
angeraten, noch eine Filterfunktion dahinterzuhängen, oder Du nimmst
einen etwas höheren Wert als 1.

Gruss,
Sebastian

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (1023 > ergebnis > 1) bedeutet: if ((1023 > ergebnis) > 1)

D.h. der Vergleich (1023 > ergebnis) liefert  0 oder 1 zurück und ist
damit nie > 1.

Der Code dürfte also vollständig wegoptimiert worden sein und nur der
else-Zweig wird ausgeführt.


Peter

Autor: Markus R. (nil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D'oh!

Man man Achim... wie blöd von mir.

Aber tausend Dank euch zweien. Hätte bestimmt noch ewig nach dem Fehler
gesucht obwohl er so offensichtlich war...

Funktioniert jetzt überigens Perfekt!

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum führst du das immer wieder an.....:

//Initialisieren..und...und..

umständlich geproggt.

Autor: Markus R. (nil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einmal zu Beginn initialisieren und nicht ständig wieder abstellen oder
was meinst du damit? Oder kann ich den dann besser direkt als 'free
running' einstellen?
Bin für jeden Vorschlag und jede Hilfestellung dankbar...

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.