Forum: Mikrocontroller und Digitale Elektronik Daten aus zweidimensinoalen Array versenden


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Steff G. (steff_123)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert
in Zeile 21 steht das Semikolon an der falschen Stelle.

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.