Forum: Mikrocontroller und Digitale Elektronik ADC einschalten..welche Reihenfolge?


von Paul (Gast)


Lesenswert?

Hallo,
ich bekomme den ADC vom STM32F373 nicht zum laufen..
Muss ein der globale Interrupt eingeschaltet sein oder sowas oder stimmt 
die Reihenfolge nicht?
Er führt nicht mal die While Schleife aus, das Ergebnis ist immer 0 
statt 99
1
void adc_read_(int n){
2
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
3
SDADC1_CR1.B31 = 1; // Init ADC1
4
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
5
delay_ms(10);
6
ADC_CR2.B0 = 0;     //SIgma Delta ADC ausschalten
7
delay_ms(10);  // 100 Microsekunden Stabilisierung
8
SDADC1_CR2.B19=0;
9
SDADC1_CR2.B18=0;
10
SDADC1_CR2.B17=0;
11
SDADC1_CR2.B16=0;  //Wähle Kanal 1 von SDADC 1
12
SDADC1_CONF0R.B27 = 0; // set  26/26 auf 0 / 1 für single ended mode
13
SDADC1_CONF0R.B26 = 1; // set  26/26 auf 0 / 1 für single ended mode
14
// auf 11 setzten für Single endes Zero mode negativ ist dann auf GND
15
SDADC1_CR1.B17 = 1;
16
SDADC1_CR1.B31 = 0; // Init ADC1
17
SDADC1_CR1.B17 = 1;
18
delay_ms(10);
19
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
20
delay_ms(10);  // 100 Microsekunden Stabilisierung
21
SDADC1_ISR.B3=1;
22
SDADC1_CR2.B23=1; //Starte ADC Wandlung
23
while (SDADC1_ISR.B3 = 1) {
24
ADC_regular = 99;//SDADC1_RDATAR;
25
 }
26
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul schrieb:
> while (SDADC1_ISR.B3 = 1)
Du solltest dein C-Buch mal auf den Unterschied zwischen = und == 
befragen.

Paul schrieb:
> Er führt nicht mal die While Schleife aus
Wie stellst du das fest? Er müsste die Schleife eigentlich dauernd 
ausführen...

: Bearbeitet durch Moderator
von Frank (Gast)


Lesenswert?

1
while (SDADC1_ISR.B3 = 1)
2
{
3
  ADC_regular = 99;//SDADC1_RDATAR;
4
}

Dreh mal die Bedingung um, dann fällt dir vllt was auf.

von Paul (Gast)


Lesenswert?

Wieso fühlt man sich in diesem Forum eigentlich immer wie bei jeopardy?

Ok, a
slo müßte es wohl richtig heiteßn
while (SDADC1_ISR.B3 == 1) anstelle von while (SDADC1_ISR.B3 = 1)

Habe ich korrigiert..es kommt dennoch 0....

@Frank
Du meinst
while (SDADC1_ISR.B3 != 1)

Dann bleibt das Dispaly leer, hängt also in der While Schlefie 
fest..vermutlich(C Anfänger)

von Paul (Gast)


Lesenswert?

1
void adc_read_(int n){
2
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
3
SDADC1_CR1.B31 = 1; // Init ADC1
4
SDADC1_CR1.B10=1;
5
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
6
SDADC1_CR2.B23=1; //Starte ADC Wandlung
7
delay_ms(10);
8
SDADC1_CR2.B22=1; //CONTINOUS rEADING
9
delay_ms(10);  // 100 Microsekunden Stabilisierung
10
SDADC1_CR2.B19=0;
11
SDADC1_CR2.B18=0;
12
SDADC1_CR2.B17=0;
13
SDADC1_CR2.B16=0;  //Wähle Kanal 1 von SDADC 1
14
SDADC1_CONF0R.B27 = 0; // set  26/26 auf 0 / 1 für single ended mode
15
SDADC1_CONF0R.B26 = 1; // set  26/26 auf 0 / 1 für single ended mode
16
// auf 11 setzten für Single endes Zero mode negativ ist dann auf GND
17
SDADC1_CR1.B17 = 1;
18
SDADC1_CR1.B31 = 0; // Init ADC1
19
SDADC1_CR1.B17 = 1;
20
delay_ms(10);
21
ADC_CR2.B0 = 1;     //SIgma Delta ADC einschalten
22
delay_ms(10);  // 100 Microsekunden Stabilisierung
23
SDADC1_CR2.B23=1; //Starte ADC Wandlung
24
while (REOCF_bit == 0);
25
ADC_regular = SDADC1_RDATAR;
26
27
}
so gehts auch nach wie vor nicht...

von Frank (Gast)


Lesenswert?

Paul schrieb:
> Du meinst
> while (SDADC1_ISR.B3 != 1)
> Dann bleibt das Dispaly leer, hängt also in der While Schlefie
> fest..vermutlich(C Anfänger)

Das ist negieren.
Nein, ich meine so
1
while (1=SDADC1_ISR.B3)
2
{}

Dann würdest du vom Compiler hingewiesen werden dass da was nicht 
stimmen kann.

von Paul (Gast)


Lesenswert?

ok, habe ich ja jetzt geändert in
while (REOCF_bit == 0); also mit == REOCF_bit ist das gleiche

von Paul (Gast)


Lesenswert?

da er offenbar nie auf 0 umspringt startet die Conversion offenbar gar 
nicht :-(

von Eric B. (beric)


Lesenswert?

Wird die Funktion adc_read() überhaupt aufgerufen? Wenn ja, wie und wo?
Vielleicht springt dein uP schon vorher in reset...

von Paul (Gast)


Lesenswert?

doch das geht, wenn ich die While Schleife rausnehme, zeigt er 99
wenn ich bei
ADC_regular = 99;

schreibe

von Paul (Gast)


Lesenswert?

so gehts auch nicht :-(
1
void adc_init_16Bit(int n){
2
  ADON_bit =0; // ADC on/off
3
 SDAD1EN_bit =1;
4
INIT_SDADC1_CR1_bit = 1; // Init ADC1
5
delay_ms(10);
6
   SDADC1_CR2  = 0b00001100000000000000000000000001;
7
8
 //RCONT_bit =1; // use continius measurement
9
 //ADC1_CR1  := %00000000000000000000000000000000;
10
 REOCIE_bit=0;
11
 INIT_SDADC1_CR1_bit = 0; // Init ADC1
12
ADON_bit =1; // ADC on/off
13
}

1
int adc_read_16Bit(int n){
2
/*SDADC1_CR2.B19=0;
3
SDADC1_CR2.B18=0;
4
SDADC1_CR2.B17=0;
5
SDADC1_CR2.B16=0;  //Wähle Kanal 1 von SDADC 1 */
6
delay_ms(1);  // 100 Microsekunden Stabilisierung
7
RSWSTART_bit=1; //Starte ADC Wandlung
8
while (REOCF_bit == 0);
9
delay_ms(5);
10
adc16bit = SDADC1_RDATAR;
11
}

von Paul (Gast)


Lesenswert?

niemand eine Idee?

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.