www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster am ATmega8


Autor: Bitterman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin Anfänger und arbeite gerade das GCC-Tutorial durch.
Ich hab mir selbst ein kleines Board zusammengelötet und hab aufgrund 
vieler dummer Fehler den ganzen Tag gebraucht um die Taster zum laufen 
zu kriegen.
Ich hab aufgrund mangelnder C-Kenntnisse erstmal die Entprellung aus dem 
Tutorial so übernommen wie es da steht und versucht es zu verstehen, das 
muss erstmal reichen so. Später werde ich mich selbst mal daran 
probieren.
Nun...Die Taster funktionen und togglen dann jeweils eine LED.

Ich zitiere nochmal den Code aus dem Tutorial:

------------------------------------------------------------------------ 
---
#include <avr/io.h>
#include <inttypes.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 
definiert"
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
#endif
#include <util/delay.h>     /* bei alter avr-libc: #include 
<avr/delay.h> */
/* Einfache Funktion zum Entprellen eines Tasters */
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50);
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50);
            return 1;
        }
    }
    return 0;
}
------------------------------------------------------------------------ 
---

So...Im Turorial steht weiter unten auch, dass der Nachteil dieser 
Variante eine ca. 200ms Verzögerung ist. Man merkt das beim Tasten auch 
ganz deutlich.

Nun meine Frage, woher weiß ich die Verzögerungsdauer ?
Vielleicht stell ich mich auch blos wieder doof an. Die ergibt sich ja 
aus dem Takt und dem Delay-Wert nicht wahr ?!


Vielen Dank im Voraus.

Gruß

Autor: Axel Gartner (axelg) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun meine Frage, woher weiß ich die Verzögerungsdauer ?

>         _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
>         _delay_ms(50);
>             _delay_ms(50);
>             _delay_ms(50);
Summe: 200 ms

Du stellst dich übrigens nicht dumm an sondern machst das genau richtig. 
Tutorial durcharbeiten, ausprobieren und nachdenken, sieht doch alles 
sehr gut aus :)

Gruß
Axel

Autor: Bitterman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die schnelle Antwort.^^
Warum wurde nicht die 2x _delay_ms(100) geschrieben?
Ich nehme mal an, weil delay einen bestimmten Wertebereich hat oder?

Noch eine Frage:
Wie kommt die 262.1 ms zustande ?

Gruß
Benjamin

Autor: Taser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil 262,1 ms 3,8 Mhz ergeben und 4 Mhz ist die maximale Taktfrequenz 
des ATMEGA8
Ich weiss sogar was :)
Gruß

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.