mikrocontroller.net

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


Autor: Jens K. (jens_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Jens K. (jens_)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Frage ist nur noch wie ich meine Frequenz auswerte..

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.