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.