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


von Thorsten H. (imonkey)


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

von Falk B. (falk)


Lesenswert?

Quelltext?

von Thorsten H. (imonkey)


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

von Oliver (Gast)


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

von Falk B. (falk)


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

von Andreas K. (a-k)


Lesenswert?

> ADCR = 0xF1200B01

Wie kommst du auf diesen Wert?
Fxxxxxxx: undefinierte Bits

von Thorsten H. (imonkey)


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.

von Andreas K. (a-k)


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.

von Thorsten H. (imonkey)


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

von Thorsten H. (imonkey)


Lesenswert?

@ andy kaiser

alles gleich...

von Falk B. (falk)


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

von Andreas K. (a-k)


Lesenswert?

> alles gleich...

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

von Thorsten H. (imonkey)


Lesenswert?

mal so, mal so, halt

vielen dank an alle die geantwortet haben!
Thorsten Heimberg

von Falk B. (falk)


Lesenswert?

Nachtrag.

Der WinAVR läuft definiert in eine Endlosschleife.

MFG
Falk

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.