Forum: Mikrocontroller und Digitale Elektronik Display schwarz bei Start von ADC


von Carsten (Gast)


Lesenswert?

Hallo,
ich habe ein Display (2-Zeilen Segment LCD) an einen Atmega48 gehängt. 
Funktioniert einwandfrei.
Jetzt will ich mittels ADC den Wert eines Potis auslesen und über das 
Display anzeigen. Dabei wird das Display plötzlich schwarz.

Ich verwende ein STK500, das Poti hängt zwischen Vcc und GND, der 
Abgriff auf PC0. Zwischen GND und AREF habe ich ein 100nF Kondensator 
gesetzt.

Ich konnte den Fehler eingrenzen: er tritt auf, sobald die Zeile
ADMUX  |=  (1<<REFS0);
ausgeführt wird. Dadurch soll ja die interne Vcc Spannung verwendet 
werden.
An AREF spring dabei die Spannung von 0V auf 6,2 Volt...

Kann mir das nicht erklären.. anbei der Code. Vielleicht hat ja jemand 
eine Idee.

Vielen Dank!
Carsten


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 1000000
4
#include <util/delay.h>
5
6
void ADC0_auslesen(void){
7
void lcdInit(void);
8
uint16_t Poti1Wert;
9
10
int main (void) {
11
DDRB  =  0b00;      // Taster 
12
DDRC  =  0b00100000;    // ADC und Backlight (PC5)
13
PORTC  =  0x00;
14
DDRD  =  0xff;        // LCD (Ausgang) 
15
16
17
ADMUX   |=   (1<<MUX0);
18
ADCSRA  |=  ((1<<ADEN)|(1<<ADSC)|(1<<ADPS1)|(1<<ADPS2));  //ADC enable,Prescaler=64
19
20
21
lcdInit();
22
23
while(1){
24
25
lcdClear();
26
27
if (~PINB & (1<<PB1)){     //wenn Taster gedrückt
28
  while(~PINB & (1<<PB1)){}   //Entprellung
29
  ADC0_auslesen();
30
  }
31
32
}
33
}
34
35
36
37
38
void ADC0_auslesen(void){
39
  ADMUX  |=  (1<<REFS0); 
40
  ADMUX  &=   ~(1<<MUX1);
41
  ADMUX  |=   (1<<MUX0);  //ADC0 auswählen
42
  ADCSRA  |=  (1<<ADSC);   //Start
43
44
  while  ((ADCSRA|=(1<<ADIF))==0){} //Warten bis ADC complete
45
  
46
  ADCSRA  |=   (1<<ADIF);   //clear Flag by writing a logical 1
47
  Poti1Wert =   ((ADCH|(0x03))<<8)|(ADCL);
48
}

von spess53 (Gast)


Lesenswert?

Hi

>Vielleicht hat ja jemand eine Idee.

Zieh mal den AREF-Jumper.

MfG Spess

von Carsten (Gast)


Lesenswert?

Cool,
Display nicht mehr schwarz!

Da wär ich nie drauf gekommen. Danke!

von Carsten (Gast)


Lesenswert?

Habe jetzt das nächste Problem: es wird ein wert angezeigt, der sich 
aber durch das poti nur zwischen 270 und 300 einstellen lässt.
Die Einer-Stelle rauscht um ca. +/- 4

Außerdem wird bein einschalten zunächst ein wert von ca. 370 angezeigt, 
der dann langsam auf 300 abfällt, wo er dann auch bleibt. Die Spannungen 
an PC0 und AREF bleiben dabei konstant.


Der Code sieht jetzt so aus:
void ZahlInString(uint16_t); schreibt eine 16 Bit zahl aufs Display, was 
auch einwandfrei funktioniert.


Danke!
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 1000000
4
#include <util/delay.h>
5
6
uint16_t Poti1Wert =0;
7
8
int main (void) {
9
ADMUX  |=  (1<<REFS0); //interne Referenz Vcc
10
ADMUX   |=      (1<<MUX0);  
11
ADCSRA  |=  ((1<<ADEN)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS2)); //Prescaler 32
12
13
lcdInit();
14
15
while(1){
16
17
ADC0_auslesen();
18
lcdClear();
19
ZahlInString(Poti1Wert);
20
21
}//while..
22
}//main
23
24
25
26
27
28
void ADC0_auslesen(void){
29
 
30
_delay_us(10);
31
ADCSRA  |=  (1<<ADSC); //Start
32
33
while  ((ADCSRA|=(1<<ADIF))==0){} //Warten bis ADC complete
34
ADCSRA  |= (1<<ADIF); //Clear the flag by writing a logical 1
35
36
Poti1Wert = ADCL;
37
Poti1Wert += (ADCH << 8);
38
39
}

von Carsten (Gast)


Lesenswert?

Habe mir jetzt ADCH und ADCL separat anzeigen lassen..
ADCH hat immer den Wert 1, während ADCL einstellbar ist zwischen 30 und 
60 und eben rauscht wie die wutz..

Am PC0 kann die Spannung schön zwischen 0 und 5V eingestellt werden, ich 
denke also es muss am Programm liegen.
Habe schon diverse andere codes verglichen und kann keinen Fehler 
erkennen...

Wär schön, wenn sich jemand nochmal meinen Code anschauen könnte...
danke!!

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.