AD-Wert einlesen und am LCD ausgeben funktioniert nicht!

OP #2140860
Lesenswert?

Hallo,
irgendwie funktioniert mein Code/Schaltung nicht richtig!
Ich verwende einen Mega 32. Über ein 50k Poti generiere ich eine Spg. 
(mit der Spg. ich auch den µP betreibe) die ich an Pin PA0 (ADC0) 
angeschlossen habe. Gemessen 0 - 5V. Diesen eingelesen Wert möchte ich 
über das LCD-Display ausgeben. Leider sind das nichtssagende Werte, auch 
wenn ich das Poti verändere, tut sich gar nichts. Was mache ich falsch. 
GND (Pin 31 und 30) sind bei mir nicht belegt.
Entweder habe ich einen Beschaltungsfehler, oder bei der Konfiguration 
stimmt etwas nicht!
Anbei der Code!
Vielleicht kann mir jemand weiterhelfen!?
Danke schon Mal vorab
Mad

Code:


int main()
{
 lcd_init();   // LCD initialisieren
// ***********************************
// Konfigurationen für AD-Wandler
// ***********************************
 ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
 ADMUX = 0x00;           // Kanal 0 auswählen
 ADMUX |= (1 << REFS0);  // interne Referenzspg. wird benutzt
 ADCSRA |= (1 << ADSC);  // eine ADC-Wandlung

  while (1) // endlos
  {
     ADCSRA |= (1 << ADEN);  // ADC einschalten
     _delay_ms(100);

     while(ADCSRA & (1 << ADSC));  // Konvertierungsergebnis abwarten

  AD_Werte(ADCL);          // Low-Byte via LCD-Funktion ausgeben
  _delay_ms(1000);

  vNeuer_Wert();           // LCD Text ausgeben
  _delay_ms(1000);

  AD_Werte(ADCH);          // High-Byte via LCD-Funktion ausgeben
  _delay_ms(1000);

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

   }
  return 0;
}
#2140871
Lesenswert?

Madang Madang schrieb:
> Hallo,
> irgendwie funktioniert mein Code/Schaltung nicht richtig!
> Ich verwende einen Mega 32. Über ein 50k Poti generiere ich eine Spg.
> (mit der Spg. ich auch den µP betreibe) die ich an Pin PA0 (ADC0)
> angeschlossen habe.

Das wundert mich weniger - oder versteh ichs falsch: Die Spannung, die 
du messen willst ich deine Versorgungsspannung?

> Gemessen 0 - 5V. Diesen eingelesen Wert möchte ich
> über das LCD-Display ausgeben. Leider sind das nichtssagende Werte, auch
> wenn ich das Poti verändere, tut sich gar nichts. Was mache ich falsch.
> GND (Pin 31 und 30) sind bei mir nicht belegt.

Was hindert dich dran, dies zu tun? Wäre uU hilfreich...

> Entweder habe ich einen Beschaltungsfehler, oder bei der Konfiguration
> stimmt etwas nicht!

Oder beides?

> Anbei der Code!

Nein, nur ein Bruchstück...

> Vielleicht kann mir jemand weiterhelfen!?

Bestimmt - poste mal deinen Schaltplan/Foto/whatever

> Danke schon Mal vorab
> Mad

Thilo
OP #2140954
Lesenswert?

Hier nochmals mein kompletter Code, die LCD Funktion funktioniert!
Die analoge Masse und Versorgung werde ich sofort anschliessen!
Danke nochmals!
vG Mad



// Kompletter Code für eine AD-Wandlung!
// Gemessener Wert wird digitalisiert und via LCD-Display zur
// Anzeige gebracht!

#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int main()
{
 lcd_init();   // LCD initialisieren
// ***********************************
// Konfigurationen für AD-Wandler
// ***********************************
 ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
 ADMUX = 0x00;           // Kanal 0 auswählen
 ADMUX |= (1 << REFS0);  // interne Referenzspg. wird benutzt
 ADCSRA |= (1 << ADSC);  // eine ADC-Wandlung

  while (1) // endlos
  {
     ADCSRA |= (1 << ADEN);  // ADC einschalten
     _delay_ms(100);

     while(ADCSRA & (1 << ADSC));  // Konvertierungsergebnis abwarten

  AD_Werte(ADCL);          // Low-Byte via LCD-Funktion ausgeben
  _delay_ms(1000);

  vNeuer_Wert();           // LCD Text ausgeben
  _delay_ms(1000);

  AD_Werte(ADCH);          // High-Byte via LCD-Funktion ausgeben
  _delay_ms(1000);

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

   }
  return 0;
}
Gast #2141464
Lesenswert?

Madang Madang schrieb:
> ADMUX |= (1 << REFS0);  // interne Referenzspg. wird benutzt
>  ADCSRA |= (1 << ADSC);  // eine ADC-Wandlung
>
>   while (1) // endlos
>   {
>      ADCSRA |= (1 << ADEN);  // ADC einschalten
>      _delay_ms(100);

sollte genau anders rum sein.
Vor der while den ADC einschalten:
ADCSRA |= (1<<ADEN);

und in der Schleife mit dem Startbit die Wnadlung starten:
ADCSRA |= (1<<ADSC);

:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren