Hallo!
Ich bin derzeit dabei ein Batteriebetriebenes Gerät zu entwerfen das
quasi eine eierlegende Wollmilchsau für verschiedene Anwendungen werden
soll.
Es handelt sich um einen 16mHz Mega32 bei 5V mit einem KS0108 GLCD aber
zukünftig soll ein Mega128 eingesetzt werden.
Das ganze in C mit dem AVR Studio als IDE.
Eine der Anwendungen ist ein schall getriggerter Timer für
intervallzeiten, auflösung 0.01 Sekunden, ähnlich diesem zum Beispiel:
http://www.cedhk.com/show.php/Object518
Mein erster Aufbau bestand aus einem OpAmp mit Poti zur einstellung des
Schwellwertes und einem FET am PortPin des AVR.
Wenn es laut genug wird schaltet der FET durch und eine Zeit wird
gestoppt.
Dann habe ich den OpAmp an den ADC angeschlossen mit fester verstärkung
um den Schwellwert digital über das Menü mit dem AVR ändern zu können.
In einer Schleife dann einfach jeweils eine einzelne Wandlung:
1 | if ( getADC(0) > threshold ) {
|
2 | bla;
|
3 | }
|
Funktioniert auch wunderbar, jetzt kommt das aber:
Ich möchte kontinuierlich die verbleibene/laufende Zeit auf dem Display
ausgeben und jede gestoppte Zeit per UART versenden.
Dabei tritt nun das Problem auf das auch schon vorher bestand aber
vernachlässigbar war, wenn der "ist-wert" über den schwellwert steigt
und der Controller gerade mit dem ausgeben auf das Display beschäftigt
ist gibt es natürlich einen ofset oder das Ereignis wird garnicht
registriert.
Nun kann ich ja den ADC kontinuierlich messen lassen mit ein paar kHz
auflösung und den vergleich immer im Interrupt vornehmen.
Nun habe ich ja schon einen Timer interrupt laufen, für die RTC und
Tastenentprellung.
Das würde heissen sobald das Programm startet wird immer folgendes
abgearbeitet:
Laufende Zeit auf LCD ausgeben, Restzeit auf LCD ausgeben, ADC
Interrupt, RTC Interrupt, Zeit per Uart ausgeben.
Um das Signal zu glätten addiere ich mehrere Messungen auf und Teile
dann das Ergebnis. Das währe ja auch im Interrupt kein Problem.
Jeden Interrupt die Messung addieren, zähler hochsetzen und beim
zähler-anschlag erst den Vergleich vornehmen, zähler zurücksetzen, neu
anfangen.
Spricht da irgendwas gegen, überlasten sollte das ganze den AVR ja nicht
aber könnte z.B. der ADC interrupt zusammen mit dem timer Interrupt das
Timing des LCDs aus dem Schritt bringen?
Oder hat vielleicht jemand eine ganz andere Idee?
Mfg,
Peter