mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pulse zählen ATmega in C


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe vor, Pulse zu zählen.

Mein Grundprinzip wäre: einen Interrupt auszulösen bei rising edge
(an int0) Dieser zählt dann eine countervariable hoch.

um ein Timing reinzubekommen, würde ich via timer0- interrupt über ein 
flag das zählen einschalten bzw. ausschalten.

Ziel ist, innerhalb einer(relativ langen) Zeit die Anzahl der Pulse zu 
zählen. Die Frequenz brauche ich nicht, wäre eh nur ne Umrechnung.


Gibts bessere Prinzipien?

ps. ca 3-30 Pulse innerhalb von 3 minuten.

Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst auch die Danegger'sche Debounce-Routine nehmen  und im 
Timer-Interrupt die Flanken zählen. Ich habe die mal in einer 
Decoder-Routine leicht umgeschrieben, damit die Bedeutung der Bits 
klarer wird - edge enthält eine 1 für jede Flanke auf einem Pin, 
pos_edge und neg_edge jeweils for eine positive bzw negative Flanke. Du 
brauchst nur mehr auf pos_edge zu testen, bei 1 einen Zähler hochzählen 
und das bit resetten.

Ob entprellt wird, habe ich noch optional gemacht. War experimentelles 
Erforschen eines Quadratur-Encoders, geht wunderbar. Das ganze wird bei 
mir alle 50usec aus einem Timer-Interrupt aufgerufen. Damit hast Du auch 
automatisch mehrere gleich arbeitende eingänge.

-Michael

void update_encoder()        // 1ms for manual movement
{
  static byte ct0, ct1;
  byte edge,pos_edge, neg_edge;
  char n, diff, enc_delta;

  // encoder pins changed ?
  edge = port_state ^ ~(encoder0Port & encMask);
  if (debounce) {
    ct0 = ~( ct0 & edge );                 // reset or count ct0
    ct1 = ct0 ^ (ct1 & edge);             // reset or count ct1
    edge &= ct0 & ct1;                     // count until roll over ?
  }
  port_state ^= edge;                          // then toggle debounced 
state
  pos_edge = port_state & edge;        // bit set: positive edge 
detected
  neg_edge = ~port_state & edge;      // bit set: neagtive edge detected
  ....

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
max 30 Impulse pro 3 Minuten => 10 Imp. / Min. => 6s/Imp
macht also alle 3 sec. einen Flankenwechsel.
Was für ein Tastverhältniss hast du?

Kann mann so machen. Ein ausschalten des Interrupts ist nicht nötig.
Interrupts sperren, Zähler auslesen und rücksetzen, wieder freigeben. 
Dann verpasst du keinen Interrupt.

Pollen würde aber auch gehen.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> Gibts bessere Prinzipien?
Im Prinzip schon ;)

Ne mal im Ernst, du könntest den externen Zähleingang eines der Timer 
nutzen wenn du dir das Hochzählen sparen willst, du könntest auch den 
ICP Funktion nutzen, aber für so "gemütliche" Anzahl von Pulsen reicht 
auch der Interupt, nur wenn die QUelle prellt solltest du das 
berücksichtigen.

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.