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