Forum: Mikrocontroller und Digitale Elektronik STM32 ADC Wandlungsergebnis auf verschiedenen Pins ausgeben


von Alexander M. (alex_777)


Angehängte Dateien:

Lesenswert?

Guten Tag liebe Community! Könnte mir bitte jemand mit folgender Aufgabe 
helfen?

von STK500-Besitzer (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Guten Tag liebe Community! Könnte mir bitte jemand mit folgender Aufgabe
> helfen?

Was hast du bis jetzt erzeugt?

von Alexander M. (alex_777)


Lesenswert?

while (1)
  {

    // Der ADC wird gestartet und misst den Wert auf adc1 (PIN A0)
    HAL_ADC_Start(&hadc1); // adc1 auf pin PA0 == A0
    HAL_ADC_PollForConversion(&hadc1, 10);
    // Der Wert von adc1 (Poti) wird ausgelesen und in value gespeichert
    value= HAL_ADC_GetValue(&hadc1);

}


Also ADC auslesen in einer Round Robin Struktur und in das Ergebnis in 
value speichern habe ich bis jetzt geschaft. Das Problem bei mir ist 
Ausgabe des Wandlungsergebnises auf Ports C0-C3.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Oleksandr S. schrieb:
> Also ADC auslesen in einer Round Robin Struktur

Du scheinst hier was zu verwechseln:
- https://de.wikipedia.org/wiki/Endlosschleife
- https://de.wikipedia.org/wiki/Round_Robin_(Informatik)

von Jan H. (jan_h74) Flattr this


Lesenswert?

Port C0-C3sind nur 4 bits, der AD Wandler gibt 10 bit aus. Wie ist das 
gedacht ? Nur den 4 obere bits ausgeben ?

von Erwin (Gast)


Lesenswert?

Aber wenn wir hier schon die Hausaufgaben von anderen machen, können 
doch wir alle etwas dabei lernen?

Wie sinnvoll ist das Beispiel überhaupt??

Denke die meisten von uns hätten das jetzt über einen Timer-Interrupt, 
drei Bitmasken und einen free-running ADC gelöst, aber was hat das mit 
Round Robin zu tun?

von Alexander M. (alex_777)


Lesenswert?

Round-Robin scheduling structure sieht so aus:
– Ring structure consisting of endless loop

int main(){
initialize_components();
while(1){
if(periphery1 requires svc){ doSvc1();}
if(periphery2 requires svc){ doSvc2();}
…
if(peripheryN requires svc){ doSvcN();}
}
}

von Alexander M. (alex_777)


Lesenswert?

Hallo Jan, es ist so gedacht , dass man nur das höchste ,das niedrigste 
und Bits 3 und 4 auf entsprechenden Ports (C0-C3) ausgeben mus. Also 
nicht das gesamte Wandlungsergebnis. Und ich weiß nicht wie ich das 
realieseren soll. Has du vielleicht einen Lösungsvorschlag?

von Thomas W. (Gast)


Lesenswert?

Moin, -

die Zauberworte sind Bit-Manipulationen mit & und |, z.B. 
https://www.mikrocontroller.net/articles/Bitmanipulation#Standard_C_3

Ueberlege bitte, wie Du einzelne Bits Deines ADC-Wortes maskieren 
kannst.

Diese Ueberlegungen mit AND, OR und XOR wirst Du immer brauchen.

Ueberlege bitte was ist 0x1234 & 0x0001?

Viele Gruesse

Th.

Oder:
https://www.c-howto.de/tutorial/variablen/bitmanipulation/

von Stefan F. (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Könnte mir bitte jemand mit folgender Aufgabe helfen?

Ich hoffe das niemand jetzt einfach deine Hausaufgabe erledigt und das 
Ergebnis präsentiert. Die Beantwortung einzelner Fragen, wie das hier 
begonnen wurde, ist der richtige Weg.

von Alexander M. (alex_777)


Lesenswert?

Ich hoffe dass dir in deinem Leben auch keiner hilft. Wer bist du um 
überhaupt irgendwas hier zu sagen? Wenn du nichts angemessenes zu sagen 
hast, spar lieber deine Zeit.

von was (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Ich hoffe dass dir in deinem Leben auch keiner hilft. Wer bist du um
> überhaupt irgendwas hier zu sagen? Wenn du nichts angemessenes zu sagen
> hast, spar lieber deine Zeit.

Willst du hilfe, oder was?

von Beo Bachta (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Wer bist du um überhaupt irgendwas hier zu sagen?

Mit "Frechheit siegt" kommt man hier gut weiter (?).

von Stefan F. (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Ich hoffe dass dir in deinem Leben auch keiner hilft. Wer bist du um
> überhaupt irgendwas hier zu sagen? Wenn du nichts angemessenes zu sagen
> hast, spar lieber deine Zeit.

Interessant. Mit der Einstellung hast du definitiv keine Hilfe verdient. 
Auch nicht von einem Autor, der im Laufe von 25 Jahren zahlreiche Bücher 
und Tutorials von Anfang an kostenlos veröffentlicht hat. So viel zur 
Frage, wer ich eigentlich bin.

von Helmut L. (helmi1)


Lesenswert?

Oleksandr S. schrieb:
> Ich hoffe dass dir in deinem Leben auch keiner hilft. Wer bist du um
> überhaupt irgendwas hier zu sagen? Wenn du nichts angemessenes zu sagen
> hast, spar lieber deine Zeit.

Hier wird eher Hilfe zur Selbsthilfe gegeben. Und Hausaufgaben fuer 
andere zu loesen ist hier nicht gerne gesehen.

von Alexander M. (alex_777)


Lesenswert?

Moment mal, ich habe niemanden gebeten, meine Hausaufgaben für mich zu 
machen, ich hatte nur an einer Stelle dieser Aufgabe ein Problem (siehe 
2. Kommentar). Warum ist es jetzt notwendig, wegen einer unauffälligen 
Person hier sinnlose Diskussionen zu veranstalten oder habt ihr heute 
nichts wichtigeres zu tun?

von wanoch (Gast)


Lesenswert?

naja kleiner dann mach mal.
ist immer gut, leute anzuscheissen und auf input zu warten.Hat sich 
bewährt

von Stefan F. (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Moment mal, ich habe niemanden gebeten, meine Hausaufgaben für mich zu
> machen

Warum kritisierst du dann, dass ich ebenfalls darum gebeten habe, es 
nicht zu tun?

von Alexander M. (alex_777)


Lesenswert?

Ich dachte wir befinden uns im Forum wo gegenseitig geholfen wird ? Wie 
würdest du reagieren, wenn du eine Frage hast und dann komme ich und 
sage "Hey Leute , hilft ihm nicht" ? Du hast einfach die Kommentare 
nicht aufmerksam gelesen und hast dir gedacht, dass hier jemand meine 
Hausaufgaben für mich machen soll, aber das stimmt gar nicht. Ich hatte 
eine konkrete Frage, aber naja  es ist schon dank dir vorbei.

: Bearbeitet durch User
von dummschwaetzer (Gast)


Lesenswert?

Du soltest deine Lesekompetenz verbessern!
>"Hey Leute , hilft ihm nicht"
hat Stefan nicht gesagt, ehr so "Heft ihm bei den Teilschritten"

Hättest du Stefans Tutorial gelesen wüstest du wie mann Pins 
setzt/löscht.

Aus den bisher gegebenen Informationen meiner Vorredner ist die Aufgabe 
eingentlich lösbar.
Bitte deine Lösung hier posten.
Oder wo hast du noch Probleme?

von Alexander M. (alex_777)


Lesenswert?

Hier ist meine Lösung, allerdings weiß ich nicht ob die korrekt ist
1
#include "main.h"
2
3
ADC_HandleTypeDef hadc1;
4
5
void SystemClock_Config(void);
6
static void MX_GPIO_Init(void);
7
static void MX_ADC1_Init(void);
8
9
int main(void)
10
{
11
  /* USER CODE BEGIN 1 */
12
  int value = 0;
13
  /* USER CODE END 1 */
14
15
  HAL_Init();
16
  SystemClock_Config();
17
  MX_GPIO_Init();
18
  MX_USART2_UART_Init();
19
  MX_ADC1_Init();
20
21
while (1)
22
  {
23
   
24
    HAL_ADC_Start(&hadc1); // adc1 auf pin PA0 == A0
25
    HAL_ADC_PollForConversion(&hadc1, 10);
26
    // Der Wert von adc1 (Poti) wird ausgelesen und in value gespeichert
27
     if (value & (1<<11))  { // höchstes Bit
28
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
29
30
   } else {
31
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
32
33
       }
34
    if (value & (1<<0)) { // niedrigstes Bit
35
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
36
37
      } else {
38
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
39
40
          }
41
    if (value & (1<<3)) { // 3 Bit
42
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
43
44
      } else {
45
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
46
47
          }
48
    if (value & (1<<4)) { // 4 Bit
49
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
50
51
      } else {
52
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
53
54
          }
55
56
  }
57
58
  }
59
60
/*Configure GPIO pin Output Level */
61
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
62
/*Configure GPIO pins : PC0 PC1 PC2 PC3 */
63
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
64
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
65
  GPIO_InitStruct.Pull = GPIO_NOPULL;
66
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
67
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

von Thomas W. (Gast)


Lesenswert?

Moin, -

MX_USART2_UART_Init()definiert und nicht benutzt und nicht benoetigt.

Du sollst Port c benutzen?

Wo kommen die Wert des ADC in (int)value?

Gruesse

Th.

von Alexander M. (alex_777)


Lesenswert?

Genau ich soll 4 Porte PC0 PC1 PC2 PC3 benutzen, die habe ich auch als 
GPIO Ausgänge definiert. Die "value" habe ich beim Kopieren tatsächlich 
vergessen.  Jetzt habe ich korrigiert.
1
#include "main.h"
2
ADC_HandleTypeDef hadc1;
3
void SystemClock_Config(void);
4
static void MX_GPIO_Init(void);
5
static void MX_ADC1_Init(void);
6
int main(void)
7
{
8
  /* USER CODE BEGIN 1 */
9
  int value = 0;
10
  /* USER CODE END 1 */
11
  HAL_Init();
12
  SystemClock_Config();
13
  MX_GPIO_Init();;
14
  MX_ADC1_Init();
15
while (1)
16
  {
17
   
18
    HAL_ADC_Start(&hadc1); // adc1 auf pin PA0 == A0
19
    HAL_ADC_PollForConversion(&hadc1, 10);
20
    value = HAL_ADC_GetValue(&hadc1);
21
    // Der Wert von adc1 (Poti) wird ausgelesen und in value gespeichert
22
     if (value & (1<<11))  { // höchstes Bit
23
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
24
   } else {
25
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
26
       }
27
    if (value & (1<<0)) { // niedrigstes Bit
28
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
29
      } else {
30
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
31
          }
32
    if (value & (1<<3)) { // 3 Bit
33
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
34
      } else {
35
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
36
          }
37
    if (value & (1<<4)) { // 4 Bit
38
         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
39
      } else {
40
           HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
41
          }
42
  }
43
  }
44
/*Configure GPIO pin Output Level */
45
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
46
/*Configure GPIO pins : PC0 PC1 PC2 PC3 */
47
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
48
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
49
  GPIO_InitStruct.Pull = GPIO_NOPULL;
50
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
51
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
52
53
}

: Bearbeitet durch User
von Thomas W. (Gast)


Lesenswert?

Moin, -

Oleksandr S. schrieb:
> vergessen.  Jetzt habbe ich korrigiert.

Nein.
1
     if (value & (1<<11))  { // höchstes Bit
2
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
3
   } else {
4
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
5
       }

Jetzt den Code in CubeIDE einkloeppern und compile.

Gruesse

Th.

von dummschwaetzer (Gast)


Lesenswert?

>HAL_GPIO_WritePin(GPIOA,...
du nimmst immer noch Port A staat C.
Und round robin ist das auch noch nicht.

von Alexander M. (alex_777)


Lesenswert?

Also der Code wurde kompiliert ,keine Fehlermeldungen

von Thomas W. (Gast)


Lesenswert?

Oleksandr S. schrieb:
> Also der Code wurde kompiliert ,keine Fehlermeldungen

Wenn Dir das reicht, die Daten werden trotzdem am flaschen Port 
ausgegeben.

Habe noch nicht fertig...

von Alexander M. (alex_777)


Lesenswert?

Ah ja sehe ich, GPIOC muss ich nehmen. Danke dir. Warum ist das kein 
Round Robin?
1
while (1)
2
  {
3
  
4
5
    HAL_ADC_Start(&hadc1); // adc1 auf pin PA0 == A0
6
    HAL_ADC_PollForConversion(&hadc1, 10);
7
    // Der Wert von adc1 (Poti) wird ausgelesen und in value gespeichert
8
    value = HAL_ADC_GetValue(&hadc1);
9
10
11
    if (value & (1<<11))  { // höchstes Bit
12
         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
13
      } else {
14
           HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
15
          }
16
       if (value & (1<<0)) { // niedrigstes Bit
17
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
18
         } else {
19
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
20
             }
21
       if (value & (1<<3)) { // 3 Bit
22
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
23
         } else {
24
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
25
             }
26
       if (value & (1<<4)) { // 4 Bit
27
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
28
         } else {
29
              HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
30
             }
31
32
  }

von Thomas W. (Gast)


Lesenswert?

Moin, -

ich hatte es Copy & Paste fehler gehalten, aber was willst Du mit diesem 
Teil machen:
1
>           }
2
>     if (value & (1<<4)) { // 4 Bit
3
>          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
4
>       } else {
5
>            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
6
>           }
7
>   }
8
>   }
9
> /*Configure GPIO pin Output Level */
10
>   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 
11
> GPIO_PIN_RESET);
12
> /*Configure GPIO pins : PC0 PC1 PC2 PC3 */
13
>   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
14
>   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
15
>   GPIO_InitStruct.Pull = GPIO_NOPULL;
16
>   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
17
>   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
18
> 
19
> }
20
>

also das Configure NACH dem while() das NIE ausgefuehrt wird.

Gruesse

Th.

von Alexander M. (alex_777)


Lesenswert?

Das sind die GPIO Einstellungen, die gehören zur MX_GPIO_Init Funktion

so musste das aussehen:
1
static void MX_GPIO_Init(void) {
2
/*Configure GPIO pin Output Level */
3
>   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 
4
> GPIO_PIN_RESET);
5
> /*Configure GPIO pins : PC0 PC1 PC2 PC3 */
6
>   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
7
>   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
8
>   GPIO_InitStruct.Pull = GPIO_NOPULL;
9
>   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
10
>   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
11
> 
12
> }

