Forum: Mikrocontroller und Digitale Elektronik Zählschleifen


von Manu (Gast)


Lesenswert?

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;
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>     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()

von geb (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.