Forum: Compiler & IDEs Strings in Array schreiben und in einer Zeile ausgeben


von Christian Bernhard (Gast)


Lesenswert?

Hallo Fachleute,

ich würde gerne viele Werte in ein Array schreiben und diese dann in 
einer Zeile ausgeben.

[code]

uint8_t position;
const char werte[32];


while(1)
{
position++;
adcval=werte[position];

uart_puts(&werte[0]);

}


muss man das ganze villeicht mit Funktionen aus der pgmspace.h machen?

lg Christian

von Klaus W. (mfgkw)


Lesenswert?

Hast du Grundkenntniisse in C?

von Blödmann (Gast)


Lesenswert?

>ich würde gerne viele Werte in ein Array schreiben und diese dann in
>einer Zeile ausgeben.

Kannst Du machen, aber warum willst Du die "vielen Werte" erst in ein 
Array schreiben? Du kannst die Werte auch jeweils einzeln ausgeben. 
Spart Speicherplatz.

Bist Du sicher das Du die Werte ausgeben willst und nicht eine ihnen 
entsprechende Folge von ASCII-Zeichen? Denke daran dass uart_puts im 
aufhört zu senden, wenn es auf eine '0' im String trifft.

Wozu ist das array als const deklariert? Warum inkrementierst Du 
position? Warum erst den Wert umspeichern und dann ausgeben? Wozu 
"&werte[0]" wenn es "werte" auch tut? Deutet alles darauf hin, das Du C 
nicht kannst.


>muss man das ganze villeicht mit Funktionen aus der pgmspace.h machen?

Wenn Du einen konstanten String ausgeben willst, der zur Compile-Zeit 
bekannt ist schon. Aber das willst Du ja garnicht. Wie kommst Du darauf?

von Blödmann (Gast)


Lesenswert?

Schreibfehler:

Denke daran dass uart_puts im
aufhört zu senden, wenn es auf eine '\0' im String trifft.

von Klaus W. (mfgkw)


Lesenswert?

... und daß hier eine Endlosschleife steht, in der position hartnäckig 
hochgezählt wird und mit werte[position] entsprechend hinter das Feld 
gegriffen wird (ok, irgendwann kommt man von unten wieder in das Feld 
hinein), adcval (wo definiert?) gar nicht verwendet wird, und eigentlich 
beim besten Willen nicht klar ist, was eigentlich gemacht werden soll.
Sonst ist aber alles soweit ok...

Vielleicht fehlt es ja auch nur an einer nachvollziehbaren 
Problemstellung?

von Christian Bernhard (Gast)


Lesenswert?

Ich möchte nur ein paar Werte über den ADC einlesen und die nacheinander 
in ein Array schreiben. Diese Sachen möchte ich dann noch nach 
Möglichkeit zur Kontrolle über den uart schicken.

der UART, ADC und I2C Bus funktionieren problemlos, ich weiß halt nur 
nicht, wie ich das mit dem array anstellen soll.

die Funktion für das adcval
1
uint16_t ADC_Read( uint8_t channel )
2
{
3
  // Kanal waehlen, ohne andere Bits zu beeinflußen
4
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
5
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
6
  while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
7
  return ADCW;                    // ADC auslesen und zurückgeben
8
}
9
10
adcval=ADC_Read(0);

Der Wert des ADC wird momentan so herausgegeben
1
char wertadc[16];
2
3
itoa(adcval, wertadc, 10);
4
  uart_puts("\r\n");
5
  uart_puts("Wert des ADC: ");
6
  uart_puts(&wertadc[0]);
7
  uart_puts("\r\n");

von Karl H. (kbuchegg)


Lesenswert?

Christian Bernhard schrieb:
> Ich möchte nur ein paar Werte über den ADC einlesen und die nacheinander
> in ein Array schreiben. Diese Sachen möchte ich dann noch nach
> Möglichkeit zur Kontrolle über den uart schicken.
>

Array anlegen und die Werte da nacheinander ablegen.
Ich versteh jetzt ehrlich gesagt auch noch nicht, wo da jetzt das große 
Problem sein soll. Jedes C-Lehrbuch lässt sich in einem der vorderen 
Kapitel des langen und des breiten über Arrays aus.

>
1
> uint16_t ADC_Read( uint8_t channel )
2
> {
3
>   // Kanal waehlen, ohne andere Bits zu beeinflußen
4
>   ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
5
>   ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
6
>   while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung
7
> warten
8
>   return ADCW;                    // ADC auslesen und zurückgeben
9
> }
10
> 
11
> adcval=ADC_Read(0);
12
> 
13
>

soweit so gut.

Also brauchst du erst mal ein Array.
Da ist zb eines
1
uint16_t adcValues[100];

darin können 100 ADC Werte zwischengelagert werden. Da es wahrscheinlich 
schlau sein wird, mitzuzählen, wieviele da jetzt schon drinnen sind, 
installieren wir gleich noch einen Zähler für diesen Zweck
1
uint16_t adcValues[100];
2
uint8_t  nrADCValues;

und wenn vom ADC ein neuer Wert kommt, dann wird er im Array hinten 
angefügt (SIcherheitshalber mit einer Abfrage, damit es zu keinem 
Überlauf kommt)
1
int main()
2
{
3
  ....
4
5
    if( nrADCValues < 100 ) {
6
      adcValues[ nrADCValues ] = ADC_Read(0);
7
      nrADCValues++;
8
    }
9
10
  ....
11
}

soweit so gut.

> Der Wert des ADC wird momentan so herausgegeben
>
>
1
> 
2
> char wertadc[16];
3
> 
4
> itoa(adcval, wertadc, 10);
5
>   uart_puts("\r\n");
6
>   uart_puts("Wert des ADC: ");
7
>   uart_puts(&wertadc[0]);
8
>   uart_puts("\r\n");
9
> 
10
>

das hat ja erst mal nichts damit zu tun, dass die Werte 
zwischengespeichert wurden. Die Werte vom ADC zu speichern, ist eine 
Sache. Sie auszugeben ist eine ganz andere Sache.

Dazu macht man sich am besten gleich mal eine Funktion, die EINEN Wert 
ausgeben kann. Egal wo der her kommt.
1
void uart_puti( uint16_t value )
2
{
3
  char buffer[10];
4
  itoa( value, buffer, 10);
5
  uart_puts( buffer );
6
}

und mit dieser Hilfsfunktion ist es jetzt ein leichtes, alle im Array 
gespeicherten Werte auszugeben
1
int main()
2
{
3
  ....
4
5
    if( nrADCValues < 100 ) {
6
      adcValues[ nrADCValues ] = ADC_Read(0);
7
      nrADCValues++;
8
    }
9
10
  ....
11
12
13
    for( i = 0; i < nrADCValues; ++i ) {
14
      uart_puts( "Wert " );
15
      uart_puti( i );
16
      uart_puts( " : " );
17
      uart_puti( adcValues[i] );
18
      uart_puts( "\r\n" );
19
    }
20
21
}

> der UART, ADC und I2C Bus funktionieren problemlos, ich weiß halt nur
> nicht, wie ich das mit dem array anstellen soll.

Vielleicht doch ein wenig weniger Copy&Paste Programmierung betreiben 
und dafür die Grundlagen erst einmal lernen?

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.