Forum: Mikrocontroller und Digitale Elektronik ADCC - nur zuckeln am Eingang!


von PIC-Besitzer (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

ich betreibe derzeit einen PIC18F26K40 in einer größeren Schaltung. 
Läuft alles prima (ist auch unerheblich), aber der ADCC macht größte 
Probleme.

Ich habe jetzt testweise NUR ein Poti dran, welches mir an einen PIN 
0-3,3V anlegt. Hier mein (mit MCC erzeugter) Code.

Ziel war erstmal das Interruptbasiert zu machen, da zuckelt auch alles 
rum. (Zuckeln heißt - wenn das Poti z.B. mittig steht, erhalte ich werte 
von 300-600, also wirklich nicht nur ein MSB flattern. Der Analogeingang 
ist aber absolut save, ein Blockkondensator ist auch am PIC. Schaltung 
anbei, BAT_AN_IN wird mit einem Poti "befeuert".

Jeglicher Rat ist hilfreich!

VG
1
void ADCC_Initialize(void)
2
{
3
   
4
    // set the ADCC to the options selected in the User Interface
5
    // ADDSEN disabled; ADGPOL digital_low; ADIPEN disabled; ADPPOL VSS; 
6
    ADCON1 = 0x00;
7
    // ADCRS 0; ADMD Basic_mode; ADACLR disabled; ADPSIS ADFLTR; 
8
    ADCON2 = 0x00;
9
    // ADCALC First derivative of Single measurement; ADTMD disabled; ADSOI ADGO not cleared; 
10
    ADCON3 = 0x00;
11
    // ADACT disabled; 
12
    ADACT = 0x00;
13
    // ADAOV ACC or ADERR not Overflowed; 
14
    ADSTAT = 0x00;
15
    // ADCS FOSC/128; 
16
    ADCLK = 0x3F;
17
    // ADNREF VSS; ADPREF VDD; 
18
    ADREF = 0x00;
19
    // ADCAP Additional uC disabled; 
20
    //ADCAP = 0x00;
21
    ADCAP = 0x1F; //Enable all PC-Caps??
22
    // ADPRE 0; 
23
    ADPRE = 0x00;
24
    // ADACQ 255; 
25
    ADACQ = 0xFF;
26
    // ADPCH ANA0; 
27
    ADPCH = 0x00;
28
    // ADRPT 0; 
29
    ADRPT = 0x00;
30
    // ADLTHL 0; 
31
    ADLTHL = 0x00;
32
    // ADLTHH 0; 
33
    ADLTHH = 0x00;
34
    // ADUTHL 0; 
35
    ADUTHL = 0x00;
36
    // ADUTHH 0; 
37
    ADUTHH = 0x00;
38
    // ADSTPTL 0; 
39
    ADSTPTL = 0x00;
40
    // ADSTPTH 0; 
41
    ADSTPTH = 0x00;
42
    
43
    // ADGO stop; ADFM right; ADON disabled; ADCONT disabled; ADCS FRC; 
44
    ADCON0 = 0x14;
45
    
46
47
}
48
49
void ADCC_StartConversion(adcc_channel_t channel)
50
{
51
    // select the A/D channel
52
    ADPCH = channel;  
53
  
54
    // Turn on the ADC module
55
    ADCON0bits.ADON = 1;
56
57
    // Start the conversion
58
    ADCON0bits.ADGO = 1;
59
}
60
61
bool ADCC_IsConversionDone()
62
{
63
    // Start the conversion
64
    return (!ADCON0bits.ADGO);
65
}
66
67
adc_result_t ADCC_GetConversionResult(void)
68
{
69
    // Return the result
70
    return ((ADRESH << 8) + ADRESL);
71
}
72
73
adc_result_t ADCC_GetSingleConversion(adcc_channel_t channel)
74
{
75
    // select the A/D channel
76
    ADPCH = channel;  
77
78
    // Turn on the ADC module
79
    ADCON0bits.ADON = 1;
80
  
81
    //Disable the continuous mode.
82
    ADCON0bits.ADCONT = 0;    
83
84
    // Start the conversion
85
    ADCON0bits.ADGO = 1;
86
87
    // Wait for the conversion to finish
88
    while (ADCON0bits.ADGO)
89
    {
90
    }
91
92
    // Conversion finished, return the result
93
    return ((ADRESH << 8) + ADRESL);
94
}
95
96
void ADCC_StopConversion(void)
97
{
98
    //Reset the ADGO bit.
99
    ADCON0bits.ADGO = 0;
100
}
101
102
void ADCC_SetStopOnInterrupt(void)
103
{
104
    //Set the ADSOI bit.
105
    ADCON3bits.ADSOI = 1;
106
}
107
108
void ADCC_DischargeSampleCapacitor(void)
109
{
110
    //Set the ADC channel to AVss.
111
    ADPCH = 0x3C;   
112
}
113
114
void ADCC_LoadAcquisitionRegister(uint8_t acquisitionValue)
115
{
116
    //Load the ADACQ register.
117
    ADACQ = acquisitionValue;   
118
}
119
120
void ADCC_SetPrechargeTime(uint8_t prechargeTime)
121
{
122
    //Load the ADPRE register.
123
    ADPRE = prechargeTime;  
124
}
125
126
void ADCC_SetRepeatCount(uint8_t repeatCount)
127
{
128
    //Load the ADRPT register.
129
    ADRPT = repeatCount;   
130
}
131
132
uint8_t ADCC_GetCurrentCountofConversions(void)
133
{
134
    //Return the contents of ADCNT register
135
    return ADCNT;
136
}
137
138
void ADCC_ClearAccumulator(void)
139
{
140
    //Reset the ADCON2bits.ADACLR bit.
141
    ADCON2bits.ADACLR = 1;
142
}
143
144
uint16_t ADCC_GetAccumulatorValue(void)
145
{
146
    //Return the contents of ADACCH and ADACCL registers
147
    return ((ADACCH << 8) + ADACCL);
148
}
149
150
bool ADCC_HasAccumulatorOverflowed(void)
151
{
152
    //Return the status of ADSTATbits.ADAOV
153
    return ADSTATbits.ADAOV;
154
}
155
156
uint16_t ADCC_GetFilterValue(void)
157
{
158
    //Return the contents of ADFLTRH and ADFLTRL registers
159
    return ((ADFLTRH << 8) + ADFLTRL);
160
}
161
162
uint16_t ADCC_GetPreviousResult(void)
163
{
164
    //Return the contents of ADPREVH and ADPREVL registers
165
    return ((ADPREVH << 8) + ADPREVL);
166
}
167
168
void ADCC_DefineSetPoint(uint16_t setPoint)
169
{
170
    //Sets the ADSTPTH and ADSTPTL registers
171
    ADSTPTH = setPoint >> 8;
172
    ADSTPTL = setPoint;
173
}
174
175
void ADCC_SetUpperThreshold(uint16_t upperThreshold)
176
{
177
    //Sets the ADUTHH and ADUTHL registers
178
    ADUTHH = upperThreshold >> 8;
179
    ADUTHL = upperThreshold;
180
}
181
182
void ADCC_SetLowerThreshold(uint16_t lowerThreshold)
183
{
184
    //Sets the ADLTHH and ADLTHL registers
185
    ADLTHH = lowerThreshold >> 8;
186
    ADLTHL = lowerThreshold;
187
}
188
189
uint16_t ADCC_GetErrorCalculation(void)
190
{
191
  //Return the contents of ADERRH and ADERRL registers
192
  return ((ADERRH << 8) + ADERRL);
193
}
194
195
void ADCC_EnableDoubleSampling(void)
196
{
197
    //Sets the ADCON1bits.ADDSEN
198
    ADCON1bits.ADDSEN = 1;
199
}
200
201
void ADCC_EnableContinuousConversion(void)
202
{
203
    //Sets the ADCON0bits.ADCONT
204
    ADCON0bits.ADCONT = 1;
205
}
206
207
void ADCC_DisableContinuousConversion(void)
208
{
209
    //Resets the ADCON0bits.ADCONT
210
    ADCON0bits.ADCONT = 0;
211
}
212
213
bool ADCC_HasErrorCrossedUpperThreshold(void)
214
{
215
    //Returns the value of ADSTATbits.ADUTHR bit.
216
    return ADSTATbits.ADUTHR;
217
}
218
219
bool ADCC_HasErrorCrossedLowerThreshold(void)
220
{
221
    //Returns the value of ADSTATbits.ADLTHR bit.
222
    return ADSTATbits.ADLTHR;
223
}
224
225
uint8_t ADCC_GetConversionStageStatus(void)
226
{
227
    //Returns the contents of ADSTATbits.ADSTAT field.
228
    return ADSTATbits.ADSTAT;
229
}
230
231
//Wird im 1ms zyklus aufgrufen, um wirklich 
232
//jegliches Prechargen abzuschließen
233
234
void proc_ADCC(void) {
235
    unsigned static char state = 0;
236
    
237
    switch (state) {
238
        case 0: 
239
            // select the A/D channel
240
            ADPCH = BAT_AN_IN;  
241
            state++;
242
            break;
243
        case 1: 
244
            // Turn on the ADC module
245
            ADCON0bits.ADON = 1;
246
            // Start the conversion
247
            ADCON0bits.ADGO = 1;
248
            state++;
249
            break;
250
        case 2: 
251
            if(ADCC_IsConversionDone()) {
252
                ADCON0bits.ADON = 0;
253
                adc_bat_an_in = ADCC_GetConversionResult();
254
                state=0;
255
            }   
256
    }
257
}

von Jacko (Gast)


Lesenswert?

Ist das bei PICs wirklich sooooo kompliziert?

Was braucht man denn? (in Pseudo-C)

Erfolg = Init_ADC(Kanal,Uref,f_ADC,sonstige Mode-Parameter)

eventuell auch noch

Erfolg = Stopp_ADC()

dann, im Timer-Interrupt, der nicht schneller, als
die Conversion-Time ist:

Erfolg = read_and_restart_ADC(&Result)

Das reicht für 96,3% aller Anwendungen.

Was brauchst du mehr?

von Klaus (Gast)


Lesenswert?

Jacko schrieb:
> Ist das bei PICs wirklich sooooo kompliziert?

Nein. Multiplexer schalten, warten bis der Samplekondensator geladen 
ist, Wandlung starten, wenn fertig auslesen. Ist in weniger als 10 
Zeilen erledigt.

Samplezeiten und Wandlerclock müssen zum CPU-Takt passen, Werte stehen 
im Datenblatt.

MfG Klaus

von PIC-Besitzer (Gast)


Lesenswert?

@Jacko: sonstige Mode-Parameter ... Ja, dann viel Spaß in dem 
Datenblatt. Ich würde nicht fragen, wenn ich es wüsste.

in einem Standard-PIC mit dem normalen ADC kein Problem. Aber hier 
braucht man zig settings, damit überhaupt irgendwas geht.

von Harald W. (wilhelms)


Lesenswert?

Jacko schrieb:

> Was brauchst du mehr?

Zusatzcode, damit es "zuckelt". :-)

von Cerberus (Gast)


Lesenswert?

Was sagt denn die Simulation bzw. der Debugger oder benutzt du
die nicht?

Ich vermisse ein bisschen sinnvolle Kommentare, denn dafür ist
die Funktion doch da.

von Dirk K. (knobikocher)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5098811:
> Ich habe jetzt testweise NUR ein Poti dran, welches mir an einen PIN
> 0-3,3V anlegt.

Wo? Sehe ich nicht im Schaltplan.
Das Signal an RA3 vielleicht? Wenn da wirklich NUR ein Poti dran ist -> 
kein Filter vor dem ADC -> zuckeln.

PIC-Besitzer schrieb im Beitrag #5098811:
> Der Analogeingang
> ist aber absolut save

Bitte "save" definieren.

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

Dirk K. schrieb:

> Bitte "save" definieren.

https://de.wikipedia.org/wiki/Save

:-)

