Abtastrate ADC Signal nur alle 0,5 Sekunden

Gast #255792
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
Persönliche Seite #255793
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):
1
uint16_t ticks;
2

3
//Jede ms
4
SIGNAL(TIMER)
5
{
6
    ticks++;
7
}
8

9
void main(void)
10
{
11
    uint16_t event100ms = 0;
12
    uint16_t event500ms = 0;
13

14
    initTimer();
15
    enableInts();
16

17
    while(1)
18
    {
19
        //Do something all 100ms
20
        if((ticks - event100ms)>100)
21
        {
22
            event100ms = ticks;
23

24
            //Do the 100ms stuff
25
        }
26

27
        //Do something all 500ms
28
        if((ticks - event500ms)>500)
29
        {
30
            event500ms = ticks;
31

32
            //Do the 500ms stuff
33
        }
34
    }
35
}

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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.