Hallo zusammen,
ich programmiere gerade einen at90can128 mit dem Avr Studio. Ich hab ein
paar Zeilen geschrieben um alle Analogwerte nacheinander auszulesen. Das
funktioniert auch soweit. Sobald ich aber den Port D4 setze, spielen
meine Analogwerte verrückt. Genau genommen, kann ich die Werte dem Port
nicht mehr zu Ordnen.
Hier mal ein paar zeilen:
1 | // Init funktion
|
2 | void init_ad_wandler()
|
3 | {
|
4 |
|
5 | //Referenz auf VCC mit externer Kapazität an AVREF legen; Kanalauswahl auf Kanal 0
|
6 | ADMUX=(1<<REFS0);
|
7 | ADMUX |= 0; //erster port
|
8 |
|
9 |
|
10 | PORTC &= 0xF0;
|
11 | //Converter an, adc_prescaler 128, damit adc_clock F_CPU/128
|
12 | //Sampledauer für die erste Conversion 25 adc_clk takte, für jede weitere 13 adc_clk takte
|
13 | //sofort erste conversion starten
|
14 | ADCSRA=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
|
15 |
|
16 | DIDR0=0x4F; //Disablen der digitalen input buffer von ADC5,4,3,2,1,0
|
17 | ADCSRA |= ((1<<ADEN)|(1<<ADSC)); //Converter Enablen und erste Conversion starten
|
18 |
|
19 |
|
20 | }
|
1 | void Cycle_AD_Wandlung(void)
|
2 | {
|
3 | unsigned char port;
|
4 | unsigned char port2;
|
5 | unsigned int adc_wert;
|
6 | uint16_t zw;
|
7 | ADCSRB=0;
|
8 |
|
9 | static int port_test=0;
|
10 |
|
11 | //ADSC ist 1 solange Wandlung andauert
|
12 | if(!(ADCSRA & (1<<ADSC)))
|
13 | {
|
14 | port= ADMUX & 0xF; //Welcher Port wurde gewandelt? Die untersten 4 Bit geben die Analog Pins an
|
15 | port2 = PORTC & 0xF;
|
16 | adc_wert=ADCW; //Low und high byte lesen
|
17 | act_val[ACT_ANALOG_NTC2]=ADMUX;
|
18 | switch (port)
|
19 | {
|
20 | case 0: //Multiplex
|
21 | act_val[ACT_ANALOG_NTC]=Mittelung(adc_wert,8,3);
|
22 | port++;
|
23 | break;
|
24 |
|
25 | case 1: //Power 2
|
26 | act_val[ACT_ANALOG_LEISTUNG2]=Mittelung(adc_wert,8,3);
|
27 | port++;
|
28 | break;
|
29 |
|
30 | case 2: //Power 1
|
31 | act_val[ACT_ANALOG_LEISTUNG1]=Mittelung(adc_wert,9,3);
|
32 | port++;
|
33 | break;
|
34 |
|
35 | case 3: //Power 3
|
36 | act_val[ACT_ANALOG_LEISTUNG3]=Mittelung(adc_wert,10,3);
|
37 | port++;
|
38 | break;
|
39 |
|
40 | case 4: //Analog 2
|
41 | act_val[ACT_ANALOG_2]=Mittelung(adc_wert,11,3);
|
42 | port++;
|
43 | break;
|
44 |
|
45 |
|
46 | .....
|
47 | .....
|
48 | .....
|
49 | }
|
50 |
|
51 | ADMUX &= ~0xF; //untersten 4 bit löschen (die port bits)
|
52 | ADMUX |= port; //nächster zu erfassender port
|
53 |
|
54 | PORTC &= ~0xF;
|
55 | PORTC |= port2;
|
56 |
|
57 | ADCSRA |= (1<<ADSC); //nächste conversion beginnen
|
58 | }
|
59 | }//end of function
|
wenn ich jetzt den Ausgang D4 Setzte, kommt die Wandlung durcheinader.
kennt jemand das phenomen, oder hat jemand eine Idee wie ich das umgehen
kann?
Danke schonmal