Entprellung einbinden in main

Gast #3044386
Lesenswert?

Hallo,

ich möchte den Vorschlag der Tastenentprellung einbinden.
Ist es so umzusetzen: funktioniert nicht

WO LIEGT DER FEHLER

VIELEN DANK EUCH
1
char taster(void)
2
{
3
  static unsigned char zustand;
4
  char rw = 0;
5
  
6
  if(zustand == 0 && (PINA & (1<<PINA0))) 
7
  {
8
    zustand = 1;
9
    rw = 1;
10
  }
11
  else if (zustand == 1 && (PINA & (1<<PINA0)))
12
  {
13
    zustand = 2;
14
    rw = 0;
15
  }
16
  else if (zustand == 2 && !(PINA & (1<<PINA0)))
17
  {
18
    zustand = 3;
19
    rw = 0;
20
  }
21
  else if (zustand == 3 && !(PINA & (1<<PINA0))  
22
  {
23
    zustand = 0;
24
    rw = 0;
25
  }
26
  
27
  return rw;
28
}
29

30
int main(void)
31
{
32
while(1)
33
  {
34
  DDRA &= ~( 1 << PA0 );        
35
        PORTA |= ( 1 << PA0 );        
36
    
37
    if (taster)
38
    {
39
        PORTD = PORTD ^ ( 1 << PD0 );//OUTPUT
40
    }
41
}
#3044403
Lesenswert?

Diese Zustandsmaschine kommt mir aber sehr bekannt vor. Ihre 
Hauptaufgabe ist es, einen Tastendruck zu erkennen.

Eine gewünschte entprellende Wirkung basiert darauf, dass es irgendwo 
einen _delay_ms geben muss (meist am Ende der Hauptschleife), den du 
einfach weggelassen hast und damit das zentrale Element der Entprellung 
(nämlich Däumchen drehen während der Taster prellt) vernichtet hast.
Gast #3044432
Lesenswert?

Karl Heinz Buchegger schrieb:
> Diese Zustandsmaschine kommt mir aber sehr bekannt vor. Ihre
> Hauptaufgabe ist es, einen Tastendruck zu erkennen.
>
> Eine gewünschte entprellende Wirkung basiert darauf, dass es irgendwo
> einen _delay_ms geben muss (meist am Ende der Hauptschleife), den du
> einfach weggelassen hast und damit das zentrale Element der Entprellung
> (nämlich Däumchen drehen während der Taster prellt) vernichtet hast.

Es soll keine Zeit verloren gehen, deswegen soll der Zustand auf diese 
Art abgefragt werden wie von einem Beispielvorschlag von EUCH
#3044465
Lesenswert?

Kenia schrieb:

> Es soll keine Zeit verloren gehen, deswegen soll der Zustand auf diese
> Art abgefragt werden wie von einem Beispielvorschlag von EUCH

Dann musst du diesen Beispielvorschlag aber auch studieren und dir seine 
Vor und Nachteile ansehen! Insbesondere musst du dann aber auch ALLE 
notwendigen Komponenten des Beispielvorschlags übernehmen. So etwas 
funktioniert nur als Einheit und man kann nicht einfach nur die Teile 
sich rauspicken, die einem gefallen und den Rest lässt man einfach weg, 
selbst wenn er für die Funktion unabdingbar ist.

Oder warum glaubst du gibt es für jedes Problem praktisch fast immer 
mehrere mögliche Lösungen? Weil es eben DIE eierlegende Wollmilchsau 
nicht gibt. Irgendeinen Tod muss man immer sterben. Du kannst dir nur 
aussuchen welchen Tod du sterben willst.

Wenn es darauf ankommt, dass Tastendrücke zuverlässig entprellt und 
erkannt werden, OHNE das dadurch das restliche Programm merkbar 
verzögert wird, dann geht nichts über die Standard PeDa Entprellung. Für 
viele Aufgabenstellungen ist das die perfekte Lösung.
Gast #3044862
Lesenswert?

Ich verwende ein Zeitscheiben Prinzip.

Das erleichter einiges und ist deterministisch.


Pseudocode:

if(Taste is set)
{
  if(!Taste1_Flag)
  {
     Taste1_Flag = 3;
  }
}
...


Task100ms(void)
{
  if(Taste1_Flag)
  {
    Taste1_Flag--;
  }
}
#3045849
Lesenswert?

Lothar Miller schrieb:
> Bastler schrieb:
>> Ich mache eine Tastenentprellung über ein Flag, welches im Timer nach
>> ca.300ms zurückgesetzt wird.
> Du zählst also 3, 2, 1, 0. Die Tastenentprellung von Peter Dannegger
> packt 8 solcher Zähler in 2 Bytes. Cool, nicht wahr?

... und filtert kurze Störspikes auch noch aus.
Was seine Lösung nicht tut. Nach dem 4.ten Spike wird ein Tastendruck 
gemeldet.

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