Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC des ATmega48


von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Hi!

Ich habe hier zwei fast neue ATmega48, leider haben sie beide eins 
gemeinsam. Der ADC scheint zu spinnen oder ich habe einen groben, 
unerkannten Fehler gemacht. Auf jedenfall treibt mich diese 
ADC-Geschichte zum Wahnsinn.

Der AVR läuft mit 8Mhz internem Takt an 5V. Auf dem Bild ist der Aufbau 
auf Steckboard zu sehen, links ist ein Max232, rechts die gelben 
Kabelchen sind für ISP und nicht angeschlossen. Ich habe AREF einfach 
mit ADC0 verbunden wodurch ich auf einen Wert von 1023 kommen sollte. 
Stattdessen schwankt der Wert:

795, 768, 794, 772, 725, 754, 794, 740, 786, 779, 744, 794, 760, 761, 
792.. sehr heftig also und völlig unbegründet im Bereich um die 800. 
Wenn ich ADC0 mit GND verbinde gurkt der Wert irgendwo bei 90...100 rum.

Was ist hier passiert? Die 5V Spannungsversorgung sollte stabil genug 
sein, kommt direkt aus meinem Labornetzteil. 10000µF Elkos draustecken 
bringt nichts, lauter kleine 100nF Kerkos dazu auch nichts.

Ich messe gerade an AREF 4.17V, habe jedoch die 1.1V interne Referenz 
angeschaltet. Was ist hier passiert?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <stdlib.h>
5
6
#define BAUD 38400UL
7
8
volatile uint16_t adc_akku;
9
volatile uint16_t adc_lights;
10
11
12
void uart_putc(uint8_t chr)
13
{
14
  loop_until_bit_is_set(UCSR0A, UDRE0);
15
16
  UDR0 = chr;
17
}
18
19
void uart_puts(char string[])
20
{
21
  uint8_t i = 0;
22
23
  while(string[i])
24
  {
25
    uart_putc(string[i]);
26
    i++;
27
  }
28
}
29
30
int main()
31
{
32
  // ADC aktivieren
33
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
34
  ADMUX = (1 << REFS1) | (1 << REFS0);
35
36
37
  // UART initialisieren
38
  uint16_t ubrr = F_CPU / (16 * BAUD) - 1;
39
40
  UBRR0H = (uint8_t) (ubrr >> 8);
41
  UBRR0L = (uint8_t) (ubrr);
42
43
  UCSR0B = (0 << TXCIE0) | (1 << TXEN0);
44
  UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
45
46
47
  while(1)
48
  {
49
    ADCSRA |= (1 << ADSC);
50
    loop_until_bit_is_set(ADCSRA, ADIF);
51
52
    char temp[5];
53
    itoa(ADC, temp, 10);
54
    uart_puts(temp);
55
    uart_puts("\n");
56
57
    _delay_ms(1000);
58
  }
59
}

Ich sollte mir nochmal gut überlegen ob ich mich mit sowas später im 
Beruf rumschlagen möchte.

lg PoWl

von Stefan E. (sternst)


Lesenswert?

Du hast AREF und AVCC vertauscht.

von Paul H. (powl)


Lesenswert?

omg... ich laufe rot an.. ok, dankeschön!

von Paul Baumann (Gast)


Lesenswert?

Das passiert schon mal im Gedränge auf dem Damenklo....
;-)

MfG Paul

von Matthias L. (Gast)


Lesenswert?

>Das passiert schon mal im Gedränge auf dem Damenklo....

Deshalb hing in meinem Ausbildungsbetrieb am Damenklo ein Bild mit 
vielen Hühnern drauf, sowie der Überschrift "Nicht drängeln, Mädels"

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.