mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zählschleifen


Autor: Manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: geb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.