www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC 2294 ad auslesen funktionen whileschleife C


Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich habe eine funktion geschrieben mit dem ich einen belibigen der 8 
kanäle des ad auslesen kann. Diese Funktion kann ich in einer while 
schleife beliebig oft laufen lassen und mir den wert über hyperterminal 
anzeigen lassen.
soweit so gut, möchte ich nun zwei kanäle nacheinander in der while 
schleife auslesen (funktion wird zweimal nacheinander 
aufgerufen)funktioniert es auch, aber die iterationszahl der schleife 
wird nicht eingehalten.
Die schleife läuft praktisch unendlich oft durch.
Lass ich den schleifenindex ausgeben, zeigt sich das die schleife selbst 
in einer unendlichen schleife steckt z.b:1 2 3 1 2 3 1 2 3 ...

wer weis rat?

beste grüße

thorsten heimberg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quelltext?

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quelltext main:

#include <stdio.h>                          /* I/O Functions */
#include <LPC22XX.H>                        /* LPC22XX Peripheral 
Registers */

extern void init_serial (void);

int sendchar (int ch);

long adout0 ();
long adout1 ();

//void delay (void)  {                        /* Delay Function */
//  unsigned long x;
//
//  for (x = 0; x < 400000; x++);
//}

int main (void) {

  int i=1;
  long a,b;
  double z;
  init_serial();                            /* Initialize Serial 
Interface */

  IODIR0 = 0x00000100;                      /* P0.8 defined as Output */

  while (i<=3)
  {

  IOCLR0 = 0x00000100;                    /* Turn LED On  (P0.8 = 0) */

  a=adout0();
//    delay();                                /* Delay */
  b=adout1();
//  a=i*2;
//  b=i+2;
  //z=(double)y/x;

//  printf ("wert0:\n");
  printf ("%d  %d  %d \n",i,a,b);

//  printf ("wert1:\n");
  //printf ("%d\n", y);

//  printf ("wert3:\n");
  //printf ("%f\n", z);

  IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) */

  i=i+1;

  }
}
......................................................
quelltext adout0:

//this funktion should read out the ad-converter on the
//lpc2294and return the obtained value to the main program

// channel 0

#include <LPC22XX.H>      /* LPC22XX Peripheral Registers */

long adout0 ()

{
// turn on the adc, input is ain0
long xy;

ADCR = 0xF1200B01;         //init adc
//ADCR = 0x01000000 ;      // start conversion

while (!(ADDR & 0x80000000));
xy = ADDR;
xy = xy & 0xFFC0;

xy =  xy >> 6;

ADCR = 0x040D0000;      //turn off ad

return xy;
}
...............................................................

quelltext adout1:

//this funktion should read out the ad-converter on the
//lpc2294and return the obtained value to the main program

// channel 1

#include <LPC22XX.H>      /* LPC22XX Peripheral Registers */

long adout1 ()

{
// turn on the adc, input is ain1
long x;

ADCR = 0xF1200B02;         //init adc
//ADCR = 0x01000000 ;      // start conversion

while (!(ADDR & 0x80000000));
x = ADDR;
x = x & 0xFFC0;

x =  x >> 6;

ADCR = 0x040D0000;

return x;
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, was genau passiert denn deiner Meinung nach, wenn die 
while-Bedingung false wird? Ich vermute doch, daß das Programm auf einem 
Mikrocontroller läuft, oder?

Oliver

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Thorsten Heimberg (imonkey)

>Die schleife läuft praktisch unendlich oft durch.
>Lass ich den schleifenindex ausgeben, zeigt sich das die schleife selbst
>in einer unendlichen schleife steckt z.b:1 2 3 1 2 3 1 2 3 ...

Naja, du beendest ja nach 3 Durchläufen die main() Funktion. Was dann 
passiert ist compilerabhängig.Einige halten die CPU in einer 
Endlosschleife, deiner macht möglicherweise einen Neustart. Versuchmal 
ein while(1); nach deiner While-Schleife. Dann sollte er definitiv nur 
dreimal druchlaufen und dann anhalten.

MfG
Falk

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ADCR = 0xF1200B01

Wie kommst du auf diesen Wert?
Fxxxxxxx: undefinierte Bits

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ oliver

ja das programm laüft, bei bisherigen schleifen ist es so das wenn die 
while-bed. false wird nichts mehr passiert und der µC neu gestartet 
werden muss um das programm erneut ablaufen zu lassen.

hier habe ich nun den eindruck das das main-programm selbst in einer 
schleife steckt; wenn die while-bed false wird startet das main programm 
erneut, obwohl es dazu eigentlich keinen anlass geben dürfte...?

rufe ich die funktion adout1 oder adout0 in der schleife nur einmal auf 
funktioniert es auch...also main wiederholt sich nicht endlos.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thorsten Heimberg wrote:

>  bei bisherigen schleifen ist es so das wenn die
> while-bed. false wird nichts mehr passiert und der µC neu gestartet
> werden muss um das programm erneut ablaufen zu lassen.

Gleicher Controller, gleicher Compiler, gleiche Startup-Routine?

Auf Controllern ist das Verhalten bei Verlassen der main() Funktion als 
undefiniert zu betrachten. Kann sein dort stoppt er, kann sein er 
startet neu, kann auch sein er spinnt.

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ falk

vielen dank falk soweit hattest du recht!
aber wieso loop er main unendlich wenn ich adout1 und adout0 
nacheinander aufrufe, und tut es nicht wenn ich nur adout1 oder adout0 
aufrufe?

beste grüße

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ andy kaiser

alles gleich...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Thorsten Heimberg (imonkey)

>aber wieso loop er main unendlich wenn ich adout1 und adout0
>nacheinander aufrufe, und tut es nicht wenn ich nur adout1 oder adout0
>aufrufe?

Keine Ahnung. Könnte mit den Stack zusammenhängen, ist aber eher Zufall. 
Vielleicht springt er zufällig an eine Stelle und bleibt in einer 
unkritischen Endlosschleife hängen. Sicher ist nur ein explizites 
while(1); am Ende von main().

MFG
Falk

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> alles gleich...

Tja, dann hast du eben den Vorzug genossen, zu lernen was "undefiniert" 
heisst.

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal so, mal so, halt

vielen dank an alle die geantwortet haben!
Thorsten Heimberg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag.

Der WinAVR läuft definiert in eine Endlosschleife.

MFG
Falk

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.