Display schwarz bei Start von ADC

Gast #2213705
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
}
Gast #2213933
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
}
Gast #2214135
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!!

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