von dummschwaetzer (Gast)


Lesenswert?

> /*Configure GPIO pin Output Level */

>   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,

> GPIO_PIN_RESET);

> /*Configure GPIO pins : PC0 PC1 PC2 PC3 */

>   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;

>   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

>   GPIO_InitStruct.Pull = GPIO_NOPULL;

>   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

>   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

>

> }

ist doch eigentlich in der MX_GPIO_Init(void);
und nicht nach der Endlosschleife.

von Guido K. (Firma: Code Mercenaries GmbH) (thebug)


Lesenswert?

Was ich bei der Aufgabenstellung nicht verstehe ist, was Round Robin da 
zu suchen hat. Das ist doch keine Aufgabe mit konkurrierenden Prozessen.

von Stefan F. (Gast)


Lesenswert?

Guido K. schrieb:
> Was ich bei der Aufgabenstellung nicht verstehe ist, was Round Robin da
> zu suchen hat.

Vielleicht wird die Round-Robin Struktur in einer Folge-Aufgabe 
benötigt.

von Guido K. (Firma: Code Mercenaries GmbH) (thebug)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vielleicht wird die Round-Robin Struktur in einer Folge-Aufgabe
> benötigt.

Ja, vielleicht schon, aber ich wüsste jetzt nicht mal wie man bei einem 
linearen Algorithmus, also Wert lesen, Wert ausgeben, irgendwie einen 
Round Robin einbauen könnte. Es gibt keinen konkurrierenden Prozess, der 
Ablauf ist synchron und nicht nebenläufig.

von Gerald M. (gerald_m17)


Lesenswert?

Vielleicht soll er auch nicht auf das Ergebnis warten, sondern den ADC 
nur triggern.
Dann kann es passieren dass "jemand" zweites ein ADC Ergebnis haben 
möchte, noch bevor das Ergebnis der ersten Messung da ist. Es sollte 
also irgendwo ein FIFO geben welches die Anfrager verwaltet und eine 
Queue bildet.
So würde ich das interpretieren (und ist im Gegensatz zu dem Teil mit 
den Pins auch Praxisrelevant, auch wenn es normal eher eine 
Schnittstelle wie SPI o.ä. trifft).

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.