Forum: Compiler & IDEs Programmaufbau -> ADC/Frequenz messen/Display


von Jens K. (jens_)


Lesenswert?

Hi!

Nachdem mir gerade schon sehr geholfen wurde, hab ich ein grundsätzliche 
Frage zu meinem geplanten Programm (nicht dass ich mich da verrene und 
mal wieder alles doppelt machen darf).
Mein Programm soll später folgendes können: (rel wenig für einen Atmega 
:) )

1. Einlesen eines Wertes über den Analogeingang
2. Eine Frequenz messen (Wie bzw wo mach ich das am besten? -> hab mir 
bisher überlegt das ganze am T1 zu machen)
3. Ausgabe der Werte wahlweise über ein Display (rel. langsam) und/oder 
RS232

Wie realisiere ich da am besten den Programmablauf?
Eine Möglichkeit wäre jedem Vorgang entsprechend Zeit zu geben (z.B. AD 
1ms, etc) und alles nacheinander abzuarbeiten.
Aber gibt es evtl "bessere"/einfachere Abläufe?

Was würdet ihr mir raten?

Ich glaube in nächster Zeit werden noch mehr Fragen von mir kommen - 
aber jeder fängt ja bekanntlicherweise mal klein an.
Danke für eure Vorschläge!

Gruß

Jens

von Karl H. (kbuchegg)


Lesenswert?

Wie hoch ist die Frequenz?

Ansonsten Standardaufbau.

Es gibt eine Hauptschleife und einzelne ISR.
Der ADC kann einen Interrupt auslösen wenn er fertig ist
und je nachdem wie du die Frequenz misst, läuft es ebenfalls
auf eine reine Interrupt Geschicht ehinaus.

Wichtig ist nur, wenn eine ISR fertig ist, dann setzt sie
eine globale Variable von 0 auf 1 um anzuzeigen, dass
sie ein Ergebnis (in anderen globalen Variablen) hinterlassen
hat, um das sich jemand kümmern müsste.

Der Kümmerer sitzt in main() und prüft ständig in einer
Schleife ob irgendeine ISR ein Ergebnis (kann auch ein
Zwischenergebnis sein) hinterlassen hat, dass man ev.
umrechnen und ausgeben müsste.

volatile uint8_t ADC_ready;
volatile uint8_t FREQ_ready;

int main()
{

   ... alles initialisieren

   while( 1 ) {

     if( ADC_ready ) {
       hol den Wert aus der globalen oder direkt vom ADC,
       umrechnen und ausgeben

       ADC_ready = 0;

       ADC neu starten wenn er nicht sowieso im Free Running
       Modus betrieben wird
     }

     if( FREQ_ready ) {
       hol die Zwischenergebnisse von der Freqeunzmessung,
       errechne daraus den Anzeigewert und
       ausgeben

       FREQ_ready = 0;
     }
   }
}

Den ADC initialisierst du so dass er einen Interrupt auslöst
wenn er fertig ist und in die ISR schreibst du

ISR( ..... )
{
  hole Wert vom ADC und hinterlasse ihn in der Globalen
  Variablen, die in main() abgefragt wird.

  ADC_ready = 1;
}

von Jens K. (jens_)


Lesenswert?

Hi!

Die Frequenz liegt zwischen 0 Hz und max. 50-100kHz denk ich.
Danke für die Hinweise - so werde ich das auch umsetzen.
Die Frage ist nur noch wie ich meine Frequenz auswerte..

MFG


P.S. Eine Frage noch zu den Interrupts: Was passiert, wenn z.b. die 
analogausgabe fertig ist und genau gleichzeitig auch noch der 
frequenzinterrupt fertig ist?

von Karl H. (kbuchegg)


Lesenswert?

> Die Frage ist nur noch wie ich meine Frequenz auswerte..

Dazu gibt es jede Woche mindestens 5 Beiträge hier im Forum :-)

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
Noch kein Account? Hier anmelden.