von PIC-Besitzer (Gast)


Lesenswert?

@Cerberus, Debugger spuckt auch dieselben RAW-Werte aus. Also einen 
stark schwankenden, absolut unbrauchbaren Wert. Dazu haben alle Kanäle 
Crosstalk.

Was genau kann/soll ich testen? Wie kann ich das Problem eingrenzen?

@Dirk,
Wo? Sehe ich nicht im Schaltplan. -> "Ich habe jetzt testweise NUR ein 
Poti dran, welches mir an einen PIN 0-3,3V anlegt." Wie willst du mir 
helfen, wenn du nicht Mal lesen kannst?

"Das Signal an RA3 vielleicht? Wenn da wirklich NUR ein Poti dran ist ->
kein Filter vor dem ADC -> zuckeln." -> In zig Anwendungen mit alten 
Pics ohne Zusatzkomponenten gemacht. Notfalls Softwarefilter dahinter, 
mit dem ADCC Average Mode. Selbst ohne zuckt da vll das LSB. Wieso zig 
Kondensatoren auflöten? Machen kaum mehr Geräte - wenn auch aus 
Kostengründen. Aber was will man erwarten, bei so ner sinnfreien 
Antwort.

bzgl Save, entschuldige die fehlende Definition - Laut Oszilloskop liegt 
ein stabiles Signal, also auch kein grobes Rauschen, an. Wobei auch ein 
Rauschen - wie es ja hier im 300-400mV Bereich sein müsste - nicht mal 
das schlechteste Poti hat. Dachte das wäre selbsterklärend.

