Forum: Mikrocontroller und Digitale Elektronik Taster am ATmega8


von Bitterman (Gast)


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ß

von Axel G. (axelg) Benutzerseite


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

von Bitterman (Gast)


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

von Taser (Gast)


Lesenswert?

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

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.