wie nutze ich die entprellroutine von Christian Riggenbach??

Gast #1690477
Lesenswert?

Hallo Community,

Wie kann ich diese Entprellroutine (im GCC Tutorial vorgestellt)
////////
entprellung( &PINB, (1<<PINB2) );
////////

in meinem Programm nutzen? Nehmen wir an ich habe meinen Taster an PIND2 
dann würde ich doch die Entprellfunktion folgermaßen aufrufen:

entprellung( &PIND, (1<<PD2) );

Wie kann ich nun prüfen ob dieser tatsächlich gedrückt wurde um 
beispielsweise ne LED an PC5 anzuschmeissen?

ich dachte da an etwas wie

if (entprellung( &PIND, (1<<PD2) ))
> LED anschalten

ähnlich Peter Danneggers :
if( debounce( PINB, PB1 ) )
      PORTB ^= 1<<PB2;

haut aber nicht hin weil ich nen Fehler zu der Zeile mit dem IF bekomme.


Einer nen Vorschlag?

Gruß und danke!
R.
#1690484
Lesenswert?

r4m0n schrieb:

> Einer nen Vorschlag?

Ja.
Wenn du Fehler erhältst, dann lies sie. Deswegen gibt der Compiler einen 
Fehlertext, der sogar meistens mit dem Problem korelliert.

Wenn dir der Fehlertext nichts sagt, dann zeig den Code (aber nicht 
einen winzigen Ausschnitt) und den zugehörigen Fehlertext.

Oder gehst du zum Arzt und sagst: Es tut weh! Was kann das sein?
Gast #1690505
Lesenswert?

Sorry hier ist mein Code + Fehlermeldung. Die Routinen über Interrupts 
sind mit Sicherheit alle besser, jedoch etwas schwierig 
nachzuvollziehen.

Ich wollte mich erstmal so an das Thema rantasten und später bei 
besserem Verständniss umsteigen.

//////////
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#include "lcd-routines.h"

void entprellung( volatile uint8_t *port, uint8_t maske ) {
  uint8_t   port_puffer;
  uint8_t   entprellungs_puffer;

  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
    entprellungs_puffer<<=1;
    port_puffer = *port;
    _delay_us(150);
    if( (*port & maske) == (port_puffer & maske) )
      entprellungs_puffer |= 0x01;
  }
}

int main(void)
{
   DDRC |= (1 << PC5); // Set LED as Output at PC5
   DDRB |= (0 << PB1); // Set Switch PD2 as Input

   PORTC |= (1 << PC5); // Turn LED off
   PORTB |= (1 << PB1); // activate Pullup for Switch at PD2
  for(;;)
  {
    if(entprellung( &PIND, (1<<PD2) ))
  {
    PORTC ^= (1 << PC5); //toggle LED at PC5
    }
   }
}
//////////


Fehler im Compiler:

Build started 27.4.2010 at 20:28:11
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=8000000UL -Os -fsigned-char -MD -MP -MT FlowMeter.o -MF 
dep/FlowMeter.o.d  -c  ../FlowMeter.c
../FlowMeter.c: In function 'main':
../FlowMeter.c:28: error: void value not ignored as it ought to be
make: *** [FlowMeter.o] Error 1
Build failed with 1 errors and 0 warnings...
Gast #1690512
Lesenswert?

ops soll natürlich

   DDRD |= (0 << PD2); // Set Switch PD2 as Input
   PORTD |= (1 << PD2); // activate Pullup for Switch at PD2
statt
   DDRB |= (0 << PB1); // Set Switch PD2 as Input
   PORTB |= (1 << PB1); // activate Pullup for Switch at PD2
heißen...
Gast #1690527
Lesenswert?

ups²

so wirds dann wohl eher hinhauen.
  for(;;)
  {
    entprellung(&PIND, (1<<PD2) );
    if (!(PIND & 1<<PD2))
  {
    PORTC ^= (1 << PC5); //toggle LED at PC5
    }
   }

der Taster wird dann praktisch die ganze Zeit entprellt richtig?

Gruß R.
#1690559
Lesenswert?

r4m0n schrieb:
> ups²
>
> so wirds dann wohl eher hinhauen.
>   for(;;)
>   {
>     entprellung(&PIND, (1<<PD2) );
>     if (!(PIND & 1<<PD2))
>   {
>     PORTC ^= (1 << PC5); //toggle LED at PC5
>     }
>    }
>
> der Taster wird dann praktisch die ganze Zeit entprellt richtig?

Jaein.

Die Funktion entprellung wartet solange, bis sie 8 mal hintereinander 
(mit kleinen Wartezeiten dazwischen) vom Portpin denselben Wert 
eingelesen hat.

Um das Erkennen von Tastendrücken musst du dich immer noch selbst 
kümmern.
"Tastendrücken" versus ist die "Taste gedrückt"

So wie in:
Tastendrücken: Du drückst auf deiner TV Fernbedienung zwar den 
Umschaltknopf für 5 Sekunden, trotzdem schaltest du nur 1 Programm 
weiter.
Taste gedrückt: Du drückst die Taste für Rolladen hoch und solange du 
den Finger auf der Taste hast, fährt der Rolladen hoch. Nimmst du den 
Finger runter, bleibt auch der Rolladen stehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren