AD Wandlung wieso nur single conversation?

#874680
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
Gast #874690
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) ) {
     ;
  }
#874692
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...)
#874695
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...
Gast #874702
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
#874768
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren