Hallo zusammen, bin ein wenig rat los. Ich möchte über den ADC X Anzahl von Daten erfassen und danach erst mal auf auf ein paar led's ausgeben (und später über die uart ausgeben). Meine Probleme in der zweiten schleife zählt er die variable j um zwei hoch und der Simulator lässt mich nicht in die warte (schleife Unterprog.) und wenn ich mir im Watch die variablen anzeigenlassen will macht der das für die erste schleife aber nicht bei j. Grüße Manu und danke für eure Hilfe ------------------------------------------------------------------------ -- //Version001 #include <avr/io.h> #define TAKT 16000000UL int ADWandler(void); int warte(void); void Ausgabe(int x); int main(void){ DDRC=0xFF; //def. Out PortC DDRD=0xFF; //def. Out PortD int Daten=500; //Anzal messdaten erfassung while(1){ //Arbeitsschleife int y[500]; //arry vorbereitet fuer Messdaten 3200 Messungen for(int i=0;i<=Daten;i++){ //schleife1 zur erfassung der messdaten PORTD=y[i]; //Test Leuten an y[i]=ADWandler(); //Uprog. Daten messen und an y(arry index) uebergeben warte();} //Uprog. wartescheife 200*200*4 for(int j=0;j<=Daten;j++){//schleife2 zur ausgabe der gemessenen daten PORTC=(y[j]); //y(arry index) auslessen und auf protC ausgeben PORTD=0; //Test leuchten aus warte();} //Uprog. wartescheife 200*200*4 } return 0; } int ADWandler(void){ //ADC Uprog unsigned int x=0,ret=0; //var. deklariern ADMUX = (1<<REFS0)|(1<<ADLAR); //ADMUX Konfigurieren //Interne Ref. 5.0V und Links schiebend ADCSRA= (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADCSRA Konfigurieren //Voteriler 128;Starten; Einschalten // PORTD=255; //Test leuchten an loop_until_bit_is_clear(ADCSRA,ADSC);//warten bis messung zuende x=ADCL; //Low Reg = x x=ADCH; //High Reg = x ret=x; //ret = x return(ret); //ret zurückgeben } int warte(void){ //Warteschleife Uprog for(int i=0;i<=200;i++){ //Schleife1 200* for(int j=0;j<=200;j++){ //Schleife2 200* for(int k=0;k<=4;k++);}} //Schleife3 4 return 0; }
> warte();} // Uprog. wartescheife 200*200*4 > : > int warte(void){ //Warteschleife Uprog Diese Unterroutine funktioniert bestenfalls, wenn die Optimierung ausgeschaltet ist. Sonst wird die Funktion warte() (oder wesentliche Teile davon) einfach wegoptimiert, weil sie nichts am Programmablauf ändert (das zeitliche Verhalten wird nicht vom Programmablauf beschrieben!!). Wenn du eine Zeit willst, dann schalte die Optimierung ein und nimm das Makro _delay_ms()
Hallo Manu! Da i von 0 bis 500 geht, schreibst du über das array y[500] hinaus und überschreibst damit irgendeine Variable.Maximaler index wäre 499.Das Verhalten ist wie es so schön in Datenblättern steht "unpredictable" for(int i=0;i<=Daten;i++){ //schleife1 zur erfassung der messdaten PORTD=y[i]; //Test Leuten an y[i]=ADWandler(); //Uprog. Daten messen und an y(arry index) richtig ist: for(int i=0;i<Daten;i++){ Grüße Gebhard
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.