www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC gibt falsche werte aus


Autor: David P. (david_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
Habe ein Problem.
Wenn ich void Liefere_UI_Paar() aufrufe bekomme ich werte angezeigt, 
obwohl 0Volt am ADC-Eingang liegen.
Benutze ich die andere funktion, die keinen mittelwert bildet, dann 
bekomme ich 0 angezeigt, wie es sein soll.

uint16_t strom;   //globale Definitionen
uint16_t spannung;

Wäre nett, wenn ihr mir helfen könntet.

Beste Grüße,

David

Autor: GPS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist etwas schwierig..... void Liefere_UI_Paar()... was soll das, was ist 
das ? Welcher Compiler, welcher ADC, welcher controller.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Glaskugel sagt mir...
... das vielleicht eine lokale Hilfsvariable, die zur 
Mittelwertberechnung verwendet wird, vor dem Aufruf der 'Funktion 
Liefere_UI_Paar()' nicht zu '0' initialisiert wurde.

Autor: David P. (david_)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also, damit es nochmal etwas genauer wird:

Die Schaltung soll erstmal nur dauernd zwei Spannungswerte namens 
Spannung (gemessen am ADC-Eingang PF0) und Strom (ADC-Eingang PF1) über 
die serielle Schnittstelle ausgeben.

Ich habe hier nochmal etwas mehr programmcode angehängt.
Fakt ist, dass die ADC-Eingänge unbeschaltet sind. Nicht ganz. Also der 
PF0 ist mir einem Spannungsteiler beschaltet, PF1 geht direkt in den 
ADC.
Nun fällt mir folgendes auf: Wenn ich den PF0-Pin auf Analogmasse lege, 
dann passiert nichts. WEiterhin wird wirres Zeug angezeigt, aber keine 
00000000-Folge.
Lege ich jedoch PF1 auf Masse, so zeigen beide WERTE 000000 an, wie es 
ein soll.

Woran kann das liegen?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Sourcecode ist kaputt. Da fehlt mindestens eine schließende 
geschweifte Klammer.
void Liefere_UI_Paar()
{  
USART_Init(MEIN_UBRR);
  while(1)
  {  
  
  spannung=LesePortPF(0);
  strom=LesePortPF(1);
  dtostrf( spannung, 8, 0, U );
  dtostrf( strom, 8, 0, I ); 
  uart_puts (U);
  MakeLeerzeichen(4);
  uart_puts (I);
  MakeZeilenende(1);
  ADCStoppen(); 
}

void ADCStarten(void)
{
  ADCSRA |= 0xd7; 
}

Was soll das? Was soll das while(1)?

Das hier macht wohl auch was anderes als beabsichtigt:
uint16_t LesePortPF(uint8_t n)
{
  uint16_t Ergebnis;
  Ergebnis=0;

  ADMUX = n;

  ADMUX |=0xc0; 
  
  ADCStarten();
  
  while (!(ADCSRA & (1<<ADIF)) )  
  Ergebnis = ADC; 
  return Ergebnis;
  
}
(Kommentare der Übersichtlichkeit halber entfernt)


Was macht das while? Was geschieht wann mit der darauffolgenden Zeile?


Wenn Du Deinen Quelltext anständig formatieren würdest, würdest Du 
einiges vielleicht auch selber erkennen können.

Autor: L. R. (badinode)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Definier mal U, I, strom und spannung in der Funktion Liefere_UI_Paar() 
und nicht global.

Autor: David P. (david_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ja den gesamten Code wollte ich nicht anhängen, weshal ich das 
wichtigste rauskopiert habe. Dadurch sind die Formatierungen verloren 
gegangen.

while (!(ADCSRA & (1<<ADIF)) )  wartet, bis die AD-Wandlung zuende ist. 
Das habe ich im AVR-Tutorial gelesen und das hat auch schon ganz gut 
funktioniert.

Das while(1) soll dafür sorgen, dass auf der Seriellen Schnittstelle 
dauernd die beiden Werte für U und I ausgegeben werden.

Eines möchte ich kurz erwähnen. Das Programm hat so schon funktioniert.

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.