Jungs, was is mit euch los? Wollt ihr mir helfen, dann fragt / sagt was 
ihr wissen wollt / ich tun soll. Ich mache jede Messung, beantworte 
Fragen, alles. Aber was soll euer dämliches Geklugscheiße, in welchem 
ihr in keinem Satz helft?! Man man man...

von Jacko (Gast)


Lesenswert?

Lieber PIC-Besitzer,

du stellst uns eine einfach klingende Frage:
" warum zuckelt es?"

Ich glaube, allen anderen geht es genauso: Wozu braucht man
28 Funktionen, deren Zusammenhang mit Nebeneffekten nachzu-
vollziehen echt unzumutbar ist...

Wenn es doch nur um
- wähle Kanal, Wandler-Mode und Referenz
- starte den ADC
- lese das Ergebnis aus
- stoppe, oder re-starte den ADC
geht.

Das ist kein Klugscheißen.
Aber: Warum sollen wir in 28 Funktionen nachschauen, wo dein
Fehler liegt, wenn das jeder andere mit 3...5 Funktionen
erledigt hätte?

Dann frage ich mal gezielt:
Was ist an deiner Messung so Besonderes, dass sie 28
unübersichtliche Funktionen braucht, statt 3...5?

von PIC-Besitzer (Gast)


