Hi,
ich versuche nun seit geraumer Zeit beim Mega644 den ADC zum laufen zu
bringen.
Allerdings kommen nur seltsame Werte bei raus:
1 | #include <avr/interrupt.h>
|
2 | #include <avr/io.h>
|
3 | #include "adc/adc.h"
|
4 |
|
5 |
|
6 | #include <stdio.h>
|
7 | #include <string.h>
|
8 | #include <stdlib.h>
|
9 |
|
10 | #include "uart/uart.h"
|
11 |
|
12 | #define nop() asm volatile("nop")
|
13 | #define ADC_DEBUG
|
14 |
|
15 | void adc_init(void)
|
16 | {
|
17 | unsigned int tmp_adc_level;
|
18 |
|
19 | DDRA = 0x00; //Input
|
20 | PORTA = 0x00;
|
21 |
|
22 | ADMUX = (1 << REFS1) | (1 << REFS0); //AVCC with external capacitor at AREF pin
|
23 | ADMUX |= (0 << ADLAR); //Right adjusting
|
24 | ADMUX |= (0 << MUX4) | (0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0); //ADC4
|
25 |
|
26 | ADCSRA = (1 << ADEN) | (0 << ADSC) | (0 << ADATE); //Enable; Don't start conv here; No auto trig
|
27 | ADCSRA |= (1 << ADIF) | (0 << ADIE); //Clear interrupt flag; ADC interrupt disable
|
28 | ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); //Prescaler = 128 (125kHz/FCPU=16MHz)
|
29 |
|
30 | ADCSRA |= (1 << ADSC); // Start ACD conversion
|
31 | while ((ADCSRA & (1<<ADIF))==0)
|
32 | nop(); //Wait for conversion finished
|
33 | tmp_adc_level = ADCW; //(ADCH << 8) + ADCL
|
34 | }
|
35 |
|
36 | unsigned int adc_get(void) //TODO uint8 channel
|
37 | {
|
38 | unsigned int tmp_adc_level;
|
39 | #ifdef ADC_DEBUG
|
40 | char buffer[20];
|
41 | unsigned int i = 0;
|
42 | #endif
|
43 | ADCSRA |= (1 << ADSC); // Start ACD conversion
|
44 |
|
45 | while ((ADCSRA & (1<<ADIF))==0)
|
46 | nop(); //Wait for conversion finished
|
47 |
|
48 | ADCSRA |= (1<<ADIF); // Clear ISR flag, usually done by HW
|
49 |
|
50 | #ifdef ADC_DEBUG
|
51 | sprintf(buffer, "ADCL := %i\n\r", ADCL);
|
52 | uart_puts("\n\r\n\r");
|
53 | uart_puts(buffer);
|
54 |
|
55 | sprintf(buffer, "ADCH := %i\n\r", ADCH);
|
56 | uart_puts(buffer);
|
57 | uart_puts("\n\r\n\r");
|
58 |
|
59 | sprintf(buffer, "ADCW := %i\n\r", ADCW);
|
60 | uart_puts(buffer);
|
61 | uart_puts("\n\r\n\r");
|
62 |
|
63 | cli();
|
64 | tmp_adc_level = ADCL + (ADCH << 8);
|
65 | sei();
|
66 | sprintf(buffer, "ADC := %i\n\r", tmp_adc_level);
|
67 | uart_puts(buffer);
|
68 | uart_puts("\n\r\n\r");
|
69 |
|
70 | uart_puts("--------------------");
|
71 | uart_puts("\n\r\n\r");
|
72 | #endif
|
73 | return tmp_adc_level;
|
74 | }
|
adc_get() wird periodisch in main while(1) aufgerufen.
Ich habe einen Trace mit putty aufgenommen und bekomme für
ADCL werte Zwischen 10 und 60
ADCH immer 1
ADCW Werte zwischen 270 und 330.
Das große Problem hier ist, am ADC liegen NULL VOLT an.
Ich habe das Ganze mit dem ADC4, 3, und 2 ausprobiert.
Am Referenzpin liegen 4,87 Volt an.
Ich habe auch versucht die interne 2,5V Referenz zu benutzen, gleiches
Ergebnis.
Habe ich irgend etwas bei der initialisierung vergessen?
Mache ich irgend was in meinem Code falsch?
Oder ist mein Mega hin?
Gruß