Markus S. schrieb:
> Leider liest er aber immer nur einen ein!?
Woran siehtst du das? Und welcher ist es? Ich habe da so einen Verdacht.
> Was mache ich falsch?
Das ist der Fehler:
> SYSTICK_DelayMs(500);
Denn im Datenblatt im Kapitel "38.6.2.12 Automatic Sequences" steht ganz
klar, dass der Wandler gnadenlos weitertaktet und nach einem
Wandlungsende schnellstmöglich das gerade eben gewandelte Ergebnis
abgeholt werden muss. Wenn das nicht passiert, dann wird es
überschrieben:
1 | When a sequence starts, the Sequence Busy status bit in Sequence Status
|
2 | register (SEQSTATUS.SEQBUSY) will be set.
|
3 | When the sequence is complete, the Sequence Busy status bit will be cleared.
|
4 | Each time a conversion is completed, the Sequence State bit in Sequence
|
5 | Status register (SEQSTATUS.SEQSTATE) will store the input number from which
|
6 | the conversion is done. The result will be stored in the RESULT register,
|
7 | and the Result Ready Interrupt Flag (INTFLAG.RESRDY) is set.
|
Letztlich wandelt der also den ersten Kanal, schreibt das Ergebnis ins
RESULT Register und setzt das Interrupt-Flag. Dann geht es nebenher
weiter, er wandelt den zweiten Kanal, schreibt das Ergebnis ins RESULT
Register und setzt das Interrupt-Flag. Damit sind alle Kanäle gewandelt,
die Sequenz zu Ende und das SEQBUSY wird zurückgesetzt.
Und du hast dank deiner unnötigen halben Sekunde Tiefschlaf die Zeit
verplempert, währen der du das erste Ergebnis hättest holen können und
müssen.
Nicht ganz umsonst wird da für die zeitnahe Bearbeitung extra ein
Interrupt ausgelöst.
Probiers mal in die Richtung:
1 | while ( true )
|
2 | {
|
3 | ADC0_ConversionStart();
|
4 |
|
5 | while(!ADC0_ConversionStatusGet()) {}
|
6 | adc_count6 = ADC0_ConversionResultGet();
|
7 |
|
8 | while(!ADC0_ConversionStatusGet()) {}
|
9 | adc_count7 = ADC0_ConversionResultGet();
|
10 |
|
11 | sprintf(txData, "ADC 6 : 0x%03x - ADC 7 : 0x%03x", adc_count6 ,adc_count7);
|
12 |
|
13 | SERCOM1_USART_Write(txData, strlen(txData));
|
14 |
|
15 | /* Maintain state machines of all polled MPLAB Harmony modules. */
|
16 | SYS_Tasks ( );
|
17 |
|
18 | // Und wenns denn unbedingt sein muss, dann hier Zeit verplempern...
|
19 | }
|
> Was mache ich falsch?
Rein organisatorisch: du machst zu viele Threads für das selbe Thema
auf...