Lesenswert?

Hallo Jacko,

kein Problem. Ich habe geschrieben, das ist nunmal der Standardcode, den 
der MCC erzeugt. Gerne kann ich das auch auf die von mir verwendeten 
Teile kürzen - allerdings gab es da bis dato ja auch IMMER Beschwerden 
:-)

Nochmal - Ziel wäre es im Moment, einfach mal überhaupt eine Messung im 
Basic mode hinzukriegen. Langfristig wäre ja auch der Average Mode etc 
super interessant, aber deswegen erstmal ein Schritt zurück.
1
void ADCC_Initialize(void)
2
{
3
   
4
    // set the ADCC to the options selected in the User Interface
5
    // ADDSEN disabled; ADGPOL digital_low; ADIPEN disabled; ADPPOL VSS; 
6
    ADCON1 = 0x00;
7
    // ADCRS 0; ADMD Basic_mode; ADACLR disabled; ADPSIS ADFLTR; 
8
    ADCON2 = 0x00;
9
    // ADCALC First derivative of Single measurement; ADTMD disabled; ADSOI ADGO not cleared; 
10
    ADCON3 = 0x00;
11
    // ADACT disabled; 
12
    ADACT = 0x00;
13
    // ADAOV ACC or ADERR not Overflowed; 
14
    ADSTAT = 0x00;
15
    // ADCS FOSC/128; 
16
    ADCLK = 0x3F;
17
    // ADNREF VSS; ADPREF VDD; 
18
    ADREF = 0x00;
19
    // ADCAP Additional uC disabled; 
20
    //ADCAP = 0x00;
21
    ADCAP = 0x1F; //Enable all PC-Caps??
22
    // ADPRE 0; 
23
    ADPRE = 0x00;
24
    // ADACQ 255; 
25
    ADACQ = 0xFF;
26
    // ADPCH ANA0; 
27
    ADPCH = 0x00;
28
    // ADRPT 0; 
29
    ADRPT = 0x00;
30
    // ADLTHL 0; 
31
    ADLTHL = 0x00;
32
    // ADLTHH 0; 
33
    ADLTHH = 0x00;
34
    // ADUTHL 0; 
35
    ADUTHL = 0x00;
36
    // ADUTHH 0; 
37
    ADUTHH = 0x00;
38
    // ADSTPTL 0; 
39
    ADSTPTL = 0x00;
40
    // ADSTPTH 0; 
41
    ADSTPTH = 0x00;
42
    
43
    // ADGO stop; ADFM right; ADON disabled; ADCONT disabled; ADCS FRC; 
44
    ADCON0 = 0x14;
45
    
46
47
}
48
49
bool ADCC_IsConversionDone()
50
{
51
    // Start the conversion
52
    return (!ADCON0bits.ADGO);
53
}
54
55
adc_result_t ADCC_GetConversionResult(void)
56
{
57
    // Return the result
58
    return ((ADRESH << 8) + ADRESL);
59
}
60
61
    //Returns the value of ADSTATbits.ADLTHR bit.
