Forum: Mikrocontroller und Digitale Elektronik AD-Wert einlesen und am LCD ausgeben funktioniert nicht!


von Mad M. (madang)


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;
}

von Thi L. (flothi)


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

von Jean Player (Gast)


Lesenswert?

Madang Madang schrieb:
> GND (Pin 31 und 30) sind bei mir nicht belegt.
> Entweder habe ich einen Beschaltungsfehler

Du musst die Analoge Masse und Versorgung schon anschliessen !

von Mad M. (madang)


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;
}

von Duck und weg (Gast)


Lesenswert?

Nach meinem Datenblatt sind sind Pin 30 und 31 beim ATmeega32 die Pins 
für PA7 und PA6.

von Thomas (kosmos)


Lesenswert?

50kOhm sind evtl. zu viel, könnte gut sein das die Spannung während der 
Messung zusammenbrecher. Probier mal 10 kOhm aus. Oder du pufferst die 
Spannung mit einem Elko 1µF sollte reichen.

von Floh (Gast)


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);

:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.