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