Programmaufbau -> ADC/Frequenz messen/Display

OP #504166
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
#504179
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;
}
OP #504193
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?

Antwort schreiben

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.

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.