Forum: Mikrocontroller und Digitale Elektronik ATXMega: ADC liefert nur Standardwert


von Steffen T. (steffent)


Lesenswert?

Hallo,

ich habe hier einen ATXMega32D4 @32MHz, der ADC liefert nur den Wert 
~548, unabhängig davon, welche Spannung an Pin A4 anliegt. Dieser Wert 
ändert sich mit gewähltem Prescaler.

sieht jemand in folgendem Code einen grundsätzlichen Fehler?
Danke!
1
PORTA_DIRCLR      = (1<<PIN4);
2
PORTA_PIN4CTRL    = 0;
3
4
ADCA.CTRLA        =  ADC_ENABLE_bm;
5
ADCA.CTRLB        =  0;                
6
ADCA.REFCTRL      =  (0b001<<ADC_REFSEL_gp); // VCC/1.6
7
ADCA.EVCTRL       =  0;
8
ADCA.PRESCALER    =  ADC_PRESCALER_DIV64_gc;    
9
ADCA.CAL          =  0x0444;
10
    
11
ADCA.CH0.MUXCTRL  =  ADC_CH_MUXPOS_PIN4_gc;
12
ADCA.CH0.INTCTRL  =  0;
13
ADCA.CH0.INTFLAGS =  ADC_CH0IF_bm;
14
ADCA.CH0.CTRL     =  ADC_CH_INPUTMODE_SINGLEENDED_gc;
15
  
16
ADCA.CTRLA        = (ADC_ENABLE_bm | ADC_CH0START_bm);  // start
17
18
while ((ADCA.INTFLAGS & ADC_CH0IF_bm) != ADC_CH0IF_bm) {    
19
  _delay_us(2);          
20
}  
21
22
int res = ADCA.CH0RES;

von Steffen T. (steffent)


Lesenswert?

Habe den Fehler gefunden und behoben:
In der WinAVR-Datei "iox32d4.h" ist das ADC-Struct fehlerhaft definiert 
(WinAVR-20100110).
Nach Datenblatt korrigierte und getestete Version:
1
typedef struct ADC_struct
2
{
3
    register8_t CTRLA;  /* Control Register A */
4
    register8_t CTRLB;  /* Control Register B */
5
    register8_t REFCTRL;  /* Reference Control */
6
    register8_t EVCTRL;  /* Event Control */
7
    register8_t PRESCALER;  /* Clock Prescaler */
8
    register8_t reserved_0x05;
9
    register8_t INTFLAGS;  /* Interrupt Flags */
10
    register8_t TEMP;  
11
    register8_t reserved_0x08;
12
    register8_t reserved_0x09;
13
    register8_t reserved_0x0A;
14
    register8_t reserved_0x0B;
15
    _WORDREGISTER(CAL);  /* Calibration Value */
16
    register8_t reserved_0x0E;
17
    register8_t reserved_0x0F;
18
    _WORDREGISTER(CH0RES);  /* Channel 0 Result */
19
    register8_t reserved_0x12;
20
    register8_t reserved_0x13;
21
    register8_t reserved_0x14;
22
    register8_t reserved_0x15;
23
    register8_t reserved_0x16;
24
    register8_t reserved_0x17;
25
    _WORDREGISTER(CMP);  /* Compare Value */
26
    register8_t reserved_0x1A;
27
    register8_t reserved_0x1B;
28
    register8_t reserved_0x1C;
29
    register8_t reserved_0x1D;
30
    register8_t reserved_0x1E;
31
    register8_t reserved_0x1F;
32
    ADC_CH_t CH0;  /* ADC Channel 0 */
33
} ADC_t;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.