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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.