Forum: Mikrocontroller und Digitale Elektronik entprallen eines Tasters


von Mohi M. (Firma: Student) (mohi34)


Lesenswert?

könnte mir jemand sagen, was ich hier Falsch mache:
bei der Simulation wird die Anweisung "" PORTD = PIND ^ (1 << PD7);"" 
nicht ausgeführt.

Eine Hacke in PC0 irgendwie reicht nicht..????

code:

// 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;
}



void Tastergedruckt(void)
{
DDRC &= ~ (1 << PC0); // als Taster
PORTC  = (1 << PC0);  // Pull Up
if(debounce(&PINC, PC0))
{
  PORTD = PIND ^ (1 << PD7);
}
}


Danke am Voraus

von Karl H. (kbuchegg)


Lesenswert?

Mohi Mohi wrote:
> könnte mir jemand sagen, was ich hier Falsch mache:
> bei der Simulation wird die Anweisung "" PORTD = PIND ^ (1 << PD7);""
> nicht ausgeführt.

1) Woran merkst du, dass diese Anweisung nicht ausgeführt wird?
2) Es ist etwas ungewöhnlich, dass in ein und demselben Statement
   sowohl über PIN als auch über PORT auf einen Port zugegriffen
   wird.
   Wenn du den Zustand des Portpins 7 umdrehen willst, dann lautet
   das korrekterweise

   PORTD = PORTD ^ ( 1 << PD7 );

   Dazu solltest du allerdings in deinem Programm den PORTD als
   Ausgang konfigurieren

>
> Eine Hacke in PC0 irgendwie reicht nicht..????

so wie deine debounce Routine geschrieben ist: nein
Deine debounce Routine geht davon aus, dass die Taster
low aktiv sind. D.h. der Grundzustand ist: im Simulator
ist an PC0 ein Haken und wenn eine 'Taste gedrückt' werden
soll, muss der Haken weg und wieder gesetzt werden.
Die debounce Routine reagiert auf das Loslassen des Tasters.

von jessica (Gast)


Lesenswert?

nimm einfach einen 100nf parallel zum taster. dann ersparst du dir die 
sache in der software

von Karl H. (kbuchegg)


Lesenswert?

jessica wrote:
> nimm einfach einen 100nf parallel zum taster. dann ersparst du dir die
> sache in der software

Ach komm. Diese 'debounce' Routine ist alles andere als
Raktentechnik.
Wer programmieren lernen will, kommt um ein gewisses Mass
an lernen nicht rum. Dazu gehört auch, zu lernen wie man
fremden Code analysiert und zu sehen wie andere Leute sowas
machen.

Der angegbene debounce ist eher in die Kategorie 'ziemlicher
Müll' einzuordnen, da mann bei einem realen Programm das nicht
so machen wird. Als Lernbeispiel ist er aber durchaus zu gebrauchen,
und sei es nur um zu lernen, wie man mit dem Debugger in eine
Funktion einsteigt.

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.