www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Potentiometerwert in C auslesen


Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte gerne in C den Werte eines Potentiometers das an den beiden 
Analogeingängen angeschlossen ist auslesen und als Zeitkonstante für ein 
_delay_ms() verwenden.
In BASCOM gibt es dazu ja den Befehl getadc().
Wie funktioniert das in C?

Das Delay soll in dem Programm zwischen 0 und 500 liegen.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirfst ne Blick ins Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
und findest dort ne Beispielfunktion.

Dann baust du die in dein Programm ein, und wunderst dich, dass die 
delay-Zeiten nicht passen. Dann schaust du in der avr-libc-Doku nach und 
findest heraus, dass _delay_ms() auf keinen Fall mit Variablen als 
Parameter aufgerufen werden sollte. Und was du dann machst, musst du dir 
jetzt aber selber ausdenken....

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe dazu folgendes gefunden:
void Warte(int ms)
{
  int i;
  for(i=0;i<ms;++i)
    _delay_ms(1);
}
Aufruf mit Warte(xx);

Damit sollte das Problem mit der Variable in _delay() gelöst sein.

Jedoch weiß ich immer noch nicht wie ich den Wert des Potis auslese.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Ich möchte gerne in C den Werte eines Potentiometers das an den beiden
> Analogeingängen angeschlossen ist auslesen

Wie soll das gehen mit 2 Eingängen, ein Poti hat doch 3 Anschlüsse?

Ein Tip: Du brauchst nur einen Analogeingang, VCC und GND.


Peter

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schon klar.
Meine Formulierung war falsch.

Der eine Anschluss liegt an VCC. Der andere an GND. Und der mittlere am 
AVR Anlalogeingang.

Ok, ich habe mal dieses Beispiel hergenommen:
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                               // setzen auf 8 (1) und ADC aktivieren (1)
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
 
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
 
  return result;
}

Mir ist nur nicht ganz klar, was das ganze macht bzw. in welche Variable 
ich nun den Wert eingelesen bekomme.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:

Poti Anschluss:
1 ... liegt auf VCC
2 ... liegt auf ADC6
3 ... liegt auf PD2 (INT0)

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Mir ist nur nicht ganz klar, was das ganze macht
Hast Du das gerade gepostete Beispiel durchgelesen? Steht doch in den 
Kommentaren drin.

> bzw. in welche Variable ich nun den Wert eingelesen bekomme.
Erstmal in keine. Der Wert ist Deine Funktionsantwort.

Wenn Du dann
uint16_t kristallkugel;
kristallkugel = ReadChannel(0);
machst, dann ist "kristallkugel" die von Dir gewünschte Variable.

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
damit hab ichs schon versucht.

Warte(adcval);
Funktioniert aber nicht

Entspricht ReadChannel(0) einen Analogeingang am AVR? Wenn ja, welcher?
Ich verwende einen ATMEGA8-AU. Muß ich dazu das Programm anpassen?

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReadChannel(0); //liest Kanal 0, also ADC0 aus

Warte(ReadChannel(0));

würde dann je nach Poti Einstellung von 0...1024ms warten.

Bitte versuch erst einmal mit Hilfe vom Datenblatt und dem Codebeispiel 
aus dem Tutorial zu verstehen was du da machst. Es macht keinen Sinn 
Hals über Kopf ein Mikrocontrollerprogramm zu schreiben und per try and 
error ans laufen zu kriegen.
Du solltest viell. in kleineren Schritten arbeiten.

technikus

Autor: Lokus Pokus (derschatten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, jetzt hab ichs! Danke!
Was jetzt noch etwas unschön ist, das sich die Werte nicht linear 
verändern.
Erst wenn ich das Poti fast ans Ende drehe wird die Geschwindigkeit viel 
schneller.
Im unteren Bereich tut sich fast gar nichts.

Autor: doc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast aber nicht zufällig ein logarithmisches Poti erwischt ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was jetzt noch etwas unschön ist, das sich die Werte nicht linear
>verändern.
>Erst wenn ich das Poti fast ans Ende drehe wird die Geschwindigkeit viel
>schneller.
>Im unteren Bereich tut sich fast gar nichts.

Ist das ein lineares Poti?

Noch was:

>3 ... liegt auf PD2 (INT0)

Was soll das??

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred W. schrieb:
> Was jetzt noch etwas unschön ist, das sich die Werte nicht linear
> verändern.

Das liegt an Deiner Aufgabenstellung (0..500ms).

Der Unterschied 0/1ms dürfte deutlich merkbarer sein als der zwischen 
499/500ms.


Peter

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.