62
    return ADSTATbits.ADLTHR;
63
}
64
65
uint8_t ADCC_GetConversionStageStatus(void)
66
{
67
    //Returns the contents of ADSTATbits.ADSTAT field.
68
    return ADSTATbits.ADSTAT;
69
}
70
71
//Wird im 1ms zyklus aufgrufen, um wirklich 
72
//jegliches Prechargen abzuschließen
73
74
void proc_ADCC(void) {
75
    unsigned static char state = 0;
76
    
77
    switch (state) {
78
        case 0: 
79
            // select the A/D channel
80
            ADPCH = BAT_AN_IN;  
81
            state++;
82
            break;
83
        case 1: 
84
            // Turn on the ADC module
85
            ADCON0bits.ADON = 1;
86
            // Start the conversion
87
            ADCON0bits.ADGO = 1;
88
            state++;
89
            break;
90
        case 2: 
91
            if(ADCC_IsConversionDone()) {
92
                ADCON0bits.ADON = 0;
93
                adc_bat_an_in = ADCC_GetConversionResult();
94
                state=0;
95
            }   
96
    }
97
}

von Witkatz :. (wit)


Lesenswert?

Jacko schrieb:
> Was ist an deiner Messung so Besonderes, dass sie 28
> unübersichtliche Funktionen braucht, statt 3...5?

Der MCC generiert nun mal ~28 Funktionen. Man könnte 
ADCC_GetSingleConversion() statt der kompletten Statemachine benutzen, 
aber das ist mehr oder weniger Kosmetik. Wichtiger wäre die Frage, ob 
ADCC_Initialize() aufgerufen wird.

Ich würde auch mit dem Scope auf die VDD und RA3 gegen beide Vss 
schauen. Und zwar nicht irgendwo in der Schaltung, sondern direkt an den 
Pins. Es kann ja auch z.B. eine kalte Lötstelle zwischen einem "saven" 
Signal und dem Pin liegen.
Und was hast du mit den unbeschalteten PINs gemacht?

von Achim S. (Gast)


Lesenswert?

maschinell generierten Code zu debuggen ist immer ein besonderes 
Vergnügen. Vielleicht findest du einen simplen (menschenerzeugten) 
Beispielcode in einem Tutorial, den du ausbauen kannst.

Zu deinem aktuellen Code fällt mir beim groben Drüberschauen als 
mögliche Fehlerursache ein: hat deine Ergebnisvarible den richtigen 
Datentyp? Obwohl dein Codeschnipsel riesig ist sehe ich weder, wie 
adc_result_t noch wie adc_bat_an_in definiert sind.

von Cerberus (Gast)


Lesenswert?

Dirk K. schrieb:
> Wenn da wirklich NUR ein Poti dran ist ->

So eine Behauptung hat keinen Aussagewert.
Wie genau ist das Poti den angeschlossen?

von Klaus (Gast)


Lesenswert?

Nur so eine Frage: warum schaltest du den ADC dauernd an und aus? Da 
gibts doch bestimmt irgendwelche Empfehlungen, wie lange man nach dem 
Einschalten warten soll, bis sich der ADC stabilisiert hat. Ich hab auch 
keine Vorstellung, ob dein Precharge des Samplekondensators überhaupt 
zählt, wenn der ADC aus ist.

PIC-Besitzer schrieb im Beitrag #5100156:
1
>     switch (state) {
2
>         case 0:
3
>             // select the A/D channel
4
>             ADPCH = BAT_AN_IN;
5
>             state++;
6
>             break;
7
>         case 1:
8
>             // Turn on the ADC module
9
>             ADCON0bits.ADON = 1;
10
>             // Start the conversion
11
>             ADCON0bits.ADGO = 1;
12
>             state++;
13
>             break;
14
>         case 2:
15
>             if(ADCC_IsConversionDone()) {
16
>                 ADCON0bits.ADON = 0;
17
>                 adc_bat_an_in = ADCC_GetConversionResult();
18
>                 state=0;
19
>             }
20
>     }
Und zum ausprobieren muß man doch nicht so einen Aufriss machen:
1
    ADCON0bits.ADON = 1;  // eigentlich am Ende von init
