mikrocontroller.net

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


Autor: Marco M. (marco1987)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: gast (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Marco M. (marco1987)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

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.