Hi, ich habe folgendes Problem:
Ich hab schon öfters mit dem Internen ADC der Atmegas gearbeitet. Aber
aktuell verzweifel ich: Auf meiner selbstgebauten Test-Platine werkelt
ein Mega32 mit externen 8Mhz. Die Hardware funktioniert, da ich den ADC
schonmal erfolgreich genutzt habe.
Trotzdem nochmal die externe Beschaltung: Alle AVCC und GND sind
beschaltet, VCC/GND hat 100nF, AVCC/GND hat 100nF, AVCC/5V hat 10µH in
Reihe. VCC beträgt etwa 5,1V und ist Sauber (mit Oszi gemessen)
Schließe ich meinen Poti an, Messe ich an PA1 mit meinem Mutlimeter 1,7V
bis 3,0V je nach Poti-Stellung.
Ich übertrage die ADC Werte über UART an meinen PC. Es kommt aber IMMER
nur 410 raus. Nach dem Programmieren sinkt der wert von ca. 480 langsam
auf 410 runter. Auch das einschalten aller Pullups an PortA (was ja 1023
als ADC Wert zu folge haben müsste) änderte daran nichts.
Hier mein Code:
1 | #define F_CPU 8000000
|
2 | #define UART_BAUD_RATE 9600
|
3 |
|
4 | #include <stdlib.h>
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 | #include <util/delay.h>
|
8 |
|
9 | #include "uart.h"
|
10 |
|
11 | int main(void)
|
12 | {
|
13 | ADMUX |= (1<<MUX0); //PA1
|
14 | ADCSRA |= (1<<ADPS1)|(1<<ADPS2); //64 Prescaler
|
15 | ADCSRA |= (1<<ADEN);
|
16 |
|
17 | uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
|
18 | sei();
|
19 |
|
20 | char buffer[7];
|
21 | uint16_t ADC_Value;
|
22 |
|
23 | while(1)
|
24 | {
|
25 | ADCSRA |= (1<<ADSC);
|
26 | while (ADCSRA & (1<<ADSC))
|
27 | {
|
28 | ; // auf Abschluss der Konvertierung warten
|
29 | }
|
30 | ADC_Value = ADCW;
|
31 | itoa(ADC_Value, buffer, 10);
|
32 | uart_puts(buffer);
|
33 | uart_puts("\n");
|
34 | _delay_ms(500);
|
35 | }
|
36 | }
|
Ich steh total aufm schlauch, kann mir jemand helfen und weiß worans
liegt? Ist das Programm so Ok? Ist evtl der µC hinüber?