2
    ADPCH = BAT_AN_IN;
3
    __delay_us(50);
4
    ADCON0bits.ADGO = 1;
5
    while(ADCON0bits.ADGO) {
6
       ;
7
    }
8
    adc_bat_an_in = (ADRESH << 8) | ADRESL;

Wenn das dann funktioniert, kann man sich damit beschäftigen das delay 
zu optimieren.

Mfg Klaus

von Witkatz :. (wit)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5100156:
> //ADCAP = 0x00;
>     ADCAP = 0x1F; //Enable all PC-Caps??

Du schaltest den kapazitiven Spannungsteiler ein. Mach das mal aus.

Klaus schrieb:
> __delay_us(50);
>     ADCON0bits.ADGO = 1;
>     while(ADCON0bits.ADGO) {

__delay braucht er nicht wegen ADACQ = 0xFF; Das bewirkt eine 
automatische Acquisition Time in jedem Messzyklus, in dem Fall 433.5µs 
also mehr als ausreichend.

von Dirk K. (knobikocher)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5100115:
> Wie willst du mir
> helfen, wenn du nicht Mal lesen kannst?

Lesen kann ich. Wie soll dir geholfen werden, wenn du keine Schaltpläne 
zeichnen kannst? Dort ist kein Poti eingezeichnet.

Siehe:

Cerberus schrieb:
> So eine Behauptung hat keinen Aussagewert.
> Wie genau ist das Poti den angeschlossen?

PIC-Besitzer schrieb im Beitrag #5100115:
> In zig Anwendungen mit alten
> Pics ohne Zusatzkomponenten gemacht. Notfalls Softwarefilter dahinter,
> mit dem ADCC Average Mode. Selbst ohne zuckt da vll das LSB. Wieso zig
> Kondensatoren auflöten? Machen kaum mehr Geräte - wenn auch aus
> Kostengründen.

Nyquist-Shannon-Abtasttheorem

PIC-Besitzer schrieb im Beitrag #5100115:
> Aber was will man erwarten, bei so ner sinnfreien
> Antwort.

Ab hier habe ich aufgehört zu lesen. Ich wünsche dir nicht viel Erfolg.

von Peter D. (peda)


Lesenswert?

Man kann es mit der Funktionswut aber auch übertreiben.
So einen Code würde ich beim Review aber sowas von um die Ohren gehauen 
kriegen. Daß Dir da keiner helfen kann, verstehe ich.
Mach nen maximal 10-Zeiler ohne Unterfunktionen draus, damit das auch 
lesbar ist.

von Peter D. (peda)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5098811:
> // Conversion finished, return the result
>     return ((ADRESH << 8) + ADRESL);

Den PIC kenne ich nicht, aber beim AVR muß man die Reihenfolge beachten 
und die ist in diesem Ausdruck unbestimmt. Das ist daher kein sauberes 
C.

Beim AVR gibt es neben ADCL und ADCH auch ADCW. ADCW ist 16Bit und der 
Compiler kümmert sich automatisch um den richtigen Zugriff.

von Klaus (Gast)


Lesenswert?

Peter D. schrieb:
> Den PIC kenne ich nicht, aber beim AVR muß man die Reihenfolge beachten

Die Register ADRESH und ADRESL kannst du in beliebiger Reihenfolge und 
beliebig oft lesen, auf jeden Fall solange der ADC steht. Und das wird 
davor abgeprüft "while(ADCON0bits.ADGO)".

Dirk K. schrieb:
> Nyquist-Shannon-Abtasttheorem

Bei einem quasistationären Signal von einem Poti? Nyquist nicht 
verstanden, sondern nur mal aufgeschnappt, wenn sich Experten 
unterhalten?

MfG Klaus

von Witkatz :. (wit)


Lesenswert?

Peter D. schrieb:
> Beim AVR gibt es neben ADCL und ADCH auch ADCW. ADCW ist 16Bit

Gibts bei XC8 auch: ADRES
In der PIC18F26K40.h definiert, die über xc.h automatisch includiert 
wird:
1
extern volatile unsigned short ADRES @ 0xF63;

: Bearbeitet durch User
von Dirk K. (knobikocher)


Lesenswert?

Klaus schrieb:
> Bei einem quasistationären Signal von einem Poti? Nyquist nicht
> verstanden, sondern nur mal aufgeschnappt, wenn sich Experten
> unterhalten?
>
> MfG Klaus

Quasistationär? Woher die Annahme? Warst du bei ihm? Ansonsten: 
Glaskugel.

Vielleicht ist das Poti einfach viel zu hochohmig und er empfängt Radio. 
Leitungslänge zwischen Poti und ADC? Radio ist vielleicht auch für sein 
Oszi zu hochfrequent. Davon abgesehen, ist immer noch unklar, wie das 
angebliche Poti angeschlossen ist.

Aufgrund meiner Bildung bin ich ausreichend informiert über das Thema ;)

