www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC


Autor: Steffan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte für den ATmega128 einen Trigger programmieren (der ATmega hat 
nämlich nicht wie z.B. der ATmega16 eine Autotrigger Funktion)

Hierbei stoße ich auf etwas, was ich mir nicht erklären kann.
hier mal der Codeausschnitt:
#define ADC_RUN (_BV(ADEN)|_BV(ADSC) |_BV(ADFR)|_BV(ADIF)|_BV(ADPS2)|_BV(ADPS1) |_BV(ADPS0) ) //|_BV(ADPS0)
#define ADC_STOP 0x00
int16_t pegel=0;
int16_t pegel_null=0;
int16_t ADC_TRIGGER;
int ADC_WAIT_TIME;
ADC_WAIT_TIME=0;

do {
    ADCSRA = ADC_RUN;    
    while(bit_is_clear(ADCSRA, ADIF));
    ADC_TRIGGER = ADC- 32768;
    printf("ADC_TRIGGER= %5u\n", ADC_TRIGGER );
    if (ADC_WAIT_TIME < 50)
    {
      ADC_WAIT_TIME++;
      printf("ADC_WAIT_TIME= %5u\n", ADC_WAIT_TIME );
    }

  /*  
    else if ((ADC_TRIGGER >= (pegel_null+pegel)) || (ADC_TRIGGER <= (pegel_null-pegel)))
    {
      printf("...da war der Trigger\n");
      printf("Pegel= %5u\n", ADC_TRIGGER );
      goto run;
    }
  */  

} while(-1);
ADCSRA = ADC_STOP;


So, ich hoffe ich habe nichts wichtiges vom Code vergessen.
Der ADC bekommt eine externe Refferenzspannung von ca. 4,88V
Auf den ADC0 Kanal wird ein Offset von 2,44V gegeben.

Nun zu dem was mich verwundert:
Die else if ist zum Test auskommentiert, da der Trigger sonst auslöst.
Aber warum macht der das?
Wenn ich die Zeile
ADC_TRIGGER = ADC- 32768;
abändere in
ADC_TRIGGER = ADC;
Dann wird mir mit der printf Anweisung auf dem Monitor konstant und 
permanent der Wert 32768 ausgegeben.
Wenn ich allerdings die Zeile
ADC_TRIGGER = ADC- 32768;
so belasse, würde ich annehmen, dass über die printf Anweisung ständig 
eine 0 auf dem Monitor zu sehen sein müßte, aber statt dessen schleicht 
sich dort sporadisch eine 65472 ein. Und die löst dann natürlich die 
else if Anweisung aus, aber wo kommt die 65472 her bzw wie kommt die 
zustande?
Habe es auch schon in einzelnen Schritten versuche also:
ADC_TRIGGER = ADC- 32768;
ADC_TRIGGER = ADC_TRIGGER - 32768;
aber das hat auch nicht geholfen.

Ich hoffe das mir jemand helfen kann.

MFG

Autor: Steffan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich sollte wohl erst einmal
printf("ADC_WAIT_TIME= %5d\n", ADC_WAIT_TIME );

schreiben.

So, und irgendwie ist mir da wohl doch ein Fehler unterlaufen, es kommt 
doch der Wert 32704 und daraus wird dann -64
Ich denke mal, das dies das Rauschen des ADC ist denk
Wenn ich den Trigger also auf 65 setzt klappt es.

MFG

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ADC_TRIGGER = ADC- 32768;
>ADC_TRIGGER = ADC_TRIGGER - 32768;


ADC_TRIGGER ist eine VORZEICHENBEHAFTETE Zahl:

ALso Wertebereicht:                       -32768 ..  -1  .. 0 .. +32767
zugehoriger Inhalt der Speicherzelle:      65535 ..32768 .. 0 .. +32767

Das ADC Register ist einfach ein 16bit Register.
Negative Werte werden über das Vorzeichenbit (Bit15=1) dargestellt 
(Zweierkomplement).

Das bedeutet: Negative Werte werden im Register als (unsigned) Werte 
größer 32767 dargestellt....

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.