Atmel, CPU_clock geändert, ADC läuft nun nicht mehr richtig

OP #1184265
Lesenswert?

Hallo,

ich verwende den Atmega3290p. Default-mäßig läuft er mit internen clk 
bei 1MHz. Mit diesem Takt konnte ich die Spannungen am ADC ohne Probleme 
messen.
Der zugehörende code (falls er hilfreich ist):
1
void adc_init(void)
2
{
3
    // PRR - Power Reduction Register
4
    // Bit 0 - PRADC: Power Reduction ADC
5
    PRR &= ~(1<<PRADC);         // dont shut down the ADC power
6
    
7
    // ADMUX - ADC Multiplexer Selection Register
8
    // Bit 7:6 - REFS1:0: Reference Selection Bits
9
    ADMUX &= ~(1<<REFS1);       // AVCC with external capacitor at AREF pin
10
    ADMUX |=  (1<<REFS0);       // AVCC with external capacitor at AREF pin
11
    // Bits 4:0 - MUX4:0: Analog Channel Selection Bits
12
    ADMUX &= ~(1<<MUX4);
13
    ADMUX &= ~(1<<MUX3);
14
    ADMUX &= ~(1<<MUX2);
15
    ADMUX &= ~(1<<MUX1);
16
    ADMUX |=  (1<<MUX0);
17
    
18
    // ADCSRA - ADC Control and Status Register A
19
    // Bit 7 - ADEN: ADC Enable
20
    ADCSRA |=  (1<<ADEN);
21
    // Bit 6 - ADSC: ADC Start Conversion
22
    ADCSRA |=  (1<<ADSC);
23

24
    // Bit 5 - ADATE: ADC Auto Trigger Enable
25
    // ADCSRA |=  (1<<ADATE);
26
    // Bits 2:0 - ADPS2:0: ADC Prescaler Select Bits
27
    ADMUX &= ~(1<<ADPS2);
28
    ADMUX &= ~(1<<ADPS1);
29
    ADMUX &= ~(1<<ADPS0);
30
}
31
void get_ADC(int adc_channel)
32
{
33
    // Bits 4:0 - MUX4:0: Analog Channel Selection Bits
34
    ADMUX = adc_channel;
35

36
    // Bit 6 - ADSC: ADC Start Conversion
37
    ADCSRA |=  (1<<ADSC);
38
    while ((ADCSRA & ( 1 << ADSC )));// stays high as long as is in progress
39
    // Werte stehen nun im ADCL und ADCH
40
}

Wenn ich den Takt nun aber auf 8 MHz (intern) erhöhe, bekomme ich nur 
noch falsche Werte geliefert. Kann mir jemand sagen was ich falsch 
mache?

Auch wenn ich den ADC Prescaler (ADMUX) ändere, stimmen meine Werte 
trotzdem nicht (So wie ich es verstanden habe, dürfte sich dies eh nicht 
auf die Richtigkeit der Messwerte auswirken).
Danke schon mal für die Antworten.
#1184268
Lesenswert?

>   Atmega3290p

meinst du Atmega3250p ?

Hans Wurst wrote:

>     // Bit 5 - ADATE: ADC Auto Trigger Enable
>     // ADCSRA |=  (1<<ADATE);
>     // Bits 2:0 - ADPS2:0: ADC Prescaler Select Bits
>     ADMUX &= ~(1<<ADPS2);
>     ADMUX &= ~(1<<ADPS1);
>     ADMUX &= ~(1<<ADPS0);

??..die ADPSX Bits sind doch im ADCSRA
OP #1184572
Lesenswert?

Justus Skorps wrote:
> meinst du Atmega3250p ?

Nein, er nennt sich zwar schon Atmega3290p, jedoch sind die 
Eigenschaften zwischen den meisten Atmels recht ähnlich (so wie ich das 
sehe).

> ??..die ADPSX Bits sind doch im ADCSRA

Ich Depp, was hatte ich denn da nur für einen Mist programmiert ;)

Jetzt funktioniert es wieder. Ich danke euch beiden.

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