Ich verstehe jetzt nicht, warum das Auslesen durch Drücken des Buttons
nicht mehr funktioniert, wenn lediglich der
ADC1_Channel_IN7 aktiv ist. Wenn ich diesen im ADC_init auskommentiere,
funktionierts wieder.
Könnte mir jemand weiterhelfen. Die Ports PA2 und PC13 haben miteinander
auch nichts zu tun. Ich zumindest sehe keinen Fehler.
Glaubst du nicht dass der Code für die DMA und ADC Initialisierung dafür
relevant wäre?
Warum benutzt du kein Array für die ganzen TIMxPIN Instanzen, durch
welches du dann einfach iterieren kannst anstatt den selben Code Zig mal
zu kopieren?
bingo schrieb:> Der Buffer ist 1027 lang> #define DataLength 1027> uint16_t dma0_buffer[DataLength];
Dann sollte dir hier was auffallen:
bingo schrieb:> for (uint16_t i = 0; i <= 1027; i++)
Dr. Sommer schrieb:> Glaubst du nicht dass der Code für die DMA und ADC Initialisierung> dafür> relevant wäre?> Warum benutzt du kein Array für die ganzen TIMxPIN Instanzen, durch> welches du dann einfach iterieren kannst anstatt den selben Code Zig mal> zu kopieren?
Hi Dr. Sommer
Ich dachte, dass dies nicht relevant wäre. Entschuldigen Sie mich für
den Irrtum. Die Dateien habe ich angehängt.
Basic Programmer schrieb:> bingo schrieb:>> Der Buffer ist 1027 lang>> #define DataLength 1027>> uint16_t dma0_buffer[DataLength];>> Dann sollte dir hier was auffallen:>> bingo schrieb:>> for (uint16_t i = 0; i <= 1027; i++)
Gleich nach deiner Frage habe ich den Fehler korrigiert und es zu i <
1027 abgeändert. Leider kein Erfolg
Dr. Sommer schrieb:> Glaubst du nicht dass der Code für die DMA und ADC Initialisierung> dafür> relevant wäre?> Warum benutzt du kein Array für die ganzen TIMxPIN Instanzen, durch> welches du dann einfach iterieren kannst anstatt den selben Code Zig mal> zu kopieren?
Uebrigens, ich finde deinen Ansatz eine sehr gute Idee, aber wenn ich
bereits eine Schleife drin gehabt hätte, hätte ich wahrscheinlich nicht
einmal erkannt, dass der Fehler am ADC Kanal IN7 liegt.
Ich optimiere den Code aber gerne, wenn dieser funktioniert.
Das ist doch verkehrt. Du kannst hier einen einzelnen Channel
übergeben, also z.B. ADC_CHANNEL_1. Das ist eine Channel -Nummer, und
keine Pin -Nummer. Wo ist dein DMA-Interrupt wo du auf Fertigstellung
reagierst?
1
ADC1->CFGR&=~ADC_CFGR_DMACFG;
Du schaltes den Continuous Mode aus, d.h. es werden alle Channels nur
einmal konvertiert? Warum greifst du überhaupt direkt auf die
Konfigurations-Register zu, wenn du vorher die HAL genutzt hast?
1
ADC1->SQR1&=~ADC_SQR1_L_0;
Du stellst 2 Channels ein, wo du doch vorher offensichtlich (aber
falsch) versuchst 8 Channels zu nutzen? Aber du setzt dennoch
1
hadc1.Init.ScanConvMode=ADC_SCAN_DISABLE;
um doch nur einen Channel zu konvertieren?
1
ADC1->CR&=~ADC_CR_ADSTART;
Du schaltest den ADC aus aber nicht wieder an?
Deine ADC-Konfiguration ist derart vermurkst, es ist ein Wunder dass da
überhaupt was passiert. Das hat auf jeden Fall nichts mit eventuellen
Problemen in deinem Anfangs-Code zu tun. Vielleicht solltest du dir
erstmal Gedanken machen was du genau machen willst, welche Abläufe dein
Programm nimmt, und das hier genau erläutern.
Hallo Dr. Sommer
Dr. Sommer schrieb:> Welche deiner drei ADC-Initialisierungen ist denn jetzt relevant,> Init_ADC1 oder Init_ADC1_Test_single oder Init_ADC1_Test_differential?> sConfig.Channel = ADC1_Channel_IN1.pin | ADC1_Channel_IN2.pin |> ADC1_Channel_IN3.pin | ADC1_Channel_IN4.pin | ADC1_Channel_IN7.pin |> ADC1_Channel_IN8.pin | ADC1_Channel_IN11.pin | ADC1_Channel_IN12.pin;> Das ist doch verkehrt. Du kannst hier einen einzelnen Channel> übergeben, also z.B. ADC_CHANNEL_1. Das ist eine Channel -Nummer, und> keine Pin -Nummer. Wo ist dein DMA-Interrupt wo du auf Fertigstellung> reagierst?
Sie haben völlig Recht. Ich habe die Änderungen vorgenommen und das File
nochmals angehängt.
> ADC1->CFGR &= ~ADC_CFGR_DMACFG;Du schaltes den Continuous Mode aus,> d.h. es werden alle Channels nur> einmal konvertiert? Warum greifst du überhaupt direkt auf die> Konfigurations-Register zu, wenn du vorher die HAL genutzt hast?
Ich hatte etwas probiert und war mir nicht sicher warum die Bits nicht
gesetzt wurden. Das Problem hat sich danach irgendwie selbst gelöst.
Ich habe die Zeilen auch nun entfernt.
Jedoch, um zB die Länge im SQR1 Register festzulegen, müsste ich auf
Registerebene zurückgreifen, auch wenn ich die HAL zuvor verwendet habe.
Dafür gibt es ja keine Funktion.
> ADC1->SQR1 &= ~ADC_SQR1_L_0;Du stellst 2 Channels ein, wo du doch vorher> offensichtlich (aber> falsch) versuchst 8 Channels zu nutzen? Aber du setzt> dennochhadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; um doch nur einen> Channel zu konvertieren?> ADC1->CR &= ~ADC_CR_ADSTART;Du schaltest den ADC aus aber nicht wieder> an?
Ich benötige den One Shot mode. Ich konvertiere immer nur einen Wert.
Der ADC wird getriggert, da ich diesen nur zu bestimmten Zeiten
benötige.
Stimmt die Länge benötige ich nicht, da Scanconvmode disabled ist.
Ich habe den Code entsprechend angepasst.
Den ADC starte ich später, wenn ich ihn benötige. Dies geschieht anfangs
im Main und später in den jeweiligen Interrupts etc.
>> Deine ADC-Konfiguration ist derart vermurkst, es ist ein Wunder dass da> überhaupt was passiert. Das hat auf jeden Fall nichts mit eventuellen> Problemen in deinem Anfangs-Code zu tun. Vielleicht solltest du dir> erstmal Gedanken machen was du genau machen willst, welche Abläufe dein> Programm nimmt, und das hier genau erläutern.
Kurz: Der ADC wird getriggert, nach jeder einzelnen Conversion sollte
die DMA die Daten wegschaufeln. Das funktioniert soweit.
Ich weiss schon was ich möchte, ich kann Ihnen leider nicht die ganze
Story erklären. Ich denke, es ist einfacher, wenn Sie mir die Fragen
direkt stellen. Ansonsten wird das hier nur eine Prosa.
Ich weiss schon, was ich tue und benötige. Die Einstellungen des ADC
jedoch ist eine andere Sache, aber ich habe da auch wieder dazugelernt.
Obwohl ich aber die Änderungen vorgenommen habe, scheint das mit dem
Button immer noch nicht zu funktionieren.