Forum: Compiler & IDEs wie nutze ich die entprellroutine von Christian Riggenbach??


von r4m0n (Gast)


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.

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


Lesenswert?

PS:
Nimm die auf der Seite "Entprellung" vorgestellten "Komfortroutinen", 
die mit dem Timer arbeiten. Die funktionieren am allerbesten.

von r4m0n (Gast)


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...

von r4m0n (Gast)


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...

von Michael M. (Gast)


Lesenswert?

r4m0n schrieb:
1
> void entprellung( volatile uint8_t *port, uint8_t maske ) {
passt nicht zu
1
     if(entprellung( &PIND, (1<<PD2) ))

entprellung liefert keinen wert zurück, 4lt0r.

von r4m0n (Gast)


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.

von Karl H. (kbuchegg)


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.

von Blackbird (Gast)


Lesenswert?

Sind da nicht einfach ein paar schließende geschweifte Klammern zu viel?
Zeile 28: da ist int main(void) zu Ende.

Blackbird

von r4m0n (Gast)


Lesenswert?

Hallo Blackbird,

Ich habe den Code etwas unübersichtlich reinkopiert. Bei genauerem 
Hinsehen schließen die Funktionen alle sauber ab.

Gruß
R.

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.