Hallo,
Versuche einen Analogwert mit einem Atxmega128A1 auf einem ALVIDI
Entwicklungsboard einzulesen. Jedoch schwanken die eingelesenen Werte
recht stark von Wandlung zu Wandlung. Kann es sein, dass der ADC noch
noch falsch konfiguriert ist? Anbei der Code. Jegliche Hilfe ist
willkommen.
1 | /*
|
2 | Multi-Level-Inverter
|
3 | FHWT ´10
|
4 | */
|
5 | #include <avr/io.h>
|
6 | #include <util/delay.h>
|
7 | #include <avr/interrupt.h>
|
8 | #include <math.h>
|
9 |
|
10 | void clock_init(void);
|
11 |
|
12 | ISR(ADCB_CH0_vect)
|
13 | {
|
14 | PORTA.OUT = ADCB.CH0RESL;
|
15 | }
|
16 |
|
17 |
|
18 |
|
19 | int main (void)
|
20 | {
|
21 | clock_init();
|
22 | sei();
|
23 | PORTA.DIR=0x00;
|
24 | PORTB.DIR=0x00;
|
25 | PORTA.OUT=0x00;
|
26 |
|
27 | ADCB.CALL = 0x00;
|
28 | ADCB.CALH = 0x00;
|
29 | ADCB.CTRLA = 0b00000001; //ADC enable, flush pipeline aus, start=0
|
30 | ADCB.CTRLB = 0b00001010; //unsigned mode,8Bit, Free Running Mode
|
31 | ADCB.REFCTRL = 0b00000000; //Externe 1V Referenz
|
32 | ADCB.PRESCALER = 0x01; //Vorteiler auf 8
|
33 | ADCB.CH0.CTRL = 0x81; //input mode single ended Kanal 0
|
34 | ADCB.CH0.MUXCTRL = 0b00000000; //PIN 0 für ADC wählen
|
35 | ADCB.EVCTRL = 0b00000000; // sweep ch0
|
36 | ADCB.CH0.INTCTRL = 0b00000011; // enable hi level interrupts
|
37 | PMIC.CTRL = 0b00000111; // enable interrupt
|
38 |
|
39 |
|
40 | while(1)
|
41 | {
|
42 | }
|
43 | return 0;
|
44 | }
|