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?