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
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.