zweidimensionales Array auslesen


  • Mod

    Wade1234 schrieb:

    Warum? Es steht doch im Einklang mit

    SeppJ schrieb:

    genau wissen, warum [...] wo und welches Zeichen

    Allerdings.

    Im Gegensatz zu gewissen anderen Leuten propagiert Wade1234 keine gefährlichen Stümpertechniken, sondern erklärt(!) wie es richtig geht.

    👍 👍 👍



  • Wade1234 schrieb:

    Hat es einen besonderen Sinn, statt des Array die Adresse des 1. Elementes zu übergeben, wenn man sowieso das komplette Array ausliest?

    Der Name des Arrays ist die Adresse soviel ich verstanden habe und das erste Element des Arrays hat die selbe Adresse wie das Array, oder nicht?

    Zum Thema: Zeilenweise Spalte für Spalte durchgehen ist i.d.R. richtiges Vorgehen.

    Wenn du erst alle Elemente für den 1. Kanal, dann für den 2. Kanal usw. auslesen möchtest, ist das so korrekt.

    Wenn du natürlich erst den 1. Wert des 1. Kanals, dann den 1. Wert des 2. Kanals usw. auslesen möchtest, musst du die beiden Schleifen tatsächlich vertauschen.

    Also was ich möchte ist ein DMA Array mit 1027 Werten x 4, weil ich 4 Zeilensensoren habe mit 1027 Pixeln. Für mich ist es einfacher, wenn ich alle Werte von den Sensoren in ein Array speichere und daher dann auch nur eine DMA Zieladresse angeben muss, ansonsten muss ich bei Auslesen jedes einzelnen Sensors auch die DMA Zieladresse wechseln..

    Mein Problem ist eben, dass der Code so zum Auslesen nicht funktioniert. Ich wollte mal zuerst sichergehen, dass es nicht am Code liegt, bevor ich die Hardware unter die Lupe nehme.

    (Die Auslesefunktion habe ich ja bereits gepostet. Ich denke, der gewählte Name DMA_CHANNELS war ein wenig verwirrend. Der Code zum Auslesen ist nun angepasst.
    Ich nehme also an, dass mein j und i so stimmt oder liege ich da falsch?
    Falls die DMA Init interessiert, ist diese unten angehängt.

    #define EPC_QUANTITY                                  4
    #define DATALENGTH                                 1027
    #define DMA_DATA_LEN                  (EPC_QUANTITY *DATALENGTH)
    
    static uint16_t dmaBuffer[EPC_QUANTITY][DATALENGTH]; 
    
    void ReadOutIntArray()
    {   
        for (uint16_t j = 0; j < EPC_QUANTITY; j++)
        {
          for (uint16_t i = 0; i < DATALENGTH; i++)
          {             
            adcValue = dmaBuffer[j][i];
            USART_Transmit_Int(adcValue);
            USART_sendChar('\n');
            for (count = 0; count <= 50000; count++);
          } 
        }
    }
    
    #include "dma.h"
    #include "config.h"
    
    /*
      ==============================================================================
                          ##### DMA1 features #####
      ==============================================================================
    */
    
    void Init_DMA_ADC1(uint16_t DataLength, uint16_t* dma_buffer) 
    {                                                                    
      __HAL_RCC_DMA1_CLK_ENABLE();                                                 /* DMA1 CLK einschalten*/
    
      /* Peripheral DMA init for ADC*/
    
      uint32_t SrcAddress = (ADC1_BASE + 0x40);                                    // ADC Datenregisteradresse als Sourceadresse angeben --> Offset--> DR = 0x40   
    
      hdma_adc1.Instance = DMA1_Channel1;                                          // Channel 1 auf ADC1 gemappt page 288
      hdma_adc1.Instance->CPAR = SrcAddress;                                       // Oben definierte Sourceadresse angeben
      hdma_adc1.Init.Request = DMA_REQUEST_0;                                      // Request 0 (only for ADC1) page 288
      hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;                             // Angabe der Richtung von wo nach wo der DMA die Daten speichern soll
      hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;                                 // Zeiger der Peripherieadresse soll nicht inkrementiert werden
      hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;                                     // Zeiger der Memoryadresse inkrementieren
      hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;                // 16-bits, halfword
      hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;                   // 16-bits, halfword
      hdma_adc1.Init.Mode = DMA_CIRCULAR;                                          // konvertiert kontinuierlich --> Normal mode wäre = DMA One shot mode
      hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;                            // Priorität setzen
      hdma_adc1.Instance->CNDTR = DataLength;                                      // Datenlänge des DMA Buffers definieren
    
      hdma_adc1.Instance->CMAR = (uint32_t) dma_buffer;                            // Die DMA Zieladresse angeben bzw. definieren
    
      if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
      {
        Error_Handler();
      }
    
    /*
        ###  ADC1 NVIC Konfiguration für den DMA1_Channel1_IRQn - ADC Channel  ###
      ==============================================================================   
    */
      HAL_NVIC_SetPriority(DMA1_Channel1_IRQn,5,1);
      HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); 
    
    }
    



  • Mod

    glrookie schrieb:

    Vielleicht hilft Dir ja diese mentale Stuetze:

    http://2.bp.blogspot.com/-SXMbF3iVB2s/VDjpPwGSGUI/AAAAAAAACB0/u-0QSuneaaA/s1600/two-dimensional-array-in-java.png

    Deine tolle Stütze ist vollkommener Unsinn. Erstens ist es für eine andere Sprache; zweitens für eine andere, ganz spezielle Situation; drittens ist es syntaktisch falsch; viertens ist es inhaltlich falsch.

    An alle Leser: Den Link unbedingt ignorieren!



  • buell schrieb:

    Ich nehme also an, dass mein j und i so stimmt oder liege ich da falsch?

    Wie sehen denn die Daten aus, die du ausliest und woran machst du fest, dass die Mist sind?

    Btw, an der Init-Funktion kann es natürlich auch liegen. Dazu müsstest du der geneigten Leserschaft hier mal mitteilen, was du für einen Controller benutzt.

    Und sicherlich gibt es auch (vom Hersteller) Beispiele für den Betrieb des DMA-Features.

    Nachtrag: Sieht aus wie ein ST-Typ. frag doch mal dort: https://community.st.com/welcome 😋



  • Fricky667 schrieb:

    buell schrieb:

    Ich nehme also an, dass mein j und i so stimmt oder liege ich da falsch?

    Wie sehen denn die Daten aus, die du ausliest und woran machst du fest, dass die Mist sind?

    Btw, an der Init-Funktion kann es natürlich auch liegen. Dazu müsstest du der geneigten Leserschaft hier mal mitteilen, was du für einen Controller benutzt.

    Und sicherlich gibt es auch (vom Hersteller) Beispiele für den Betrieb des DMA-Features.

    Nachtrag: Sieht aus wie ein ST-Typ. frag doch mal dort: https://community.st.com/welcome 😋

    [quote="Fricky667"]

    buell schrieb:

    Nachtrag: Sieht aus wie ein ST-Typ. frag doch mal dort: https://community.st.com/welcome 😋

    Das habe ich schon gemacht. Hilfreich war das bisher nicht im STM forum.
    Ob die Daten Mist sind kann ich mir nicht vorstellen. Es ist der STM32L431RCI6.
    Der ADC und die DMA funktioniert. Ich hatte mit dem Entwicklungsboard NuCLEO vor einigen Wochen schon einen Test gemacht, bei dem ich einen Sinus mit Offset angelegt habe und die Messung auch richtig war.

    Beim neuen Board habe ich die Schnittstelle, die ich zuvor am Nucleo hatte nicht mehr und muss nun einen Zwischenstecker RS323 auf USB nutzen, um die Daten mit dem HTerm Tool sichtbar zu machen.

    Die Werte werden nach dem Belichten und Triggern des ADCs in den Speicher gelegt. Irgendwie scheinen mir die Werte zu niedrig. Es sind irgendwelche Zahlen im Bereich 100-200 obwohl ich eine 12-bit ADC Auflösung habe.

    Naja, ich kann mit dem Code im HTerm keine Daten sichtbar machen. Jetzt weiss ich im Moment nicht wo der Fehler ist. Deshalb müsste ich mal wissen, ob so das Programm richtig ist. (Readoutfunktion)

    Hier die Bilder

    https://picload.org/view/rppldaci/signale.png.html

    https://picload.org/view/rppldacw/17-07-201711-18-55.png.html



  • buell schrieb:

    Naja, ich kann mit dem Code im HTerm keine Daten sichtbar machen. Jetzt weiss ich im Moment nicht wo der Fehler ist. Deshalb müsste ich mal wissen, ob so das Programm richtig ist.

    Das Programm ist dann "richtig" wenn es ohne Errors und Warnings compiled. Ob es dann allerdings tut was du willst, ist eine andere Frage.

    Ich würde erstmal vorschlagen, die Spannung am Eingang des ADC zu messen und die mit den digitalisierten Werten vergleichen. Bevor Spannungspegel usw. nicht passen, brauchste gar nicht erst auf die Software zu gucken. 🙂


  • Mod

    Fricky667 schrieb:

    buell schrieb:

    Naja, ich kann mit dem Code im HTerm keine Daten sichtbar machen. Jetzt weiss ich im Moment nicht wo der Fehler ist. Deshalb müsste ich mal wissen, ob so das Programm richtig ist.

    Das Programm ist dann "richtig" wenn es ohne Errors und Warnings compiled. Ob es dann allerdings tut was du willst, ist eine andere Frage.

    Wie lange willst du diesen Müll noch wiederholen? Bist du mit dieser einstellung noch nicht oft genug auf die Schnauze gefallen? Du widersprichst dir doch sofort selber: Ein Programm ist dann und nur dann richtig, wenn es fehlerfrei tut, was du willst. Compilierbarkeit ist minimale Grundvoraussetzung dafür, dass vielleicht eventuell eine darauf Chance besteht.



  • SeppJ schrieb:

    Bist du mit dieser einstellung noch nicht oft genug auf die Schnauze gefallen?

    Keineswegs. Dem Compiler etwas vorzusetzen das ihm schmeckt ist Pflicht. Alles was danach kommt ist die Kür.

    Zu meiner aktiven Zeit habe ich C-Code gefrickelt, der nach MISRA und MOST zertifiziert war. Hätten die Jungs gewusst wie das Zeug entstanden ist, hätten sie mich vermutlich totgeschlagen. 😃

    Ich muss allerdings gestehen, dass ich Nachrichtentechniker mit einer eher hardwarelastigen Ausbildung und Berufslaufbahn bin. Bei uns galt damals der Grundsatz: die beste Software ist keine Software. Aus betriebswirtschaftlichen Gründen war das aber damals schon mehr als zweifelhaft.

    SeppJ schrieb:

    Du widersprichst dir doch sofort selber: Ein Programm ist dann und nur dann richtig, wenn es fehlerfrei tut, was du willst. Compilierbarkeit ist minimale Grundvoraussetzung dafür, dass vielleicht eventuell eine darauf Chance besteht.

    Nicht ganz. Software muss zwar tun was du willst, aber darf außerhalb eines festglegten Definitionsbereichs durchaus versagen, wenn du dir der Konsequenzen bewusst bist.



  • Fricky667 schrieb:

    Keineswegs. Dem Compiler etwas vorzusetzen das ihm schmeckt ist Pflicht. Alles was danach kommt ist die Kür.

    also wenn du z.b. sowas wie "****wetterdaten" hast, dann musst du sehr wohl aufpassen, wie du die einzelnen speicherbereiche anwählst. der compiler wird dir dabei nicht helfen. 🙄

    Zu meiner aktiven Zeit habe ich C-Code gefrickelt, der nach MISRA und MOST zertifiziert war. Hätten die Jungs gewusst wie das Zeug entstanden ist, hätten sie mich vermutlich totgeschlagen. 😃

    zu deiner aktiven zeit? und denk mal darüber nach, ob du geld für etwas ausgeben würdest, wenn der programmierer so gearbeitet hat, wie du deine arbeit gerade schilderst.

    Ich muss allerdings gestehen, dass ich Nachrichtentechniker mit einer eher hardwarelastigen Ausbildung und Berufslaufbahn bin. Bei uns galt damals der Grundsatz: die beste Software ist keine Software. Aus betriebswirtschaftlichen Gründen war das aber damals schon mehr als zweifelhaft.

    ja damals. die sache hat sich heute wohl etwas geändert. 🙄

    Software muss zwar tun was du willst, aber darf außerhalb eines festglegten Definitionsbereichs durchaus versagen, wenn du dir der Konsequenzen bewusst bist.

    wenn leute dadurch zu schaden kommen, bekommst du trotzdem die schuld und gehst mit pech ins gefängnis.



  • Wade1234 schrieb:

    zu deiner aktiven zeit? und denk mal darüber nach, ob du geld für etwas ausgeben würdest, wenn der programmierer so gearbeitet hat, wie du deine arbeit gerade schilderst.

    wenn ich mit dem produkt zufrieden bin, würde ich das tun.

    und tatsächlich habe ich schon software gekauft, weil sie einfach nur gut war. mir war es völlig egal, wie viele crackpfeifen sich die jungs reingezogen haben, als sie am coden waren.

    ja damals. die sache hat sich heute wohl etwas geändert. 🙄

    Das gebe ich unumwunden zu. Schon zu meiner Zeit (ja, hier bin ich wohl ein Anachronismus), wurden fette ARM-Cores eingesetzt, auf denen man einen Linux-Kernel unterbringen konnte, um Entwicklungskosten zu sparen. Das hat nicht selten die Stückkosten um ~10€ gesteigert, aber war immer noch für einen Betrieb durchschnittlich kostengünstiger als ein Softwareschreiber, der auch mal krank sein kann und Urlaubsanspruch hat.


  • Mod

    Fricky667 schrieb:

    Wade1234 schrieb:

    zu deiner aktiven zeit? und denk mal darüber nach, ob du geld für etwas ausgeben würdest, wenn der programmierer so gearbeitet hat, wie du deine arbeit gerade schilderst.

    wenn ich mit dem produkt zufrieden bin, würde ich das tun.

    Ich vermute, ich wäre als Kunde unzufrieden, wenn der Programmierer nicht einmal eine Zahl eingelesen bekommt, ohne dass das Programm dabei abstürzt. Egal wie toll der Schrott sich compilieren lässt.



  • SeppJ schrieb:

    Fricky667 schrieb:

    Wade1234 schrieb:

    zu deiner aktiven zeit? und denk mal darüber nach, ob du geld für etwas ausgeben würdest, wenn der programmierer so gearbeitet hat, wie du deine arbeit gerade schilderst.

    wenn ich mit dem produkt zufrieden bin, würde ich das tun.

    Ich vermute, ich wäre als Kunde unzufrieden, wenn der Programmierer nicht einmal eine Zahl eingelesen bekommt, ohne dass das Programm dabei abstürzt. Egal wie toll der Schrott sich compilieren lässt.

    Ist alles relativ. Ein Programm wie Reaper z.B. hat seine Entwickler reich gemacht, obwohl es mindestens ein Mal täglich abstürzt, wenn man es so benutzt, wie man es benutzen soll. Es ist eben alternativlos in den Augen der User.



  • Fricky667 schrieb:

    wenn ich mit dem produkt zufrieden bin, würde ich das tun.

    Ja aber würde der Betriebswirt oder der Lehrer das auch tun?

    und tatsächlich habe ich schon software gekauft, weil sie einfach nur gut war. mir war es völlig egal, wie viele crackpfeifen sich die jungs reingezogen haben, als sie am coden waren.

    Ja aber der "Durchschnitts-Kunde", der auf jeden noch so kleinen Fehler lauert, um Geld sparen zu können, macht das nicht. Der verlangt dann Nacharbeit und die kostet Geld und damit irgendjemanden den Arbeitsplatz, weil er hier gelesen hat, dass er ungenau arbeiten kann.

    Das gebe ich unumwunden zu. Schon zu meiner Zeit (ja, hier bin ich wohl ein Anachronismus), wurden fette ARM-Cores eingesetzt, auf denen man einen Linux-Kernel unterbringen konnte, um Entwicklungskosten zu sparen. Das hat nicht selten die Stückkosten um ~10€ gesteigert, aber war immer noch für einen Betrieb durchschnittlich kostengünstiger als ein Softwareschreiber, der auch mal krank sein kann und Urlaubsanspruch hat.

    Was?


Anmelden zum Antworten