Forum: Mikrocontroller und Digitale Elektronik AD Wandlung wieso nur single conversation?


von Marco M. (marco1987)


Lesenswert?

Hi leute kann mir jmd sagen warum mein Atmega16 nur eine single 
conversation macht, obwohl ich im SFIOR bestimmt habe , dann er im 
Freilaufmodus arbeiten soll?



#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

int i;
uint16_t x;
uint16_t y;


int main ()
{
DDRA=0x00;
DDRB=0xFF;


SFIOR|= (0<<ADTS0) | (0<<ADTS1) | (0<<ADTS2);
ADMUX=MUX0;
ADMUX |= (1<<REFS1) | (1<<REFS0) ;
ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADSC);



while(1)
{


x = ADC;

y=((x*1024)/2.56) ;

PORTB=~y;


}
return 0;
}


danke

von Benedikt K. (benedikt)


Lesenswert?

Im SFIOR Register stellst du die Bedingung für den Autostart ein, 
eingeschaltet wird dieser aber im ADCSRA register.

von gast (Gast)


Lesenswert?

freilaufmodeus soll bestimmt heissen Free Running Mode:
hmm ADSC hast ja auf 1 im ADCSRA

woher kannst mal etwas mehr sagen, woran siehst du das nur 1 messung 
geht nd warum wqaartest du nciht bis er mit der messung fertig ist:
  while ( ADCSRA & (1<<ADSC) ) {
     ;
  }

von Johannes M. (johnny-m)


Lesenswert?

> SFIOR|= (0<<ADTS0) | (0<<ADTS1) | (0<<ADTS2);
Das ist überhaupt ziemlicher Unsinn. Gewöhne Dir das gar nicht erst an. 
Eine VerODERung mit einer Null bedeutet, dass der ursprüngliche Zustand 
erhalten bleibt! Und eine Null kannst Du so oft schieben wie Du willst, 
es bleibt immer eine Null. In diesem speziellen Fall stehen zwar vor 
der Anweisung nur Nullen im Register, weshalb es hier nicht schlimm ist, 
aber wenn da was Anderes steht, dann geht's schief!

Außerdem musst Du auch warten, bis der ADC mit der Wandlung fertig ist, 
und das dauert eine Weile (zumindest nach µC-Maßstäben)!

Außerdem macht der ADC eine conversion und keine conversation (oder 
unterhält er sich mit Dir? Dann könnte er Dir ja auch sagen, was Du 
falsch gemacht hast...)

von Johannes M. (johnny-m)


Lesenswert?

> y=((x*1024)/2.56) ;
Und das ist ebenfalls AUA. Bitte lies Dir den Artikel zum Thema 
Festkommaarithmetik durch. Gerade bei solchen Zahlen (2,56 ist 
schließlich 2^8 / 100) sollte man keine Gleitkommaakrobatik machen, 
zumal Du einfach mal überlegen solltest, was 1024/2,56 eigentlich ist... 
Ist zwar löblich, dass Du Dich an die Regel "Division als letzte 
Operation" hältst, allerdings ist das in diesem Fall kontraproduktiv, 
weil gar keine Division erforderlich ist.

Abgesehen davon spuckt der ADC einen Wert zwischen 0 und 1023 aus. 1023 
* 1024 ist aber ein bisschen arg viel für einen (unsigned) int...

von gast (Gast)


Lesenswert?

aus datenblatt:
Using the ADC Interrupt Flag as a trigger source makes the ADC start a 
new conversion as soon
as the ongoing conversion has finished. The ADC then operates in Free 
Running mode, constantly
sampling and updating the ADC Data Register. The first conversion must 
be started by
writing a logical one to the ADSC bit in ADCSRA

von Johannes M. (johnny-m)


Lesenswert?

Ach ja, Benedikt hat zwar schon drauf hingewiesen, aber Du musst 
natürlich auch das ADATE im ADCSRA setzen, sonst gibt's kein Free 
Running...

von Marco M. (marco1987)


Lesenswert?

Naja ich sehe das er nur eine Messung macht, weil ich die messung direkt 
an einen port ausgeben lassen und wenn ich erst zb 1,6 volt anlege dann 
leuchten entsprechend viele leds,
lege ich danach 0 V an, dann bleiben die leds an.
MFG

von Johannes M. (johnny-m)


Lesenswert?

Marco Müeller wrote:
> Naja ich sehe das er nur eine Messung macht, weil ich die messung direkt
> an einen port ausgeben lassen und wenn ich erst zb 1,6 volt anlege dann
> leuchten entsprechend viele leds,
> lege ich danach 0 V an, dann bleiben die leds an.
Aber Du hast hoffentlich mittlerweile verstanden, warum er nur eine 
Wandlung macht...

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.