Ich hatte schon ein krass gestörten I²C Bus gehabt. Alles "richtig" 
angeschlossen. Im Signalverlauf waren trotzdem unerklärliche 
Pegelwechsel gewesen. Ursache war letztendlich ein GSM-Modem. Für das 
verwendete Oszi zu hochfrequent, es stellte nur den gestörten I²C Bus 
mit "rechteckigen" Signalen dar. Immer wenn der Sendeburst vom Modem 
kam, war der Pegel auf unter 1V. Scheinbar ;) Abhilfe war, die Leitungen 
mit entsprechendem LC Filter gegen hochfrequente Signale zu filtern. Ein 
einfaches Poti hat das, meines Wissens nach, nicht eingebaut.

von Klaus (Gast)


Lesenswert?

Dirk K. schrieb:
> Quasistationär? Woher die Annahme? Warst du bei ihm? Ansonsten:
> Glaskugel.

Nein, ich kann mir aber vorstellen, wie schnell man ein Poti verstellen 
kann.

Dirk K. schrieb:
> Ich wünsche dir nicht viel Erfolg.

Darauf erspar ich mir einen Kommentar

MfG Klaus

von Dirk K. (knobikocher)


Lesenswert?

Klaus schrieb:
> Nein, ich kann mir aber vorstellen, wie schnell man ein Poti verstellen
> kann.

Mir geht es nicht um die Eigenschaften eines Potentiometer an sich. 
Sondern um die möglichen Störungen. Z.B. durch hochohmigkeit. Oder durch 
falschen Anschluss. Oder durch falsche Speisung. Nirgends ist für uns 
nach zu vollziehen, wie das Ding angeschlossen ist.

Nur: hier ist ein unvollständiger Schaltplan, ich habe da mal etwas 
angeschlossen. Geht nicht wie erwartet.

Da sage ich als Hardware Entwickler halt: Schaltplan auf den korrekten 
Stand bringen, damit wir vollständige Informationen haben. Geht beim 
Code doch auch. Würdest du ihm helfen, wenn er nur Codeschnipsel zeigt?

Ok, so nett habe ich das nicht ausgedrückt. Schande über mein Haupt. 
Meine Mittagspause war kurz. Dennoch gehört es doch zur Netiquette, 
vollständige Information zu geben, oder irre ich mich?

Klaus schrieb:
> Darauf erspar ich mir einen Kommentar

Werde ich pampig angemacht, werde ich halt auch pampig.

Gute Nacht ihr Jäger der Elektronen

von Witkatz :. (wit)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5100115:
> Jungs, was is mit euch los? Wollt ihr mir helfen, dann fragt / sagt was
> ihr wissen wollt / ich tun soll. Ich mache jede Messung, beantworte
> Fragen, alles. Aber was soll euer dämliches Geklugscheiße, in welchem
> ihr in keinem Satz helft?! Man man man...

Und bist du besser? Tauchst als anonymer Gast auf, forderst sofortige 
Hilfe an, beschwerst dich lautstark, und dann... auf konkrete Nachfragen 
erfahrener, hilfsbereiter Mitdiskutanten gehst du gar nicht ein. Nachdem 
viele Leute sich Zeit genommen haben und jede Menge sachlicher Hinweise 
erarbeitet haben tauchst du ohne ein Wort ab. Man man man...

von PIC-Besitzer (Gast)


Lesenswert?

Hello,

