www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Abtastrate ADC Signal nur alle 0,5 Sekunden


Autor: Bernhard Bauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mikrocontroller-Gemeinde,

ich habe meinen ADC am ATMega8 erfolgreich zum laufen gebracht, und
gebe den Wert am LCD-Display aus.
Durch die schnelle Abtastfrequenz von ca. 30kHz "flackert" aber das
letzte Bit leider. Ich brauche den Messwert nur zum Ablesen. Daher
wollte ich fragen:

Gibt es eine Routine, mit der man z.B. nur alle 0.2 Sekunden einen
ADC-Wert am Display ausgibt?

Verzögerungsschleifen habe ich in der ADC-Routine schon probiert,
brachten jedoch seltsamerweise keinen Erfolg.
Den ADC starte ich in einer Schleife manuell (ohne Interrupt) durch
setzen des ADSC Bit im ADCSRA-Register.
Vielen Dank schon mal für konstruktive Beiträge.

Gruß
Bernhard

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du solltest dir mal generell Gedanken machen wie du dein Programm
aufbaust. Man geht da typischerweise so vor das man einen Systemtimer
aufsetzt der jede Millisekunde (oder beliebigen andere Zeitspanne, je
nach Bedarf) einen Interrupt auslöst. Im INT erhöhst du eine 16 Bit
Variable. In der Hauptschleife setzt du jetzt eine Varible auf den
aktuellen Wert deines Systemtimers. In jedem Schleifendurchlauf prüfst
du ob der Systemtimer um n größer ist als der gespeicherte Wert. Wenn
dem so ist führst du deine Aktion aus und setzt deine Variable wieder
auf den Wert des Systemtimers. Also etwa so (von C beeinflußter
Pseudocode):

uint16_t ticks;

//Jede ms
SIGNAL(TIMER)
{
    ticks++;
}

void main(void)
{
    uint16_t event100ms = 0;
    uint16_t event500ms = 0;

    initTimer();
    enableInts();

    while(1)
    {
        //Do something all 100ms
        if((ticks - event100ms)>100)
        {
            event100ms = ticks;

            //Do the 100ms stuff
        }

        //Do something all 500ms
        if((ticks - event500ms)>500)
        {
            event500ms = ticks;

            //Do the 500ms stuff
        }
    }
}

Obigem Code fehlen natürlich noch ein paar Schutzvorrichtungen da 16
Bit Zugriffe auf AVRs nicht atomar sind aber so sollte man das
prinzipiell machen. Du leitest damit aus nur einem INT beliebige Zeiten
ab.

Matthias

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.