Problem mit ADC des ATmega48

OP #962648
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
Angehängte Dateien:
Gast #963190
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"

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