www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tasterentprellung


Autor: robert-env (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!

ich programmiere auf mplab einen microcontroller der bezeichnung 
pic16f877a!
dabei befinden sich am port B die taster!
diese sind mit RB2, RB3, RB4 und RB5 deklariert!ich muss allerdings 
diese taster erst entprellen, wofür ich eine funktion suche, denn an 
dieser beiße ich mir zur zeit die zähne aus!

kann mir denn da jemand weiterhelfen?ich bin erst ein einsteiger und 
komm noch nicht so mit der programmierung zurecht!

mfg

robert-env

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: sechsdurchdrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wofür ich eine funktion suche, denn an
>dieser beiße ich mir zur zeit die zähne aus!

Hast du denn schon "irgendeine" Funktion, oder woran beißt du dir jetzt 
konkret die Zähne aus?

Autor: robert-env (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf der sprut-homepage war ich schon, aber da ist das meiste auch in 
assembler!
bis jetz hab ich diese anweisung geschrieben (teilweise aus dem netz und 
teilweise von mir):

//wait_for_release (PORTB,0)

void wait_for_release(char port, short pin)
{
  char x=0;
  while(x !=5)
  {
  if (!bit_test(port,pin))
    x++;
  else x=0;

  DelayMs(50);
  }
}

//wait_for_press (PORTB,0)

void wait_for_press(char port, short pin)
{
  char x=0;
  while (x!=5)
  {
  if (!bit_test(port,pin))
    x=0;

  else x++;

  DelayMs(50);
  }
}

void entprellung (void)
{
  while(1)
  {
    if (RB5==0 || RB4==0 || RB3==0 || RB2==0)
    {
    wait_for_release(port,pin);
    wait_for_press(port,pin);
    }
    else DelayMs(100);

aber das funktioniert nicht so richtig!ich bekomm immer den fehler 
"undefiniertes symbol: _bit_test"!
es muss allerdings auch nicht diese anweisung sein, über eine ganz neue 
form für eine tasterentprellung wäre ich auch nicht abgeneigt!!!!

Autor: sechsdurchdrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>"undefiniertes symbol: _bit_test"

Kommt in deinem Code Ausschnitt gar nicht vor.

Autor: robert-env (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich weiß, dass das nich vorkommt, abaer das wird nun mal 
angezeigt!ich kann den fehler auch anklicken, aber er wird mir nicht im 
programm angezeigt, wie sonst üblich...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "Universelle Tastenabfrage"

Nur Portnamen und Timerinterrupt an PIC anpassen.


Peter

Autor: robert-env (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die hilfe peter, aber das hilft mir nicht viel weiter!denn ich 
programmiere ja in mplab, also ansi c und dakomme ich mit solchen 
anweisungen wie cli() etc. nicht weiter!!

Autor: af (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>kann mir denn da jemand weiterhelfen?ich bin erst ein einsteiger und
>>komm noch nicht so mit der programmierung zurecht!

Warum realisierst du dann keine Hardwareentprellung? Ist einfacher, 
sicherer und besser in der Performance.

Autor: sechsdurchdrei (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>also ansi c und dakomme ich mit solchen
>anweisungen wie cli() etc. nicht weiter!!

Dann musst du es halt ansi-konform machen. Was macht cli()? Es wird 
einfach ein Bit im Status-Register gelöscht (Globales Interrupt-Bit). Du 
musst also bei deinem PIC nachsehen, welches Bit in welchem Register 
gelöscht werden soll.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
robert-env wrote:
> danke für die hilfe peter, aber das hilft mir nicht viel weiter!denn ich
> programmiere ja in mplab, also ansi c und dakomme ich mit solchen
> anweisungen wie cli() etc. nicht weiter!!

cli(), sei() mußt Du durch die Funktionen des PIC für Interrupt 
disable/enable ersetzen (kann durch #define erfolgen).

C ist ja portabel.
Es sind nur Kleinigkeiten, die Hardware betreffend, die angepaßt werden 
müssen.
Der Algorithmus selber ist CPU unabhängig.


Peter

Autor: Kai Franke (kai-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso denn so schwierig? Wenn dir 50ms nicht weh tun, mach es doch 
einfach so:

if (PINB.0 == 0)
{
        delay_ms(50);
        if (PINB.0 == 0 && check == 0)
        {
                // hier kommt dein Code rein
        }
}
else
{
        check = 0;
}

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.