www.mikrocontroller.net

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


Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael M. (Gast)
Datum:

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

entprellung liefert keinen wert zurück, 4lt0r.

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Blackbird (Gast)
Datum:

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

Blackbird

Autor: r4m0n (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Blackbird,

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

Gruß
R.

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.