mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Entprellen mit Kondensator


Autor: Nicolas Inden (freeint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine kleine Frage bezüglich Entprellung von Tastern. Das 
Tutorial hab ich mir schon angesehen, das liefert allerdings keine 
Antwort.

Es geht um Folgendes:
Ich betreibe mehrere Taster active-low an einem ATmega32. Normalerweise 
würde ich mit einem 10kOhm VCC an den Pin ziehen, und den Taster an GND 
hängen. Jetzt möchte ich diesen Taster mit einem 330nF Kondensator 
entprellen, der ja zwischen VCC und GND direkt vor dem Pin hängt. Wenn 
ich jetzt allerdings den internen PullUp verwenden möchte, habe ich vor 
dem uC kein VCC wo ich den Kondensator dranklemmen könnte. Wie mach ich 
das jetzt am besten?

Also kurz zusammengefasst:

uC mit akt. pullup -------Taster------GND
Wo hänge ich den Kond. hin, ohne extra einen externen PullUp 
dazuzubauen?

Danke euch! :D

Nico

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicolas Inden schrieb:
> Das
> Tutorial hab ich mir schon angesehen, das liefert allerdings keine
> Antwort.

Das wundert mich aber.
Die richtige Antwort sollte sein, schmeiß die Kondensatoren ganz ganz 
weit weg.


Peter

Autor: Duesendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicolas Inden schrieb:
> uC mit akt. pullup -------Taster------GND
                          +
                          ----C---------gnd

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du unbedingt Hardwareentprellung machen willst, dann nimm einen 
Taster mit Umschaltkontakten und setz ein RS-Flipflop dahinter, oder 
nimm ein Monoflop mit entsprechender Zeitkonstante oder was 1000 fach 
funktioniert und deutlich weniger aufwendig ist: mach 
Softwareentprellung wie im Tutorial.

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicolas Inden schrieb:
> uC mit akt. pullup -------Taster------GND
> Wo hänge ich den Kond. hin, ohne extra einen externen PullUp
> dazuzubauen?

Es ist irrelevant, ob der Pullup intern oder extern ist.
Kondi zwischen uC und Taster an GND.
Siehe Entprellung.

Autor: Nicolas Inden (freeint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok dann mach ich die Softwareentprellung, auch kein Problem. Mich 
interessiert die Sache mit den Kondensatoren nur, da das auf dem Pollin 
Evaluationsboard auch so umgesetzt wurde.

PS: Das Tutorial schweigt sich über Kondensatoren aus, es steht nicht 
drin, dass es nicht geht :)

Autor: Carsten Wille (eagle38106)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Taster entprellt man nicht mit parallelgeschalteten Kondensatoren. Das 
macht man mit einer Interrupt-Routine im Controller:

Der Beispielcode läuft auf einem ATmega168 mit 1MHz internem Oszillator.
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

// Set the controller fuses from the source code to avoid wrong settings.
FUSES =
{
  .low      = 0x62,               // no CKDIV8
  .high     = 0xD7,               // EESAVE
  .extended = 0xFF,               // BOOT FLASH @ $1F80 w/ 128 words
};

// Port D
#define BUTTON_INIT   (1 << 0)              // Initializes (AKA reset) measurement & EEPROM
#define BUTTON_START  (1 << 1)              // Triggers measurement cycle
#define BUTTON_PLAY   (1 << 2)              // Plays the recorded data.
#define BUTTON_msk    (BUTTON_INIT | BUTTON_START | BUTTON_PLAY)
#define JUMPER_SPEED  (1 << 3)              // Low or high speed replay
#define JUMPER_TASK   (1 << 4)              // Selects task 2 (low) or task 4 (high) mode

typedef volatile unsigned char  tVUINT8;

tVUINT8 Button  = 0;              // Debounced pushbutton/jumper information

// Timer 0 overflow interrupt service routine.
// Called every 500µs (512µs to be exact) to generate a 1000 Hz tone.

ISR (TIMER0_OVF_vect)
{
  static tUINT8  button_new = 0;
  static tUINT8  button_old = 0;
  static tUINT8  button_count = 0;
  static tUINT8  prescaler  = 1;

  // Reload the timer with -2
  TCNT0 = 0xFE; // == (tUINT8) (tINT16)(-(F_CPU / 256 * 500e-6 + 0.5));

...

  // Debouncer for pushbutton/mode switch input
  prescaler --;
  if (prescaler == 0)
  {
    prescaler = 20;                               // Do the debouncing every 10ms.

    button_new = ~PIND & BUTTON_msk;              // Only the button pins and positive logic.
    if (button_new == button_old)
    {
      // Fresh sampled buttons are the same as before
      if (button_count < 3)
        // Wait one more time before declaring the sample stable/valid.
        button_count ++;
      else if (button_count == 3)
        // Report the stable/valid sample after 40ms to the main program loop.
        Button = button_new;
    }
    else
    {
      // Last sample and this one do not match.
      button_old = button_new;
      button_count = 0;
    }
  }
}

int main (void)
{
  // Configure port pins
  DDRD = 0; // Inputs only with pullup resistors
  PORTD = BUTTON_INIT | BUTTON_START | BUTTON_PLAY | JUMPER_SPEED | JUMPER_TASK;

  // Timer 0 with 256 prescaler
  TCCR0B = (1 << CS02);
  TIMSK0 |= 1 << TOIE0;

  // Enable global interrupts;
  sei ();

  while (1)
  {
    // Place your code here
    ...
  }
}

Gruß
Carsten

Autor: Nicolas Inden (freeint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also schonmal vielen Dank für die schnellen Antworten! Ich bin gerade 
ziemlich erstaunt, wie schnell hier auf die Fragen geantwortet wird :D

Wie gesagt, die Softwareentprellung per Interrupt ist mir bekannt. Mich 
interessiert nur ob es eben auch so funktioniert.

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

Bewertung
0 lesenswert
nicht lesenswert
Nicolas Inden schrieb:
> Ok dann mach ich die Softwareentprellung, auch kein Problem. Mich
> interessiert die Sache mit den Kondensatoren nur, da das auf dem Pollin
> Evaluationsboard auch so umgesetzt wurde.
>
> PS: Das Tutorial schweigt sich über Kondensatoren aus, es steht nicht
> drin, dass es nicht geht :)

Aus gutem Grund.

> da das auf dem Pollin
> Evaluationsboard auch so umgesetzt wurde.

Im Forum finden sich viele Threads, die davon berichten dass es so wie 
auf dem Pollin Board implementiert, nicht zuverläsig geht. Der 
Kondensator bringt die Versorgungsspannung kurzzeitig zum einbrechen, 
der µC resettet.

Und ja: Es gibt auch genügend Umbauanleitungen um das Problem zu 
beheben. Die meisten drehen sich darum, den ganzen Klapperatismus 
stillzulegen und normale SW-Entprellung zu machen.

Es geht schon mit Kondensatoren. Nur ist der Aufwand hoch.

Autor: Nicolas Inden (freeint)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, damit beantwortet :)

Danke an alle!

Autor: Carsten Wille (eagle38106)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Direkt am Port-Pin sieht das Signal vom Taster ungefähr so aus...

Mit einem Kondensator parallel zum Taster sieht das Signal nicht viel 
besser aus. Beim Schließen des Tasters gibt es einen hässlichen 
Kurzschluß und beim Öffnen erzeugt man eine Kondensator-Ladekurve. Je 
nach Schaltschwelle des Eingangspins gibt das immer noch 
Mehrfach-Impulse.

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.