zuerst entschuldigt die verspätete Antwort, ich war beruflich länger im 
Ausland. Zudem wollte ich erst eure Vorschläge abarbeiten, um mich dann 
wieder zu melden.

Fangen wir an:
@Dirk - sorry für meine zuerst raue Wortwahl. Aber wieso kann man nicht 
einfach gezielt Fragen stellen und nicht erst das zur Verfügung 
gestellte schlecht reden? Du willst wissen ob es hochohmig war? -> 
Antwort: Nein, es wurde mit 1k, 10k, 100k probiert. Willst du drei 
Schaltpläne? Es war NUR ein PIC und ein Poti.

Und das mit Nyquist war ja wohl ein schlechter Scherz ;)
Bzgl Radio: Selbst bei einem 100K oder gar MEG Poti müsste dann 
zumindest der niederohmige Potiteil stabile Signale liefern. Außer du 
sitzt auf dem Radiosender.

@Witzkatz, wie gesagt, sorry. Ich schreibe normal immer meine Lösungen 
rein.

... Wozu ich langsam komme ;)
Lustigerweise trat das Phänomen nicht mehr auf, als ich den Code für den 
ADCC mal selbst geschrieben habe. Sprich: Einfache 
Initialisierungsroutine, einfaches Basicsamplen. Ich habe dann über 
MCC/alten Code versucht, das Ganze wieder hinzukriegen bzw 
nachzustellen, aber das gelingt mir grad einfach nicht mehr. eventuell 
hat auch einfach ein anderes Modul reingefunkt, was ich währenddessen 
verändert habe. Fakt ist - vom 1k bis zum 100k Poti ist nun alles 
absolut fehlerfrei auslesbar. Danke dennoch für die Hinweise - manchmal 
sollte man dem MCC halt nicht trauen.

von S. R. (svenska)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5111588:
> Lustigerweise trat das Phänomen nicht mehr auf, als ich den Code für den
> ADCC mal selbst geschrieben habe.

Für alle anderen kannst du ihn ja mal hier posten... dann hilft das auch 
anderen, die in die gleiche Falle tapsen.

von PIC-Besitzer (Gast)


Lesenswert?

@S.R. mittlerweile ist es nun wieder MCC generiert (sagte ja - ich hab 
rumprobiert) und es geht auch damit ohne Probleme.

Ich vermute das Problem an ganz anderer Stelle in einem anderen 
Softwaremodul. Wenn ich die Tage Zeit habe, versuche ich mal über die 
MPLABX-History das Ganze nochmal nachzustellen, langsam finde ich es 
selbst interessant.

VG

von Dirk K. (knobikocher)


Lesenswert?

PIC-Besitzer schrieb im Beitrag #5111588:
> Aber wieso kann man nicht
> einfach gezielt Fragen stellen und nicht erst das zur Verfügung
> gestellte schlecht reden?

Netiquette. Dazu gibt es hier auch einen Link, den ich gerade nicht 
finde :(

PIC-Besitzer schrieb im Beitrag #5111588:
> Nein, es wurde mit 1k, 10k, 100k probiert

Ok. Nicht besonders hochohmig. Was noch fehlt: wie wird das Poti 
gespeist? Woher kommen die 3,3V? Ich vermute: Versorgung des PIC. Mit 
kompletten Schaltplan müsste niemand vermuten. Da das Problem aber nicht 
mehr auftritt, ist ein Plan nicht mehr notwendig.

PIC-Besitzer schrieb im Beitrag #5111588:
> Und das mit Nyquist war ja wohl ein schlechter Scherz ;)
> Bzgl Radio: Selbst bei einem 100K oder gar MEG Poti müsste dann
> zumindest der niederohmige Potiteil stabile Signale liefern. Außer du
> sitzt auf dem Radiosender

Kein Scherz. Muss ja nicht Radio sein. WLAN, Bluetooth, GSM. Das alles 
steckt in deinem Smartphone und stört. Da das Problem aber nicht mehr 
auftritt, war dies wohl nicht die Ursache.


Bei jeder AD-Wandlung spielt Nyquist eine Rolle. Lässt sich nicht 
vermeiden. Wenn kein Filter am Eingang des ADC ist, werde ich deshalb 
aufmerksam und verweise auf des Thema. Eben weil ich diese Erfahrung 
schon im Negativen Sinne machen durfte ;)

: Bearbeitet durch User
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.