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


von gast (Gast)


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.

von Michael H. (mah)


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
  ....

von Volker Z. (vza)


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.

von Läubi .. (laeubi) Benutzerseite


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.

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.