Forum: Mikrocontroller und Digitale Elektronik Daten aus zweidimensinoalen Array versenden


von Steff G. (steff_123)


Lesenswert?

Hallo Leute,

ich bin seit ein paar Stunden am rumtüfteln, aber ich komm auf keinen 
grünen Zweig.

Hintergrund:
Ein DC-Motor (inkl. Encoder) wird mit einer konstanten Drehzahl 
gesteuert und es wird die Zeit zwischen zwei auftretenden Flanken 
bestimmt.

Der Zyklus wird i mal durchlaufen und es soll nacheinander die Differenz 
der beiden Zeitwerte (int) in ein zweidimensionales Array FELD 
geschrieben werden und später via UART an den PC geschickt werden.

Wenn ich das ganze mit nur einem Prüfzyklus probieren und somit nur ein 
eindimensionales Array habe, dann klappt das wunderbar.
Sobald ich aber ein mehrdimensionales Array verwende spuckt er mir am 
Terminalprogramm nur "Schrott" raus.

Das zweidimensionale Array habe ich mal mit von der Größe her so 
angenommen, damit es fürs erste von der Größe her passt.

Mein Codeausschnitt:
1
...
2
int Feld [2][2000] = {0};
3
4
for (int i=0;i<Anzahl;i++)
5
   {
6
    OCR1AL = n_soll[i];      // Motor ansteuern
7
    RESET_T4();
8
    RESET_T5();
9
    RESET_T3();
10
    k=0;      // Laufindex zum Beschreiben der Drehzahldaten
11
    
12
    
13
    while (counter4_OVERFLOW < Zeit[i]*5)    // Zeitdauer Zeit[i] des i-ten Prüfzykluses
14
    {
15
      
16
      if(counter5_OVERFLOW >= 2) // alle 20ms
17
      {
18
        diff_time = (counter2 - counter1);         
19
        Feld[i][k] = diff_time;                  // Ablegen der Zeitdifferenz im Drehzahlarray Feld
20
        k++;
21
        counter5_OVERFLOW = 0;
22
      }
23
      
24
    }
25
    y_dat[i] = k;                    // Anzahl der vorhandenen Drehzahl des i-ten Prüfzykluses in y_dat ablegen
26
    
27
  }
28
  
29
OCR1AL = 0; // Abbremsen des Motors
30
31
int gogo = Feld[0][0];
32
33
uart_puts( "N\n" );
34
char buffer1 [20];
35
itoa(gogo,buffer1, 10);
36
uart_puts(buffer1);
37
uart_puts( "\n" );
38
39
...
40
41
ISR(TIMER4_COMPA_vect) // Overflows Zeitdauer
42
{
43
  counter4_OVERFLOW++;
44
}
45
46
ISR(TIMER5_COMPA_vect) // Overflows Regelung
47
{
48
  counter5_OVERFLOW++;
49
}
50
51
ISR(INT0_vect) // Impulse zum detektieren der Zeitabschnitte
52
{
53
  counter1=counter2;
54
  counter2=TCNT3;
55
}

Bitte um Hilfe.

von Steff G. (steff_123)


Lesenswert?

Evtl. sollte ich meine Frage ein bisschen verkürzen:

Wenn meine erhaltenen Daten in ein eindimensionales Array geschrieben 
werden, dann werden die Werte richtig an die UART Verbindung ausgegeben.

Sobald ich jedoch die Werte in ein zweidimensionales Array packe, 
bekomme ich nur noch wirres Zeug raus.

Wäre um jede Hilfe dankbar.

von guest (Gast)


Lesenswert?

Steff G. schrieb:
> Evtl. sollte ich meine Frage ein bisschen verkürzen:

Eventuell solltest Du nicht nur irgendwelche sinnlosen Fragmente posten!
Z.B. welchen Wert hat 'Anzahl'? Wenn das >2 ist hast Du schon verloren.

von PittyJ (Gast)


Lesenswert?

Ich blick da nicht durch.
Da wird doch kein Feld verschickt, sondern buffer1.
Ich sehe nicht wo da was aus dem Feld entnommen wird. ist doch immer nur 
0,0
Noch nie so konfusen Code gesehen, bzw mindestens 30 Jahre her.

Und was ist mit RESET_T2. Das vermisse ich auch.

von Wolfgang (Gast)


Lesenswert?

Steff G. schrieb:
> Sobald ich aber ein mehrdimensionales Array verwende spuckt er mir am
> Terminalprogramm nur "Schrott" raus.

Was soll man mit der Fehlerbeschreibung anfangen?
Im Speicher sind die Daten immer linear angeordnet, d.h. dort liegt nur 
ein eindimensionales Array. Das kannst du einfach seriell übertragen und 
am Empfänger interpretierst du den Speicherinhalt wieder als Array. Da 
braucht man gar nicht groß rumzutricksen.

Wozu wurden eigentlich Pointer erfunden?

von genervt (Gast)


Lesenswert?

in Zeile 21 steht das Semikolon an der falschen Stelle.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Steff G. schrieb:
> int Feld [2][2000] = {0};

Hier werden schon mal knapp 8K RAM verballert.

Um welchen AVR handelt es sich?

von Walter K. (Gast)


Lesenswert?

"...
y_dat[i] = k;
..."

Was ist das? Wofür ist das Array? Woher kommt das?

Und die Frage von Guest nach der Variable Anzahl ist ja auch berechtigt.

von fop (Gast)


Lesenswert?

Hmmm... einiges an Quellcode - aber nicht das Senden des ganzen Arrays. 
Ich sehe nur, wie das erste Element des Arrays genommen wird, in Ascii 
gewandelt wird und dann gesendet wird. Da sollte es nun wirklich kaum 
Unterschiede machen, wie viele Dimensionen das Array hat.
In Sachen Senden muss ja nur die Zeile
1
int gogo = Feld[0][0];
 angepasst werden.
Füll Dein Array doch mal mit bekannten Konstanten, um zu sehen, ob das 
Messen oder das Senden Murks bauen - falls kein Debugger zur Hand, mit 
dem Du den Inhalt des Arrays anschauen kannst.

von Strukturdenker (Gast)


Lesenswert?

Was stellen denn die Daten im 2-dimensionalen Feld Dar? Warum nicht in 
einem einzigen, n-mal grösseren, eindimensionalen Feld?

Warum ist das senden nicht in einer Funktion gekapselt?

Warum muss im selben Codeabschnitt mit der Datenstruktur, mit 
Peripherieregister und mit Timers gleichzeitig hantiert werden?

  Ein bisschen Schichtung und Abstraktion bekommt dem Code, der Denke 
und dem Codelesen sicher gut!

von Limi (Gast)


Lesenswert?

- ein Trennzeichen für Spalten zB. ";"
- ein anderes Trennzeichen für Zeilen zB:"\r\n" (sind eigentlich zwei 
Zeichen, ein Windows-Rechner kommt damit besser klar)

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.